C# 使用 Socket



C# 使用 Socket


这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.

步骤:

1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:


2.在服务端和客户端分别加入如下代码:

服务端:

[csharp]  view plain  copy
  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.Net;  
  8. using System.Net.Sockets;  
  9. using System.Text;  
  10. using System.Windows.Forms;  
  11.   
  12. namespace Server  
  13. {  
  14.     public partial class Server : Form  
  15.     {  
  16.         //心跳连接socket  
  17.         private Socket udpServerSocketHeartbeat;  
  18.         //接收聊天信息的socket  
  19.         private Socket udpServerSocketRevceiveChatInfo;  
  20.         //定时刷新接收状态  
  21.         private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();  
  22.         private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();  
  23.         //服务端用来接收心跳包的 IP+端口  
  24.         private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);  
  25.         //发送消息至客户端的ip+port  
  26.         private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);  
  27.         //接收聊天消息的ip+port  
  28.         private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);  
  29.         //心跳包数据  
  30.         private byte[] buffer = new byte[1024];  
  31.         //聊天信息数据  
  32.         private byte[] chatBuffer = new byte[1024];  
  33.         //心跳包字符串数据  
  34.         private string _heartbeatString = string.Empty;  
  35.         //聊天信息数据(字符串)  
  36.         private string _chatString = string.Empty;  
  37.   
  38.         //最近一次接收心跳包时间点  
  39.         private DateTime lastUpdate;  
  40.         //客户端ip+端口  
  41.         private EndPoint _clientIpPort;  
  42.         //随便定个委托  
  43.         public delegate void myDelegate();  
  44.   
  45.         public Server()  
  46.         {  
  47.             InitializeComponent();  
  48.   
  49.             //心跳socket,使用Udp协议  
  50.             udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);  
  51.             udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect  
  52.             udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);  
  53.             //开始定时显示接收状态  
  54.             heartbeatTimerReceive.Interval = 1000;  
  55.             heartbeatTimerReceive.AutoReset = true;  
  56.             heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);  
  57.             heartbeatTimerReceive.Start();  
  58.             //创建接收客户端消息的socket  
  59.             udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  60.             udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect  
  61.             udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);  
  62.             //开始定时显示接收聊天数据  
  63.             receiveChatInfoTimer.Interval = 1000;  
  64.             receiveChatInfoTimer.AutoReset = true;  
  65.             receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);  
  66.             receiveChatInfoTimer.Start();  
  67.         }  
  68.   
  69.         private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  70.         {  
  71.             myDelegate md = new myDelegate(ShowChatInfo);  
  72.             this.richTextBox_chatInfo.Invoke(md);  
  73.         }  
  74.   
  75.         private void ShowChatInfo()  
  76.         {  
  77.             if (!string.IsNullOrEmpty(_chatString))  
  78.             {  
  79.                 this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);  
  80.             }  
  81.         }  
  82.   
  83.         private void ReceiveChatInfoData(IAsyncResult ar)  
  84.         {  
  85.             // 创建ip+port  
  86.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  87.             EndPoint tempRemoteEP = (EndPoint)sender;  
  88.   
  89.             //获取socket  
  90.             Socket remote = (Socket)ar.AsyncState;  
  91.   
  92.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  93.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  94.   
  95.             //客户端ip+端口  
  96.             _clientIpPort = tempRemoteEP;  
  97.   
  98.             //将数据流转成字符串  
  99.             _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);  
  100.   
  101.               
  102.             if (!this.IsDisposed)  
  103.             {  
  104.                 udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);  
  105.             }  
  106.         }  
  107.   
  108.         private void ReceiveHeartbeatData(IAsyncResult ar)  
  109.         {              
  110.             // 创建ip+port  
  111.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  112.             EndPoint tempRemoteEP = (EndPoint)sender;  
  113.   
  114.             //获取socket  
  115.             Socket remote = (Socket)ar.AsyncState;  
  116.   
  117.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  118.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  119.   
  120.             //客户端ip+端口  
  121.             _clientIpPort = tempRemoteEP;  
  122.   
  123.             //将数据流转成字符串  
  124.             _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);  
  125.   
  126.   
  127.             //最后一次接收数据时间点  
  128.             lastUpdate = DateTime.Now.ToUniversalTime();  
  129.               
  130.             if (!this.IsDisposed)  
  131.             {  
  132.                 udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);  
  133.             }  
  134.         }  
  135.         private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  136.         {  
  137.             myDelegate md = new myDelegate(ShowHeartbeatState);  
  138.             this.label_state.Invoke(md);  
  139.         }  
  140.   
  141.         private void ShowHeartbeatState()  
  142.         {  
  143.             //当前时间点-最近一次接收数据包时间点  
  144.             TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;  
  145.   
  146.             //超过3秒算超时  
  147.             if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))  
  148.             {  
  149.                 label_state.Text = "没有监测到客户端!";  
  150.                 label_state.BackColor = Color.Red;  
  151.             }  
  152.             else  
  153.             {  
  154.                 label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();  
  155.                 label_state.BackColor = Color.Green;  
  156.             }  
  157.         }  
  158.   
  159.         private void button_send_Click(object sender, EventArgs e)  
  160.         {  
  161.             SendUdpChatPacket();  
  162.         }  
  163.   
  164.         private void SendUdpChatPacket()  
  165.         {  
  166.             byte[] data = new byte[1024];  
  167.   
  168.             //创建udp socket  
  169.             Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  170.   
  171.             //字符串转byte[] 准备发送  
  172.             data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);  
  173.   
  174.             //发  
  175.             udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);  
  176.         }  
  177.   
  178.     }  
  179. }  

客户端:

[csharp]  view plain  copy
  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.Net;  
  8. using System.Net.Sockets;  
  9. using System.Text;  
  10. using System.Windows.Forms;  
  11.   
  12. namespace Client  
  13. {  
  14.     public partial class Client : Form  
  15.     {  
  16.         //定时器 定时发送心跳包  
  17.         private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();  
  18.         //心跳包服务器接收 地址+端口  
  19.         private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);          
  20.         //客户端用来接收聊天数据的socket  
  21.         private Socket udpServerSocketReceiveChat;  
  22.         //客户端用来接收聊天信息的ip+port  
  23.         private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);  
  24.         //保存聊天信息  
  25.         private byte[] bufferChat = new byte[1024];  
  26.         //保存服务器地址  
  27.         private EndPoint _serverIpPort;  
  28.         //聊天信息(字符串)  
  29.         private string _chatString = string.Empty;  
  30.         //定时器 刷新聊天信息  
  31.         private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();  
  32.         //发送至服务器的ip+port  
  33.         private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);  
  34.         //随便定个委托  
  35.         public delegate void myDelegate();  
  36.   
  37.         public Client()  
  38.         {  
  39.             InitializeComponent();  
  40.   
  41.             //开始定时发送心跳包  
  42.             heartbeatTimer.Interval = 1000;  
  43.             heartbeatTimer.AutoReset = true;  
  44.             heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);  
  45.             heartbeatTimer.Start();  
  46.   
  47.             //获取服务端聊天信息  
  48.             udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);  
  49.             udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);  
  50.             udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);  
  51.   
  52.             //开始定时刷新接收到的服务端信息  
  53.             receiveChatInfoTimer.Interval = 1000;  
  54.             receiveChatInfoTimer.AutoReset = true;  
  55.             receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);  
  56.             receiveChatInfoTimer.Start();  
  57.         }  
  58.   
  59.         private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  60.         {  
  61.             myDelegate md = new myDelegate(ShowChatInfo);  
  62.             this.richTextBox_chatInfo.Invoke(md);  
  63.         }  
  64.   
  65.         private void ShowChatInfo()  
  66.         {  
  67.             if (!string.IsNullOrEmpty(_chatString))  
  68.             {  
  69.                 this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);  
  70.             }  
  71.         }  
  72.   
  73.         private void ReceiveChatData(IAsyncResult ar)  
  74.         {  
  75.             // 创建ip+port  
  76.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  77.             EndPoint tempRemoteEP = (EndPoint)sender;  
  78.   
  79.             //获取socket  
  80.             Socket remote = (Socket)ar.AsyncState;  
  81.   
  82.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  83.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  84.   
  85.             //客户端ip+端口  
  86.             _serverIpPort = tempRemoteEP;  
  87.   
  88.             //将数据流转成字符串  
  89.             _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);  
  90.               
  91.             if (!this.IsDisposed)  
  92.             {  
  93.                 udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);  
  94.             }  
  95.         }  
  96.   
  97.         private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  98.         {  
  99.             SendUdpPacket();  
  100.         }  
  101.   
  102.         private void SendUdpPacket()  
  103.         {  
  104.             byte[] data = new byte[1024];  
  105.   
  106.             //创建udp socket  
  107.             Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  108.   
  109.             //字符串转成byte[] 准备发送  
  110.             data = Encoding.ASCII.GetBytes(this.Text);  
  111.   
  112.             //发送至服务端  
  113.             udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);  
  114.         }  
  115.   
  116.         private void button_send_Click(object sender, EventArgs e)  
  117.         {  
  118.             SendUdpChatPacket();  
  119.         }  
  120.   
  121.         private void SendUdpChatPacket()  
  122.         {  
  123.             byte[] data = new byte[1024];  
  124.   
  125.             //创建udp socket  
  126.             Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  127.   
  128.             //字符串转成byte[] 准备发送  
  129.             data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);  
  130.   
  131.             //发送至服务端  
  132.             udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);  
  133.         }  
  134.   
  135.   
  136.     }  
  137. }  

C# 使用 Socket

一个简单示例,记录下C#中如何使用Socket:


这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.

步骤:

1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:


2.在服务端和客户端分别加入如下代码:

服务端:

[csharp]  view plain  copy
  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.Net;  
  8. using System.Net.Sockets;  
  9. using System.Text;  
  10. using System.Windows.Forms;  
  11.   
  12. namespace Server  
  13. {  
  14.     public partial class Server : Form  
  15.     {  
  16.         //心跳连接socket  
  17.         private Socket udpServerSocketHeartbeat;  
  18.         //接收聊天信息的socket  
  19.         private Socket udpServerSocketRevceiveChatInfo;  
  20.         //定时刷新接收状态  
  21.         private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();  
  22.         private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();  
  23.         //服务端用来接收心跳包的 IP+端口  
  24.         private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);  
  25.         //发送消息至客户端的ip+port  
  26.         private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);  
  27.         //接收聊天消息的ip+port  
  28.         private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);  
  29.         //心跳包数据  
  30.         private byte[] buffer = new byte[1024];  
  31.         //聊天信息数据  
  32.         private byte[] chatBuffer = new byte[1024];  
  33.         //心跳包字符串数据  
  34.         private string _heartbeatString = string.Empty;  
  35.         //聊天信息数据(字符串)  
  36.         private string _chatString = string.Empty;  
  37.   
  38.         //最近一次接收心跳包时间点  
  39.         private DateTime lastUpdate;  
  40.         //客户端ip+端口  
  41.         private EndPoint _clientIpPort;  
  42.         //随便定个委托  
  43.         public delegate void myDelegate();  
  44.   
  45.         public Server()  
  46.         {  
  47.             InitializeComponent();  
  48.   
  49.             //心跳socket,使用Udp协议  
  50.             udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);  
  51.             udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect  
  52.             udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);  
  53.             //开始定时显示接收状态  
  54.             heartbeatTimerReceive.Interval = 1000;  
  55.             heartbeatTimerReceive.AutoReset = true;  
  56.             heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);  
  57.             heartbeatTimerReceive.Start();  
  58.             //创建接收客户端消息的socket  
  59.             udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  60.             udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect  
  61.             udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);  
  62.             //开始定时显示接收聊天数据  
  63.             receiveChatInfoTimer.Interval = 1000;  
  64.             receiveChatInfoTimer.AutoReset = true;  
  65.             receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);  
  66.             receiveChatInfoTimer.Start();  
  67.         }  
  68.   
  69.         private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  70.         {  
  71.             myDelegate md = new myDelegate(ShowChatInfo);  
  72.             this.richTextBox_chatInfo.Invoke(md);  
  73.         }  
  74.   
  75.         private void ShowChatInfo()  
  76.         {  
  77.             if (!string.IsNullOrEmpty(_chatString))  
  78.             {  
  79.                 this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);  
  80.             }  
  81.         }  
  82.   
  83.         private void ReceiveChatInfoData(IAsyncResult ar)  
  84.         {  
  85.             // 创建ip+port  
  86.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  87.             EndPoint tempRemoteEP = (EndPoint)sender;  
  88.   
  89.             //获取socket  
  90.             Socket remote = (Socket)ar.AsyncState;  
  91.   
  92.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  93.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  94.   
  95.             //客户端ip+端口  
  96.             _clientIpPort = tempRemoteEP;  
  97.   
  98.             //将数据流转成字符串  
  99.             _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);  
  100.   
  101.               
  102.             if (!this.IsDisposed)  
  103.             {  
  104.                 udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);  
  105.             }  
  106.         }  
  107.   
  108.         private void ReceiveHeartbeatData(IAsyncResult ar)  
  109.         {              
  110.             // 创建ip+port  
  111.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  112.             EndPoint tempRemoteEP = (EndPoint)sender;  
  113.   
  114.             //获取socket  
  115.             Socket remote = (Socket)ar.AsyncState;  
  116.   
  117.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  118.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  119.   
  120.             //客户端ip+端口  
  121.             _clientIpPort = tempRemoteEP;  
  122.   
  123.             //将数据流转成字符串  
  124.             _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);  
  125.   
  126.   
  127.             //最后一次接收数据时间点  
  128.             lastUpdate = DateTime.Now.ToUniversalTime();  
  129.               
  130.             if (!this.IsDisposed)  
  131.             {  
  132.                 udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);  
  133.             }  
  134.         }  
  135.         private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  136.         {  
  137.             myDelegate md = new myDelegate(ShowHeartbeatState);  
  138.             this.label_state.Invoke(md);  
  139.         }  
  140.   
  141.         private void ShowHeartbeatState()  
  142.         {  
  143.             //当前时间点-最近一次接收数据包时间点  
  144.             TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;  
  145.   
  146.             //超过3秒算超时  
  147.             if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))  
  148.             {  
  149.                 label_state.Text = "没有监测到客户端!";  
  150.                 label_state.BackColor = Color.Red;  
  151.             }  
  152.             else  
  153.             {  
  154.                 label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();  
  155.                 label_state.BackColor = Color.Green;  
  156.             }  
  157.         }  
  158.   
  159.         private void button_send_Click(object sender, EventArgs e)  
  160.         {  
  161.             SendUdpChatPacket();  
  162.         }  
  163.   
  164.         private void SendUdpChatPacket()  
  165.         {  
  166.             byte[] data = new byte[1024];  
  167.   
  168.             //创建udp socket  
  169.             Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  170.   
  171.             //字符串转byte[] 准备发送  
  172.             data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);  
  173.   
  174.             //发  
  175.             udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);  
  176.         }  
  177.   
  178.     }  
  179. }  

客户端:

[csharp]  view plain  copy
  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.Net;  
  8. using System.Net.Sockets;  
  9. using System.Text;  
  10. using System.Windows.Forms;  
  11.   
  12. namespace Client  
  13. {  
  14.     public partial class Client : Form  
  15.     {  
  16.         //定时器 定时发送心跳包  
  17.         private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();  
  18.         //心跳包服务器接收 地址+端口  
  19.         private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);          
  20.         //客户端用来接收聊天数据的socket  
  21.         private Socket udpServerSocketReceiveChat;  
  22.         //客户端用来接收聊天信息的ip+port  
  23.         private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);  
  24.         //保存聊天信息  
  25.         private byte[] bufferChat = new byte[1024];  
  26.         //保存服务器地址  
  27.         private EndPoint _serverIpPort;  
  28.         //聊天信息(字符串)  
  29.         private string _chatString = string.Empty;  
  30.         //定时器 刷新聊天信息  
  31.         private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();  
  32.         //发送至服务器的ip+port  
  33.         private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);  
  34.         //随便定个委托  
  35.         public delegate void myDelegate();  
  36.   
  37.         public Client()  
  38.         {  
  39.             InitializeComponent();  
  40.   
  41.             //开始定时发送心跳包  
  42.             heartbeatTimer.Interval = 1000;  
  43.             heartbeatTimer.AutoReset = true;  
  44.             heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);  
  45.             heartbeatTimer.Start();  
  46.   
  47.             //获取服务端聊天信息  
  48.             udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);  
  49.             udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);  
  50.             udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);  
  51.   
  52.             //开始定时刷新接收到的服务端信息  
  53.             receiveChatInfoTimer.Interval = 1000;  
  54.             receiveChatInfoTimer.AutoReset = true;  
  55.             receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);  
  56.             receiveChatInfoTimer.Start();  
  57.         }  
  58.   
  59.         private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  60.         {  
  61.             myDelegate md = new myDelegate(ShowChatInfo);  
  62.             this.richTextBox_chatInfo.Invoke(md);  
  63.         }  
  64.   
  65.         private void ShowChatInfo()  
  66.         {  
  67.             if (!string.IsNullOrEmpty(_chatString))  
  68.             {  
  69.                 this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);  
  70.             }  
  71.         }  
  72.   
  73.         private void ReceiveChatData(IAsyncResult ar)  
  74.         {  
  75.             // 创建ip+port  
  76.             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);  
  77.             EndPoint tempRemoteEP = (EndPoint)sender;  
  78.   
  79.             //获取socket  
  80.             Socket remote = (Socket)ar.AsyncState;  
  81.   
  82.             //获取客户端发来的数据(客户端ip+port在第二个参数中)  
  83.             int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);  
  84.   
  85.             //客户端ip+端口  
  86.             _serverIpPort = tempRemoteEP;  
  87.   
  88.             //将数据流转成字符串  
  89.             _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);  
  90.               
  91.             if (!this.IsDisposed)  
  92.             {  
  93.                 udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);  
  94.             }  
  95.         }  
  96.   
  97.         private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)  
  98.         {  
  99.             SendUdpPacket();  
  100.         }  
  101.   
  102.         private void SendUdpPacket()  
  103.         {  
  104.             byte[] data = new byte[1024];  
  105.   
  106.             //创建udp socket  
  107.             Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  108.   
  109.             //字符串转成byte[] 准备发送  
  110.             data = Encoding.ASCII.GetBytes(this.Text);  
  111.   
  112.             //发送至服务端  
  113.             udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);  
  114.         }  
  115.   
  116.         private void button_send_Click(object sender, EventArgs e)  
  117.         {  
  118.             SendUdpChatPacket();  
  119.         }  
  120.   
  121.         private void SendUdpChatPacket()  
  122.         {  
  123.             byte[] data = new byte[1024];  
  124.   
  125.             //创建udp socket  
  126.             Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);  
  127.   
  128.             //字符串转成byte[] 准备发送  
  129.             data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);  
  130.   
  131.             //发送至服务端  
  132.             udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);  
  133.         }  
  134.   
  135.   
  136.     }  
  137. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值