在winform中,写一段代码,实现socket监听客户端连接请求,接收和发送数据。
时间: 2023-05-18 07:03:17 浏览: 143
以下是一个简单的示例代码,用于在WinForm中实现Socket监听客户端连接请求,接收和发送数据:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
namespace SocketDemo
{
public partial class Form1 : Form
{
private Socket serverSocket;
private byte[] buffer = new byte[1024];
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 创建Socket对象
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定IP地址和端口号
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
// 开始监听客户端连接请求
serverSocket.Listen(10);
// 异步接收客户端连接请求
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private void AcceptCallback(IAsyncResult ar)
{
// 接收到客户端连接请求后,创建新的Socket对象
Socket clientSocket = serverSocket.EndAccept(ar);
// 异步接收客户端发送的数据
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
// 继续异步接收下一个客户端连接请求
serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private void ReceiveCallback(IAsyncResult ar)
{
// 获取客户端Socket对象
Socket clientSocket = (Socket)ar.AsyncState;
// 结束异步接收操作,并获取接收到的数据长度
int length = clientSocket.EndReceive(ar);
// 如果接收到的数据长度为0,说明客户端已经关闭连接
if (length == 0)
{
clientSocket.Close();
return;
}
// 将接收到的数据转换为字符串
string message = Encoding.UTF8.GetString(buffer, 0, length);
// 显示接收到的数据
Invoke(new Action(() =>
{
listBox1.Items.Add("收到消息:" + message);
}));
// 继续异步接收客户端发送的数据
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), clientSocket);
}
private void button1_Click(object sender, EventArgs e)
{
// 获取要发送的消息
string message = textBox1.Text.Trim();
// 将消息转换为字节数组
byte[] data = Encoding.UTF8.GetBytes(message);
// 获取所有已连接的客户端Socket对象
Socket[] clientSockets = serverSocket.Select(x => x.Accepted).ToArray();
// 向每个客户端发送消息
foreach (Socket clientSocket in clientSockets)
{
clientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, null, null);
}
// 显示发送的消息
listBox1.Items.Add("发送消息:" + message);
// 清空文本框
textBox1.Clear();
}
}
}
```
这段代码实现了一个简单的Socket服务器,可以监听客户端连接请求,接收和发送数据。在窗体加载时,创建Socket对象并绑定IP地址和端口号,然后开始监听客户端连接请求。当有客户端连接时,创建新的Socket对象,并异步接收客户端发送的数据。当接收到数据时,将其转换为字符串并显示在ListBox控件中。当用户点击发送按钮时,将文本框中的消息发送给所有已连接的客户端。
阅读全文