TCP

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 + "
";
 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 + "
";
 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