C# 使用 Socket
C# 使用 Socket
这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.
步骤:
1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:
2.在服务端和客户端分别加入如下代码:
服务端:
- 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.Windows.Forms;
- namespace Server
- {
- public partial class Server : Form
- {
- //心跳连接socket
- private Socket udpServerSocketHeartbeat;
- //接收聊天信息的socket
- private Socket udpServerSocketRevceiveChatInfo;
- //定时刷新接收状态
- private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //服务端用来接收心跳包的 IP+端口
- private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //发送消息至客户端的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //接收聊天消息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //心跳包数据
- private byte[] buffer = new byte[1024];
- //聊天信息数据
- private byte[] chatBuffer = new byte[1024];
- //心跳包字符串数据
- private string _heartbeatString = string.Empty;
- //聊天信息数据(字符串)
- private string _chatString = string.Empty;
- //最近一次接收心跳包时间点
- private DateTime lastUpdate;
- //客户端ip+端口
- private EndPoint _clientIpPort;
- //随便定个委托
- public delegate void myDelegate();
- public Server()
- {
- InitializeComponent();
- //心跳socket,使用Udp协议
- udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- //开始定时显示接收状态
- heartbeatTimerReceive.Interval = 1000;
- heartbeatTimerReceive.AutoReset = true;
- heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);
- heartbeatTimerReceive.Start();
- //创建接收客户端消息的socket
- udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- //开始定时显示接收聊天数据
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);
- }
- }
- private void ReceiveChatInfoData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- }
- }
- private void ReceiveHeartbeatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);
- //最后一次接收数据时间点
- lastUpdate = DateTime.Now.ToUniversalTime();
- if (!this.IsDisposed)
- {
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- }
- }
- private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowHeartbeatState);
- this.label_state.Invoke(md);
- }
- private void ShowHeartbeatState()
- {
- //当前时间点-最近一次接收数据包时间点
- TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;
- //超过3秒算超时
- if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))
- {
- label_state.Text = "没有监测到客户端!";
- label_state.BackColor = Color.Red;
- }
- else
- {
- label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();
- label_state.BackColor = Color.Green;
- }
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发
- udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
客户端:
- 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.Windows.Forms;
- namespace Client
- {
- public partial class Client : Form
- {
- //定时器 定时发送心跳包
- private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();
- //心跳包服务器接收 地址+端口
- private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //客户端用来接收聊天数据的socket
- private Socket udpServerSocketReceiveChat;
- //客户端用来接收聊天信息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //保存聊天信息
- private byte[] bufferChat = new byte[1024];
- //保存服务器地址
- private EndPoint _serverIpPort;
- //聊天信息(字符串)
- private string _chatString = string.Empty;
- //定时器 刷新聊天信息
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //发送至服务器的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //随便定个委托
- public delegate void myDelegate();
- public Client()
- {
- InitializeComponent();
- //开始定时发送心跳包
- heartbeatTimer.Interval = 1000;
- heartbeatTimer.AutoReset = true;
- heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);
- heartbeatTimer.Start();
- //获取服务端聊天信息
- udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- //开始定时刷新接收到的服务端信息
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);
- }
- }
- private void ReceiveChatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _serverIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- }
- }
- private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- SendUdpPacket();
- }
- private void SendUdpPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.ASCII.GetBytes(this.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
C# 使用 Socket
一个简单示例,记录下C#中如何使用Socket:
这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.
步骤:
1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:
2.在服务端和客户端分别加入如下代码:
服务端:
- 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.Windows.Forms;
- namespace Server
- {
- public partial class Server : Form
- {
- //心跳连接socket
- private Socket udpServerSocketHeartbeat;
- //接收聊天信息的socket
- private Socket udpServerSocketRevceiveChatInfo;
- //定时刷新接收状态
- private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //服务端用来接收心跳包的 IP+端口
- private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //发送消息至客户端的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //接收聊天消息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //心跳包数据
- private byte[] buffer = new byte[1024];
- //聊天信息数据
- private byte[] chatBuffer = new byte[1024];
- //心跳包字符串数据
- private string _heartbeatString = string.Empty;
- //聊天信息数据(字符串)
- private string _chatString = string.Empty;
- //最近一次接收心跳包时间点
- private DateTime lastUpdate;
- //客户端ip+端口
- private EndPoint _clientIpPort;
- //随便定个委托
- public delegate void myDelegate();
- public Server()
- {
- InitializeComponent();
- //心跳socket,使用Udp协议
- udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- //开始定时显示接收状态
- heartbeatTimerReceive.Interval = 1000;
- heartbeatTimerReceive.AutoReset = true;
- heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);
- heartbeatTimerReceive.Start();
- //创建接收客户端消息的socket
- udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- //开始定时显示接收聊天数据
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);
- }
- }
- private void ReceiveChatInfoData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- }
- }
- private void ReceiveHeartbeatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);
- //最后一次接收数据时间点
- lastUpdate = DateTime.Now.ToUniversalTime();
- if (!this.IsDisposed)
- {
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- }
- }
- private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowHeartbeatState);
- this.label_state.Invoke(md);
- }
- private void ShowHeartbeatState()
- {
- //当前时间点-最近一次接收数据包时间点
- TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;
- //超过3秒算超时
- if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))
- {
- label_state.Text = "没有监测到客户端!";
- label_state.BackColor = Color.Red;
- }
- else
- {
- label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();
- label_state.BackColor = Color.Green;
- }
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发
- udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
客户端:
- 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.Windows.Forms;
- namespace Client
- {
- public partial class Client : Form
- {
- //定时器 定时发送心跳包
- private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();
- //心跳包服务器接收 地址+端口
- private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //客户端用来接收聊天数据的socket
- private Socket udpServerSocketReceiveChat;
- //客户端用来接收聊天信息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //保存聊天信息
- private byte[] bufferChat = new byte[1024];
- //保存服务器地址
- private EndPoint _serverIpPort;
- //聊天信息(字符串)
- private string _chatString = string.Empty;
- //定时器 刷新聊天信息
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //发送至服务器的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //随便定个委托
- public delegate void myDelegate();
- public Client()
- {
- InitializeComponent();
- //开始定时发送心跳包
- heartbeatTimer.Interval = 1000;
- heartbeatTimer.AutoReset = true;
- heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);
- heartbeatTimer.Start();
- //获取服务端聊天信息
- udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- //开始定时刷新接收到的服务端信息
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);
- }
- }
- private void ReceiveChatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _serverIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- }
- }
- private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- SendUdpPacket();
- }
- private void SendUdpPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.ASCII.GetBytes(this.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.
步骤:
1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:
2.在服务端和客户端分别加入如下代码:
服务端:
- 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.Windows.Forms;
- namespace Server
- {
- public partial class Server : Form
- {
- //心跳连接socket
- private Socket udpServerSocketHeartbeat;
- //接收聊天信息的socket
- private Socket udpServerSocketRevceiveChatInfo;
- //定时刷新接收状态
- private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //服务端用来接收心跳包的 IP+端口
- private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //发送消息至客户端的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //接收聊天消息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //心跳包数据
- private byte[] buffer = new byte[1024];
- //聊天信息数据
- private byte[] chatBuffer = new byte[1024];
- //心跳包字符串数据
- private string _heartbeatString = string.Empty;
- //聊天信息数据(字符串)
- private string _chatString = string.Empty;
- //最近一次接收心跳包时间点
- private DateTime lastUpdate;
- //客户端ip+端口
- private EndPoint _clientIpPort;
- //随便定个委托
- public delegate void myDelegate();
- public Server()
- {
- InitializeComponent();
- //心跳socket,使用Udp协议
- udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- //开始定时显示接收状态
- heartbeatTimerReceive.Interval = 1000;
- heartbeatTimerReceive.AutoReset = true;
- heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);
- heartbeatTimerReceive.Start();
- //创建接收客户端消息的socket
- udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- //开始定时显示接收聊天数据
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);
- }
- }
- private void ReceiveChatInfoData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- }
- }
- private void ReceiveHeartbeatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);
- //最后一次接收数据时间点
- lastUpdate = DateTime.Now.ToUniversalTime();
- if (!this.IsDisposed)
- {
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- }
- }
- private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowHeartbeatState);
- this.label_state.Invoke(md);
- }
- private void ShowHeartbeatState()
- {
- //当前时间点-最近一次接收数据包时间点
- TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;
- //超过3秒算超时
- if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))
- {
- label_state.Text = "没有监测到客户端!";
- label_state.BackColor = Color.Red;
- }
- else
- {
- label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();
- label_state.BackColor = Color.Green;
- }
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发
- udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
客户端:
- 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.Windows.Forms;
- namespace Client
- {
- public partial class Client : Form
- {
- //定时器 定时发送心跳包
- private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();
- //心跳包服务器接收 地址+端口
- private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //客户端用来接收聊天数据的socket
- private Socket udpServerSocketReceiveChat;
- //客户端用来接收聊天信息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //保存聊天信息
- private byte[] bufferChat = new byte[1024];
- //保存服务器地址
- private EndPoint _serverIpPort;
- //聊天信息(字符串)
- private string _chatString = string.Empty;
- //定时器 刷新聊天信息
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //发送至服务器的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //随便定个委托
- public delegate void myDelegate();
- public Client()
- {
- InitializeComponent();
- //开始定时发送心跳包
- heartbeatTimer.Interval = 1000;
- heartbeatTimer.AutoReset = true;
- heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);
- heartbeatTimer.Start();
- //获取服务端聊天信息
- udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- //开始定时刷新接收到的服务端信息
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);
- }
- }
- private void ReceiveChatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _serverIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- }
- }
- private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- SendUdpPacket();
- }
- private void SendUdpPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.ASCII.GetBytes(this.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
一个简单示例,记录下C#中如何使用Socket:
这个示例的作用是:服务端可以监测到是否和客户端连接,并且如果连上了,可以互相收发消息。如上图,我用的本机测试的,如果是不同机器且连着网,请换成对应的局域网ip或者公网映射ip.
步骤:
1.新增个空解决方案,并添加两个winform项目,一个是server端一个是client端:
2.在服务端和客户端分别加入如下代码:
服务端:
- 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.Windows.Forms;
- namespace Server
- {
- public partial class Server : Form
- {
- //心跳连接socket
- private Socket udpServerSocketHeartbeat;
- //接收聊天信息的socket
- private Socket udpServerSocketRevceiveChatInfo;
- //定时刷新接收状态
- private System.Timers.Timer heartbeatTimerReceive = new System.Timers.Timer();
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //服务端用来接收心跳包的 IP+端口
- private EndPoint receiveHeartbeat = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //发送消息至客户端的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //接收聊天消息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //心跳包数据
- private byte[] buffer = new byte[1024];
- //聊天信息数据
- private byte[] chatBuffer = new byte[1024];
- //心跳包字符串数据
- private string _heartbeatString = string.Empty;
- //聊天信息数据(字符串)
- private string _chatString = string.Empty;
- //最近一次接收心跳包时间点
- private DateTime lastUpdate;
- //客户端ip+端口
- private EndPoint _clientIpPort;
- //随便定个委托
- public delegate void myDelegate();
- public Server()
- {
- InitializeComponent();
- //心跳socket,使用Udp协议
- udpServerSocketHeartbeat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketHeartbeat.Bind(receiveHeartbeat);//本机用Bind,远程用Connect
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- //开始定时显示接收状态
- heartbeatTimerReceive.Interval = 1000;
- heartbeatTimerReceive.AutoReset = true;
- heartbeatTimerReceive.Elapsed += new System.Timers.ElapsedEventHandler(checkTimer_Elapsed);
- heartbeatTimerReceive.Start();
- //创建接收客户端消息的socket
- udpServerSocketRevceiveChatInfo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketRevceiveChatInfo.Bind(receiveChatInfoIpPort);//本机用Bind,远程用Connect
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- //开始定时显示接收聊天数据
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(showChatInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void showChatInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到客户端({0})的信息:\n{1}", _clientIpPort.ToString(),_chatString);
- }
- }
- private void ReceiveChatInfoData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(chatBuffer, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketRevceiveChatInfo.BeginReceiveFrom(chatBuffer, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatInfoData), udpServerSocketRevceiveChatInfo);
- }
- }
- private void ReceiveHeartbeatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _clientIpPort = tempRemoteEP;
- //将数据流转成字符串
- _heartbeatString = Encoding.Unicode.GetString(buffer, 0, recv);
- //最后一次接收数据时间点
- lastUpdate = DateTime.Now.ToUniversalTime();
- if (!this.IsDisposed)
- {
- udpServerSocketHeartbeat.BeginReceiveFrom(buffer, 0, 1024, SocketFlags.None, ref receiveHeartbeat, new AsyncCallback(ReceiveHeartbeatData), udpServerSocketHeartbeat);
- }
- }
- private void checkTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowHeartbeatState);
- this.label_state.Invoke(md);
- }
- private void ShowHeartbeatState()
- {
- //当前时间点-最近一次接收数据包时间点
- TimeSpan timeSinceLastHeartbeat = DateTime.Now.ToUniversalTime() - lastUpdate;
- //超过3秒算超时
- if (timeSinceLastHeartbeat > TimeSpan.FromSeconds(3))
- {
- label_state.Text = "没有监测到客户端!";
- label_state.BackColor = Color.Red;
- }
- else
- {
- label_state.Text = "已监测到客户端,ip+端口是:" + _clientIpPort.ToString();
- label_state.BackColor = Color.Green;
- }
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发
- udpClientSocket.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }
客户端:
- 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.Windows.Forms;
- namespace Client
- {
- public partial class Client : Form
- {
- //定时器 定时发送心跳包
- private System.Timers.Timer heartbeatTimer = new System.Timers.Timer();
- //心跳包服务器接收 地址+端口
- private IPEndPoint sendHeartbeatIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10000);
- //客户端用来接收聊天数据的socket
- private Socket udpServerSocketReceiveChat;
- //客户端用来接收聊天信息的ip+port
- private EndPoint receiveChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10002);
- //保存聊天信息
- private byte[] bufferChat = new byte[1024];
- //保存服务器地址
- private EndPoint _serverIpPort;
- //聊天信息(字符串)
- private string _chatString = string.Empty;
- //定时器 刷新聊天信息
- private System.Timers.Timer receiveChatInfoTimer = new System.Timers.Timer();
- //发送至服务器的ip+port
- private EndPoint sendChatInfoIpPort = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 10001);
- //随便定个委托
- public delegate void myDelegate();
- public Client()
- {
- InitializeComponent();
- //开始定时发送心跳包
- heartbeatTimer.Interval = 1000;
- heartbeatTimer.AutoReset = true;
- heartbeatTimer.Elapsed += new System.Timers.ElapsedEventHandler(heartbeatTimer_Elapsed);
- heartbeatTimer.Start();
- //获取服务端聊天信息
- udpServerSocketReceiveChat = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);
- udpServerSocketReceiveChat.Bind(receiveChatInfoIpPort);
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- //开始定时刷新接收到的服务端信息
- receiveChatInfoTimer.Interval = 1000;
- receiveChatInfoTimer.AutoReset = true;
- receiveChatInfoTimer.Elapsed += new System.Timers.ElapsedEventHandler(chartInfoTimer_Elapsed);
- receiveChatInfoTimer.Start();
- }
- private void chartInfoTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- myDelegate md = new myDelegate(ShowChatInfo);
- this.richTextBox_chatInfo.Invoke(md);
- }
- private void ShowChatInfo()
- {
- if (!string.IsNullOrEmpty(_chatString))
- {
- this.richTextBox_chatInfo.Text = string.Format("接收到服务端({0})的信息:\n{1}", _serverIpPort.ToString(), _chatString);
- }
- }
- private void ReceiveChatData(IAsyncResult ar)
- {
- // 创建ip+port
- IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
- EndPoint tempRemoteEP = (EndPoint)sender;
- //获取socket
- Socket remote = (Socket)ar.AsyncState;
- //获取客户端发来的数据(客户端ip+port在第二个参数中)
- int recv = remote.EndReceiveFrom(ar, ref tempRemoteEP);
- //客户端ip+端口
- _serverIpPort = tempRemoteEP;
- //将数据流转成字符串
- _chatString = Encoding.Unicode.GetString(bufferChat, 0, recv);
- if (!this.IsDisposed)
- {
- udpServerSocketReceiveChat.BeginReceiveFrom(bufferChat, 0, 1024, SocketFlags.None, ref receiveChatInfoIpPort, new AsyncCallback(ReceiveChatData), udpServerSocketReceiveChat);
- }
- }
- private void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
- {
- SendUdpPacket();
- }
- private void SendUdpPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.ASCII.GetBytes(this.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendHeartbeatIpPort);
- }
- private void button_send_Click(object sender, EventArgs e)
- {
- SendUdpChatPacket();
- }
- private void SendUdpChatPacket()
- {
- byte[] data = new byte[1024];
- //创建udp socket
- Socket udpClientSocketHeartbeat = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
- //字符串转成byte[] 准备发送
- data = Encoding.Unicode.GetBytes(this.textBox_sendInfo.Text);
- //发送至服务端
- udpClientSocketHeartbeat.SendTo(data, 0, data.Length, SocketFlags.None, sendChatInfoIpPort);
- }
- }
- }