110,534
社区成员
发帖
与我相关
我的任务
分享
DoWork()
{
//假设是循环任务
while(!backgroundWorker1.CancellationPending)
{
do sth..
}
}
报忙 就是因为你没有判断,导致先前的任务还没执行完(没有真正取消)IPAddress ipa = IPAddress.Parse(IP);//IP 地址
IPEndPoint iep = new IPEndPoint(ipa, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] Mess = new byte[1024];//定义接收数据byte数组
s.Bind(iep);
while (true)
{
s.Listen(100000);//链接数
Socket m = s.Accept();//阻塞监听端口
m.Receive(Mess);
message = Encoding.UTF8.GetString(Mess);
return message;
}
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?[/quote]
这个设计问题真多啊,Listen 怎么放到循环中去了?
Receive 应该放到子线程中,如果客户端不发数据它也会阻塞。
这里一个客户端连接上来后,就 return 了,s 被遗弃了?m 也被遗弃了?
楼主仍需努力,多看看书吧。[/quote]
Socket m = s.Accept();是阻塞端口,当有客户端连接上来的时候就新开一个socket用来接收信息,
m.Receive(Mess);这个是接收客户端往服务端发送的信息,当接收到之后就把信息放到Mess数组中,在把byte数组转换为字符串,message = Encoding.UTF8.GetString(Mess); 然后把客户端发送的信息return message;返回并且显示出来,我在网上找的示例代码都是这样写的,我以前在学校的时候也是这样的啊?有点不太懂你的意思,能给出代码我看看吗?还有那个结束线程 的问题怎么解决?IPAddress ipa = IPAddress.Parse(IP);//IP 地址
IPEndPoint iep = new IPEndPoint(ipa, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] Mess = new byte[1024];//定义接收数据byte数组
s.Bind(iep);
while (true)
{
s.Listen(100000);//链接数
Socket m = s.Accept();//阻塞监听端口
m.Receive(Mess);
message = Encoding.UTF8.GetString(Mess);
return message;
}
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?[/quote]
这个设计问题真多啊,Listen 怎么放到循环中去了?
Receive 应该放到子线程中,如果客户端不发数据它也会阻塞。
这里一个客户端连接上来后,就 return 了,s 被遗弃了?m 也被遗弃了?
楼主仍需努力,多看看书吧。IPAddress ipa = IPAddress.Parse(IP);//IP 地址
IPEndPoint iep = new IPEndPoint(ipa, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
byte[] Mess = new byte[1024];//定义接收数据byte数组
s.Bind(iep);
while (true)
{
s.Listen(100000);//链接数
Socket m = s.Accept();//阻塞监听端口
m.Receive(Mess);
message = Encoding.UTF8.GetString(Mess);
return message;
}
但是执行到Accept的时候如果没有连接的时候就一直阻塞端口,那如果在这个时候要退出线程,而且又没有连接连上来那怎么办呢?return;
这就结束了,还用别的什么呢?