1.基础知识
OSI(open system interconnection)模型把网络通信分成7层:物理层,数据链路层,网络层,传输层,会话层,表示层,和应用层。
网络开发人员一般分成5层 应用层 传输层 网络层 数据链路层 物理层
2.基于TCP的网络程序的实现
tcp的工作过程可以划分为3个阶段:连接的建立,传输数据和断开连接。
TCP的连接建立是通过3次握手最终完成的。
tpc 服务器和客户端代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
private int port = 5000;
private TcpClient tcpClient = null;
IPAddress ipaddress;
private NetworkStream networkStream = null;
private BinaryReader reader;
private BinaryWriter writer;
//声明委托
private delegate void ShowMessage(string str);
private ShowMessage showMessageCallback;
private delegate void ResetMessage();
private ResetMessage resetMessageCallback;
public Form1()
{
InitializeComponent();
showMessageCallback = new ShowMessage(showMessage);
resetMessageCallback = new ResetMessage(restMessage);
ipaddress = IPAddress.Loopback;
this.textBox_ip.Text = ipaddress.ToString();
this.textBox_port_id.Text = port.ToString();
}
private void showMessage(string str)
{
listBox1.Items.Add(tcpClient.Client.RemoteEndPoint);
listBox1.Items.Add(str);
listBox1.TopIndex = listBox1.Items.Count - 1;
}
private void restMessage()
{
textBox1.Text = string.Empty;
textBox1.Focus();
}
private void button_start_Click(object sender, EventArgs e)
{
Thread accept_thread = new Thread(acceptClientConnet);
accept_thread.Start();
}
private void acceptClientConnet()
{
try
{
IPAddress iPAddress = IPAddress.Parse(textBox_ip.Text);
tcpClient = new TcpClient();
tcpClient.Connect(iPAddress, int.Parse(textBox_port_id.Text));
if (tcpClient != null)
{
listBox1.Invoke(showMessageCallback, "接收到连接");
networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
writer = new BinaryWriter(networkStream);
}
}
catch
{
listBox1.Invoke(showMessageCallback, "链接失败");
}
}
private void button_clear_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void button_receive_Click(object sender, EventArgs e)
{
Thread receive_mes = new Thread(ReceiveMessage);
receive_mes.Start();
}
private void ReceiveMessage()
{
try
{
string receive_message = reader.ReadString();
listBox1.Invoke(showMessageCallback, receive_message);
}
catch
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
}
}
private void button_send_Click(object sender, EventArgs e)
{
Thread send_thread = new Thread(SendMessage);
send_thread.Start(textBox1.Text);
}
private void SendMessage(object state)
{
listBox1.Invoke(showMessageCallback, "正在发送");
try
{
writer.Write(state.ToString());
Thread.Sleep(500);
writer.Flush();
listBox1.Invoke(showMessageCallback, "发送完毕");
textBox1.Invoke(resetMessageCallback, null);
listBox1.Invoke(showMessageCallback, state.ToString());
}
catch
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
listBox1.Invoke(showMessageCallback, "链接断开了");
}
}
private void button_disconnect_Click(object sender, EventArgs e)
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
listBox1.Invoke(showMessageCallback, "链接断开了");
}
}
}
//客户端
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{
private int port = 5000;
private TcpClient tcpClient = null;
IPAddress ipaddress;
private NetworkStream networkStream = null;
private BinaryReader reader;
private BinaryWriter writer;
//声明委托
private delegate void ShowMessage(string str);
private ShowMessage showMessageCallback;
private delegate void ResetMessage();
private ResetMessage resetMessageCallback;
public Form1()
{
InitializeComponent();
showMessageCallback = new ShowMessage(showMessage);
resetMessageCallback = new ResetMessage(restMessage);
ipaddress = IPAddress.Loopback;
this.textBox_ip.Text = ipaddress.ToString();
this.textBox_port_id.Text = port.ToString();
}
private void showMessage(string str)
{
listBox1.Items.Add(tcpClient.Client.RemoteEndPoint);
listBox1.Items.Add(str);
listBox1.TopIndex = listBox1.Items.Count - 1;
}
private void restMessage()
{
textBox1.Text = string.Empty;
textBox1.Focus();
}
private void button_start_Click(object sender, EventArgs e)
{
Thread accept_thread = new Thread(acceptClientConnet);
accept_thread.Start();
}
private void acceptClientConnet()
{
try
{
IPAddress iPAddress = IPAddress.Parse(textBox_ip.Text);
tcpClient = new TcpClient();
tcpClient.Connect(iPAddress, int.Parse(textBox_port_id.Text));
if (tcpClient != null)
{
listBox1.Invoke(showMessageCallback, "接收到连接");
networkStream = tcpClient.GetStream();
reader = new BinaryReader(networkStream);
writer = new BinaryWriter(networkStream);
}
}
catch
{
listBox1.Invoke(showMessageCallback, "链接失败");
}
}
private void button_clear_Click(object sender, EventArgs e)
{
listBox1.Items.Clear();
}
private void button_receive_Click(object sender, EventArgs e)
{
Thread receive_mes = new Thread(ReceiveMessage);
receive_mes.Start();
}
private void ReceiveMessage()
{
try
{
string receive_message = reader.ReadString();
listBox1.Invoke(showMessageCallback, receive_message);
}
catch
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
}
}
private void button_send_Click(object sender, EventArgs e)
{
Thread send_thread = new Thread(SendMessage);
send_thread.Start(textBox1.Text);
}
private void SendMessage(object state)
{
listBox1.Invoke(showMessageCallback, "正在发送");
try
{
writer.Write(state.ToString());
Thread.Sleep(500);
writer.Flush();
listBox1.Invoke(showMessageCallback, "发送完毕");
textBox1.Invoke(resetMessageCallback, null);
listBox1.Invoke(showMessageCallback, state.ToString());
}
catch
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
listBox1.Invoke(showMessageCallback, "链接断开了");
}
}
private void button_disconnect_Click(object sender, EventArgs e)
{
if (reader != null)
{
reader.Close();
}
if (writer != null)
{
writer.Close();
}
if (tcpClient != null)
{
tcpClient.Close();
}
listBox1.Invoke(showMessageCallback, "链接断开了");
}
}
}
//UDP
Tcp 是一种面向连接的可靠的,面向字节流的传输协议;而udp是一种简单的
面向数据包的无连接协议是一种不可靠的传输服务。
udp的传输速度比tcp快
udp有消息边界
udp可以进行1对多的传输
// udp 我测试怎么是单向传输呢,后面有空再测试
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace upd
{
public partial class Form1 : Form
{
private UdpClient send_udp_client_;
private UdpClient receive_udp_client_;
public Form1()
{
InitializeComponent();
IPAddress[] ips = Dns.GetHostAddresses("");
foreach (var ip in ips)
{
if(ip.ToString().Contains("192"))
{
textBox_local_ip.Text = ip.ToString();
textBox_remote_ip.Text = ip.ToString();
break;
}
}
int port = 51883;
int send_port = 11883;
textBox_local_port.Text = port.ToString();
textBox_remote_port.Text = send_port.ToString();
}
private void button_send_Click(object sender, EventArgs e)
{
if(textBox_send.Text == string.Empty)
{
MessageBox.Show("发送内容不能为空","提示");
return;
}
IPAddress local_ip = IPAddress.Parse(textBox_local_ip.Text);
IPEndPoint local_ip_end_point = new IPEndPoint(local_ip, int.Parse(textBox_local_port.Text));
send_udp_client_ = new UdpClient(local_ip_end_point);
Thread send_thread = new Thread(SendMessage);
send_thread.Start(textBox_send.Text);
}
private void SendMessage(object obj)
{
string message = (string)obj;
byte[] send_bytes = Encoding.Unicode.GetBytes(message);
IPAddress remote_ip = IPAddress.Parse(textBox_remote_ip.Text);
IPEndPoint remote_ip_end_point = new IPEndPoint(remote_ip, int.Parse(textBox_remote_port.Text));
send_udp_client_.Send(send_bytes, send_bytes.Length, remote_ip_end_point);
textBox_send.BeginInvoke((Action)delegate
{
textBox_send.Clear();
textBox_send.Focus();
});
}
private void button2_Click(object sender, EventArgs e)//receive
{
IPAddress local_ip = IPAddress.Parse(textBox_local_ip.Text);
IPEndPoint local_ip_end_point = new IPEndPoint(local_ip, int.Parse(textBox_local_port.Text));
try
{
receive_udp_client_ = new UdpClient(local_ip_end_point);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Thread receiveThread = new Thread(ReceiveMessage);
receiveThread.Start();
}
private void ReceiveMessage()
{
if (receive_udp_client_ == null)
return;
IPEndPoint remote_ip_end_point = new IPEndPoint(IPAddress.Any,0);
while(true)
{
try
{
byte[] receive_bytes = receive_udp_client_.Receive(ref remote_ip_end_point);
string msg = Encoding.Unicode.GetString(receive_bytes);
listBox_receive.BeginInvoke((Action)delegate
{
listBox_receive.Items.Add(string.Format("{0}[{1}]", remote_ip_end_point, msg));
});
}
catch
{
break;
}
}
}
private void button_clear_Click(object sender, EventArgs e)
{
this.listBox_receive.Items.Clear();
}
private void button_stop_Click(object sender, EventArgs e)
{
receive_udp_client_.Close();
}
}
}