C# Socket通讯问题

weixin_47256859 weixin_47256859 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我写了一个服务端可以连接多个客户端,现在的问题是当多个客户端连接之后,每个客户端第一次通讯没问题但是第二次通讯的话只有第一个连接上的才能成功通讯,还有就是当我关闭服务器的按钮之后,并不能关闭连接,只能断开其中一个或者两个,还请各位大神指教指教!!
这是监听连接代码片段
 private void Startsocket()
{

try
{
IPAddress ip = IPAddress.Any;
//当开始监听时候,在服务器创建一个负责IP地址跟端口号的Socket
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(ip, 9090);
//监听
socketWatch.Bind(point);
//连接数量为10个
socketWatch.Listen(10);

}
catch { throw; }
}

这是客户端连接处理片段
public void ListenClickConnect(object o)
{
Socket socketWatch = o as Socket;
//等待用户连接创建一个负责通信的Socket
while (true)
{
//最大连接数
int number = 10;
if (disSocket.Count > number)
{
socketWatch.Close();
socketWatch.Dispose();
ShowMsg("连接数量已达到上限");
}
try
{
//关闭服务器时 跳出循环
if (stop)
{
break;
}
//等到客户端新的连接
socketSend = socketWatch.Accept();
//将远程客户端IP地址存储到泛型集合中
disSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//timer.Start();
AddKJ();

}
catch { break; }
}

这是关闭服务器代码片段
bool stop = false;
private void Stop_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i <= namenumber; i++)
{
Image images = gridcontrol.FindName("image" + i) as Image;
Label label = gridcontrol.FindName("label" + i) as Label;
if (images != null)
{
gridcontrol.Children.Remove(images);
gridcontrol.UnregisterName("image" + i);
gridcontrol.Children.Remove(label);
gridcontrol.UnregisterName("label" + i);
}
Image image = gridcontrol.FindName("image") as Image;
image.Visibility = Visibility.Visible;
}
ShowMsg("关闭服务");
if (startandstop == false)
{
startandstop = true;
startbut.IsEnabled = true;
stopbut.IsEnabled = false;
startbut.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF5B93E4"));
stopbut.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FFF7CDCD"));
}
//断开通讯和关闭监听
if (socketSend != null && socketSend.Connected)
{
socketSend.Shutdown(SocketShutdown.Both);
socketSend.Close();
socketSend.Dispose();
stop = true;
socketWatch.Close();
socketWatch.Dispose();
disSocket.Clear();
}
else
{
stop = true;
socketWatch.Close();
socketWatch.Dispose();
}

}

接收客户端发来的信息片段

int erro = 0;

private void Receive(object o)
{
socketSend = o as Socket;
while (true)
{
try
{
//客户端连接成功后服务器接收发来消息
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接收有效字节数
int r = socketSend.Receive(buffer);
if (r == 0)
{
erro += 1;
Erroe(erro);
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(str);
SendData(str);

}
catch
{
break;
}
}
}

这是运行界面






...全文

相关推荐

C# Socket通讯常见问题详解

C# Socket通信三大问题之数据包界限符问题。  根据原项目中交通部标准,在连续观测站中数据包中,使用??两个字符表示有效数据包开始和结束。实际项目有各自的具体技术规范  C# Socket通信三

weixin_38707240

C# TIPTOP电子看板实战:从Socket通讯到UI卡顿问题根治

在工业数字化与车间管理中,数据采集与可视化看板是连接计划侧与执行侧的关键环节。电子看板的核心价值在于将工单进度、产量与异常信息实时呈现,消除信息滞后与数据口径不一致问题。实现此类系统,通常需要掌握上位机开发中的几项基础技术:TCP长连接与粘包处理、扫码枪数据触发、循环采集中UI刷新优化、断线重连与缓存机制。以C#语言为例,其成熟的WinForm界面框架、丰富的工业SDK支持,以及强类型特性,使其成为Windows生态下对接TIPTOP等ERP系统的首选。从TCP协议解析到生产者消费者模式的应用,这些技术原理

YM酱

C# Socket通讯框架,封装了Client和Server端类库,带实例

在这个C# Socket通讯框架中,开发者可以利用封装好的Client和Server端类库,大大简化了网络编程的工作。通常,Server端会创建一个监听Socket,等待客户端连接。

易寒

c# socket同步通讯 异步通讯 客户端 服务端 实例

C#作为.NET框架的一部分,提供了强大的Socket编程接口,使得开发者能够创建高效、可靠的网络应用程序。本文将深入探讨C#中的Socket同步通讯与异步通讯,以及如何构建客户端和服务端程序。

zhongcai622

即时通讯框架(socket 异步通讯)

异步Socket编程是C#中处理网络I/O操作的一种重要方式。它解决了同步操作可能导致的阻塞问题,使得程序在等待数据传输时可以执行其他任务,提高了系统资源利用率和程序响应速度。

东方文龙
评论 8
收藏 已收藏
分享
返回顶部
weixin_47256859
C# 111,129 成员 642,539 内容