以一些示例,记录 C# 中如何使用Socket:
目录
1.第一个示例,使用.net 自带的 Socket 纯手工写 (Udp协议)
2.第二个示例,使用.net 自带的 Socket 纯手工写 (Tcp协议)
1.第一个示例,使用.net 自带的 Socket 纯手工写 (Udp协议)
这个方式灵活性高,但不建议使用:
这个示例的作用是:服务端和客户端,可以互相收发消息,如上图。我用的本机测试的,所以用了两个端口来监听。如果是不同机器且连着内网或公网,只需一个监听端口,但要换成对应的局域网ip或者公网映射ip.
步骤:
1.新增个空解决方案,并添加两个winform项目,一个是 server 端一个是 client 端:
2.在服务端和客户端分别加入如下代码:
服务端:
public partial class Server : Form
{
private readonly Socket _listenSocket;
private EndPoint _listenPort = new IPEndPoint(IPAddress.Any, 7942);
private EndPoint _testClientPort = new IPEndPoint(IPAddress.Parse("192.168.2.32"), 7943);
//数据
private byte[] _buffer = new byte[1024];
//数据(字符串)
private string _chatString = string.Empty;
//客户端ip+端口
private EndPoint _clientIpPort;
//定个委托
public delegate void ShowDataDelegate();
public Server()
{
InitializeComponent();
_listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_listenSocket.Bind(_listenPort);//本机用Bind,远程用Connect
_listenSocket.BeginReceiveFrom(_buffer, 0, 1024, SocketFlags.None, ref _listenPort, ReceiveData, _listenSocket);
}
private void ShowData()
{
if (!string.IsNullOrEmpty(_chatString))
{
this.richTextBox.AppendText($"客户端({_clientIpPort}): {_chatString}\n");
}
}
private void ReceiveData(IAsyncResult ar)
{
// 创建ip+port
var sender = new IPEndPoint(IPAddress.Any, 0);
var tempRemoteEp = (EndPoint)sender;
//获取socket
var socket = (Socket)ar.AsyncState;
//获取客户端发来的数据(客户端ip+port在第二个参数中)
var recv = socket.EndReceiveFrom(ar, ref tempRemoteEp);
//客户端ip+端口
_clientIpPort = tempRemoteEp;
//将数据流转成字符串
_chatString = Encoding.Unicode.GetString(_buffer, 0, recv);
richTextBox.Invoke(new ShowDataDelegate(ShowData));
if (!this.IsDisposed)
{
_listenSocket.BeginReceiveFrom(_buffer, 0, 1024, SocketFlags.None, ref _listenPort, ReceiveData, _listenSocket);
}
}
private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(textBox1.Text))
{
var newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
var response = Encoding.Unicode.GetBytes(textBox1.Text);
newSocket.SendTo(response, 0, response.Length, SocketFlags.None, _testClientPort);
this.richTextBox.AppendText($"服务器(本地): {textBox1.Text}\n");
}
}
}
客户端:
public partial class Client : Form
{
//客户端用来接收数据的socket
private readonly Socket _listenSocket;
private EndPoint _listenPort = new IPEndPoint(IP