TCP:保证数据分组可靠送达。
若在网络传输时,没有将分组数据送达接收端,将会再次发送这个分组。
若分组到达后顺序搞乱,则TCP对接收程序透明的按正确顺序组装分组。
如果收到重复分组,则TCP放弃重复分组。
UDP:不保证分组(数据报)到达目的地或按正确顺序达到。
UDP开销很少,因为UDP数据报不需要携带TCP分组保证可靠性的信息。
UDP比TCP的网络通信流更少,因为不需要握手、重传等等。
一、UML序列图
二、核心代码
1、服务器端:
//第一步:【TcpListener】监听客户端连接
listenser = new TcpListener(new IPEndPoint(local, port));
listenser.Start();
//第二:等待连接,此处等待连接,若没有连接,线程挂起一直等待,直到接收到为止
connection = listenser.AcceptSocket();
//第三:【NetWorkStream】建立网络传输数据流
netWorkStream = new NetworkStream(connection);
//第四:【BinaryRead、BinaryWrite】建立二进制网络读写操作
read = new BinaryReader(netWorkStream);
write = new BinaryWriter(netWorkStream);
//第五:向客户端发送数据
write.Write("服务端 >> 连接成功!");
//第六:读取客户端信息(while循环接收、发送)
theReply=read.ReadString();
write.Write("服务端 >> "+inputTextBox.Text);
//第七:释放资源
write.Close();
read.Close();
netWorkStream.Close();
connection.Close();
2、客户端
//第一步:【TcpClient】访问服务端
client = new System.Net.Sockets.TcpClient();
client.Connect("127.0.0.1", port);
//第二步:【NetWorkStream】从服务器端获取网络传输数据流
netWorkStream = client.GetStream();
//第三:【BinaryRead、BinaryWrite】建立二进制网络读写操作
read = new BinaryReader(netWorkStream);
write = new BinaryWriter(netWorkStream);
//第四:读取客户端信息(循环接收、发送)
message = read.ReadString();
write.Write("客户端 >> " + inputTextBox.Text);
//第五:释放资源
write.Close();
read.Close();
netWorkStream.Close();
connection.Close();
三、示例代码
服务器端代码
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net.Sockets; 10 using System.Threading; 11 using System.IO; 12 using System.Net; 13 14 namespace TcpServer 15 { 16 public partial class CharServerForm : Form 17 { 18 19 private Socket connection; 20 private Thread readThread; 21 private NetworkStream netWorkStream; 22 private BinaryWriter write; 23 private BinaryReader read; 24 25 public CharServerForm() 26 { 27 InitializeComponent(); 28 } 29 30 private void CharServerForm_Load(object sender, EventArgs e) 31 { 32 readThread = new Thread(new ThreadStart(RunServer)); 33 readThread.Start(); 34 } 35 36 public delegate void ShowDisplayTextDelgate(string showText); 37 38 public void ShowDisplayText(string showText) 39 { 40 if (displayTextBox.InvokeRequired) 41 { 42 displayTextBox.Invoke(new ShowDisplayTextDelgate(ShowDisplayText), showText); 43 } 44 else 45 { 46 displayTextBox.Text += showText + "\r\n"; 47 48 displayTextBox.Focus();//获取焦点 49 displayTextBox.Select(displayTextBox.TextLength, 0);//光标定位到文本最后 50 displayTextBox.ScrollToCaret();//滚动到光标处 51 } 52 } 53 54 public delegate void DisableInputTextBoxDelegate(bool value); 55 public void DisableInputTextBox(bool value) 56 { 57 if (inputTextBox.InvokeRequired) 58 { 59 inputTextBox.Invoke(new DisableInputTextBoxDelegate(DisableInputTextBox), value); 60 } 61 else 62 { 63 inputTextBox.Enabled = !value; 64 btnSend.Enabled = !value; 65 btnDisConnect.Enabled = !value; 66 67 inputTextBox.ReadOnly = value; 68 69 } 70 } 71 72 //===【核心代码】========== 73 private void RunServer() 74 { 75 TcpListener listenser; 76 int count = 1; 77 78 try 79 { 80 IPAddress local = IPAddress.Parse("127.0.0.1"); 81 int port = 5000; 82 //第一步:【TcpListener】监听客户端连接 83 listenser = new TcpListener(new IPEndPoint(local, port)); 84 listenser.Start(); 85 86 while (true) 87 { 88 ShowDisplayText("等待客户端连接..."); 89 90 //第二:等待连接,此处等待连接,若没有连接,线程挂起一直等待,直到接收到为止 91 connection = listenser.AcceptSocket(); 92 //第三:【NetWorkStream】建立网络传输数据流 93 netWorkStream = new NetworkStream(connection); 94 95 //第四:【BinaryRead、BinaryWrite】建立二进制网络读写操作 96 read = new BinaryReader(netWorkStream); 97 write = new BinaryWriter(netWorkStream); 98 99 ShowDisplayText("服务端 >> 连接成功!"); 100 101 //第五:向客户端发送数据 102 write.Write("服务端 >> 连接成功!"); 103 DisableInputTextBox(false); 104 105 string theReply = ""; 106 do{ 107 try 108 { 109 //第六:读取客户端信息 110 theReply=read.ReadString(); 111 ShowDisplayText(theReply); 112 } 113 catch (Exception ex) 114 { 115 break; 116 } 117 } while (theReply != "客户端 >> 断开连接" && connection.Connected); 118 119 120 ShowDisplayText("用户已断开连接!"); 121 122 //第七:释放资源 123 write.Close(); 124 read.Close(); 125 netWorkStream.Close(); 126 connection.Close(); 127 128 DisableInputTextBox(true); 129 count++; 130 } 131 132 } 133 catch (Exception ex) 134 { 135 ShowDisplayText("错误:" + ex.Message); 136 } 137 138 139 } 140 141 private void btnSend_Click(object sender, EventArgs e) 142 { 143 try 144 { 145 if (write != null && inputTextBox.ReadOnly == false) 146 { 147 write.Write("服务端 >> "+inputTextBox.Text); 148 } 149 } 150 catch (Exception ex) 151 { 152 MessageBox.Show(ex.Message); 153 } 154 } 155 156 private void btnDisConnect_Click(object sender, EventArgs e) 157 { 158 if (connection != null) 159 { 160 write.Write("服务端 >> 断开连接"); 161 162 connection.Disconnect(false); 163 connection.Close(); 164 ShowDisplayText("已断开连接!"); 165 } 166 inputTextBox.Clear(); 167 168 } 169 170 private void CharServerForm_FormClosing(object sender, FormClosingEventArgs e) 171 { 172 System.Environment.Exit(System.Environment.ExitCode); 173 } 174 //======================== 175 } 176 }
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 using System.Net.Sockets; 10 using System.IO; 11 using System.Threading; 12 using System.Net; 13 14 namespace TcpClient 15 { 16 public partial class CharClientForm : Form 17 { 18 private Socket connection; 19 private Thread readThread; 20 private NetworkStream netWorkStream; 21 private BinaryWriter write; 22 private BinaryReader read; 23 24 private string message = ""; 25 26 public CharClientForm() 27 { 28 InitializeComponent(); 29 } 30 31 private void CharClientForm_Load(object sender, EventArgs e) 32 { 33 readThread = new Thread(new ThreadStart(RunClient)); 34 readThread.Start(); 35 } 36 37 38 39 public delegate void ShowDisplayTextDelgate(string showText); 40 41 public void ShowDisplayText(string showText) 42 { 43 if (displayTextBox.InvokeRequired) 44 { 45 displayTextBox.Invoke(new ShowDisplayTextDelgate(ShowDisplayText), showText); 46 } 47 else 48 { 49 displayTextBox.Text += showText + "\r\n"; 50 displayTextBox.Focus();//获取焦点 51 displayTextBox.Select(displayTextBox.TextLength, 0);//光标定位到文本最后 52 displayTextBox.ScrollToCaret();//滚动到光标处 53 } 54 } 55 56 public delegate void DisableInputTextBoxDelegate(bool value); 57 public void DisableInputTextBox(bool value) 58 { 59 if (inputTextBox.InvokeRequired) 60 { 61 inputTextBox.Invoke(new DisableInputTextBoxDelegate(DisableInputTextBox), value); 62 } 63 else 64 { 65 inputTextBox.Enabled = !value; 66 btnSend.Enabled = !value; 67 btnDisConnect.Enabled = !value; 68 69 inputTextBox.ReadOnly = value; 70 71 } 72 } 73 74 //===【核心代码】========== 75 public void RunClient() 76 { 77 System.Net.Sockets.TcpClient client; 78 79 try 80 { 81 82 int port = 5000; 83 84 ShowDisplayText("连接服务器端..."); 85 //第一步:【TcpClient】访问服务端 86 client = new System.Net.Sockets.TcpClient(); 87 client.Connect("127.0.0.1", port); 88 89 //第二步:【NetWorkStream】从服务器端获取网络传输数据流 90 netWorkStream = client.GetStream(); 91 92 //第三:【BinaryRead、BinaryWrite】建立二进制网络读写操作 93 read = new BinaryReader(netWorkStream); 94 write = new BinaryWriter(netWorkStream); 95 96 //ShowDisplayText("客户端 >> 连接成功!"); 97 DisableInputTextBox(false); 98 99 100 do 101 { 102 try 103 { 104 Console.WriteLine("接收到信息....."); 105 //第四:读取客户端信息 106 message = read.ReadString(); 107 ShowDisplayText(message); 108 } 109 catch (Exception ex) 110 { 111 Console.WriteLine(ex.Message); 112 System.Environment.Exit(System.Environment.ExitCode); 113 } 114 } while (message != "服务端 >> 断开连接"); 115 116 117 ShowDisplayText("用户已断开连接!"); 118 119 //第五:释放资源 120 write.Close(); 121 read.Close(); 122 netWorkStream.Close(); 123 connection.Close(); 124 125 Application.Exit(); 126 127 } 128 catch (Exception ex) 129 { 130 ShowDisplayText("错误:" + ex.Message); 131 } 132 133 134 } 135 136 private void btnSend_Click(object sender, EventArgs e) 137 { 138 try 139 { 140 if (write != null && inputTextBox.ReadOnly == false) 141 { 142 write.Write("客户端 >> " + inputTextBox.Text); 143 } 144 } 145 catch (Exception ex) 146 { 147 MessageBox.Show(ex.Message); 148 } 149 } 150 151 private void btnDisConnect_Click(object sender, EventArgs e) 152 { 153 if (write!=null) 154 { 155 write.Write("客户端 >> 断开连接"); 156 157 ShowDisplayText("已断开连接!"); 158 System.Environment.Exit(System.Environment.ExitCode); 159 } 160 161 } 162 163 private void CharClientForm_FormClosing(object sender, FormClosingEventArgs e) 164 { 165 System.Environment.Exit(System.Environment.ExitCode); 166 } 167 168 169 //======================== 170 } 171 }
运行效果:
原文:https://www.cnblogs.com/qiupiaohujie/p/11963908.html