winform 使socket用异步的方式创建tcpip服务端
时间: 2024-01-25 08:04:08 浏览: 72
C# Socket通信(winform) 异步发送消息,服务端客户端通信,可以发送消息和文件并进行接收
5星 · 资源好评率100%
可以使用异步方式创建TCP/IP服务端,下面给出示例代码:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AsyncTcpServer
{
public partial class MainForm : Form
{
private TcpListener listener;
private Task listeningTask;
public MainForm()
{
InitializeComponent();
}
private async void btnStart_Click(object sender, EventArgs e)
{
if (listener != null)
{
MessageBox.Show("服务器已经启动!");
return;
}
IPAddress ipAddress = IPAddress.Any;
int port = 8888;
try
{
listener = new TcpListener(ipAddress, port);
listener.Start();
txtLog.AppendText($"服务器已启动,监听 IP 地址为 {ipAddress},监听端口为 {port}\r\n");
while (true)
{
TcpClient client = await listener.AcceptTcpClientAsync();
txtLog.AppendText($"客户端 {client.Client.RemoteEndPoint} 已连接!\r\n");
HandleClient(client);
}
}
catch (Exception ex)
{
txtLog.AppendText($"服务器启动失败,异常信息:{ex.Message}\r\n");
}
}
private async void HandleClient(TcpClient client)
{
try
{
byte[] buffer = new byte[1024];
while (true)
{
int bytesRead = await client.GetStream().ReadAsync(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
txtLog.AppendText($"收到客户端 {client.Client.RemoteEndPoint} 的消息:{message}\r\n");
BroadcastMessage(message, client);
}
else
{
txtLog.AppendText($"客户端 {client.Client.RemoteEndPoint} 已断开连接!\r\n");
break;
}
}
}
catch (Exception ex)
{
txtLog.AppendText($"客户端 {client.Client.RemoteEndPoint} 发生异常,异常信息:{ex.Message}\r\n");
}
}
private void BroadcastMessage(string message, TcpClient excludeClient)
{
byte[] buffer = Encoding.UTF8.GetBytes(message);
foreach (TcpClient client in listener.Pending())
{
if (client != excludeClient)
{
client.GetStream().WriteAsync(buffer, 0, buffer.Length);
}
}
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (listener != null)
{
listener.Stop();
}
}
}
}
```
在上面的代码中,我们先创建一个 `TcpListener` 对象,然后使用 `Start` 方法开始监听端口。在 `while` 循环中,使用 `AcceptTcpClientAsync` 方法异步等待客户端连接请求,当有客户端请求连接时,会返回一个 `TcpClient` 对象,然后将其传递给 `HandleClient` 方法处理客户端请求。在 `HandleClient` 方法中,使用异步方式读取客户端发送的数据,并在接收到消息后将消息转发给除当前客户端以外的所有客户端。
注意:以上代码仅供参考,实际使用时需要根据需求进行修改和完善。
阅读全文