社区
C#
帖子详情
Socket监听开启多线程问题
混乱之序
2012-06-15 12:01:20
我BS服务器 开启Socket监听
开启多线程
多个客户端连接之后
为什么只能接受到最后一个连接上的 客户端数据
其他数据发哪了?什么情况
有解答的吗?
发送连接上的其他客户端都可以
但就是没接受上来
我线程不好Socket也是才接触的
帮忙解答下
(顺便说下 线程池怎么用好些
其实我之前是都可以接受到的
改线程池 又重启IIS 换回多线程 不用线程池 就这样了 不知道什么原因)
...全文
4913
52
打赏
收藏
Socket监听开启多线程问题
我BS服务器 开启Socket监听 开启多线程 多个客户端连接之后 为什么只能接受到最后一个连接上的 客户端数据 其他数据发哪了?什么情况 有解答的吗? 发送连接上的其他客户端都可以 但就是没接受上来 我线程不好Socket也是才接触的 帮忙解答下 (顺便说下 线程池怎么用好些 其实我之前是都可以接受到的 改线程池 又重启IIS 换回多线程 不用线程池 就这样了 不知道什么原因)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
52 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
XUNPO
2012-06-28
打赏
举报
回复
我相信,如果楼主1年后再看这个贴会脸红。
混乱之序
2012-06-26
打赏
举报
回复
先谢谢 我看下
xianzhou163
2012-06-26
打赏
举报
回复
给你看看我写的一段监听代码,应当对你有所帮助
class listener
{
public TcpListener myListener;
public int port = 808;
public MainForm mainform = null;
public bool isabort=false;
public void StartListen()
{
try
{
myListener = new TcpListener(port);
myListener.Start();
mainform.MessageShow("服务已启动");
}
catch (Exception e)
{
mainform.MessageShow(e.ToString());
return;
}
bool sdif=ThreadPool.SetMaxThreads(100, 100);//设置线程池线程数量
//int sds, dsd;
//ThreadPool.GetMaxThreads(out sds, out dsd);
while (true)
{
Socket mySocket = null;
if (myListener != null && myListener.Pending())
{
try
{
//接受新连接
mySocket = myListener.AcceptSocket();
}
catch (Exception zxz)
{
mainform.MessageShow(zxz.ToString());
}
}
//Thread.Sleep(5);
if (isabort)
break;
if (mySocket == null)
continue;
mainform.MessageShow("..." + mySocket.RemoteEndPoint.ToString() + "...Connecting......");
ThreadPool.QueueUserWorkItem(ReceiveDataFromSocket, mySocket);
}
}
private void ReceiveDataFromSocket(object obj)
{
Socket mySocket = (Socket)obj;
Byte[] bReceive = new Byte[1024 * 1024];
int i = 0;
try
{
//Thread.Sleep(4000);
i = mySocket.Receive(bReceive);
}
catch (Exception zxz)
{
Thread.CurrentThread.Abort();
return;
}
string sBuffer = Encoding.GetEncoding("gb2312").GetString(bReceive, 0, i);
.
........
}
}
混乱之序
2012-06-26
打赏
举报
回复
[Quote=引用 45 楼 的回复:]
楼主的代码组织方式,还停留在客户端、单线程环境下。 服务器端用这种逻辑写出来的代码,问题很多。往往是1个或少数几个连接没有问题,连接数一多,问题就会集中爆发出来。
建议:
服务器端坚决 不能用阻塞模式。(需要用begin开头的函数,坚决制止sleep函数)
线程池不用操心,底层已经做了。
管理好缓冲区
一般都需要添加Session管理逻辑。
[/Quote]
这位兄台 我在网上找了点东西
用起来 怪怪的 上的链接研究了下
没有加上线程池 接受数据也是有些问题
要么是连接接受一次后断
改过代码 不断了 但只接受一次 好像没有持续监听接受的意思...
还望指导下 线程池+Socket异步通信 监听接受
混乱之序
2012-06-26
打赏
举报
回复
[Quote=引用 45 楼 的回复:]
楼主的代码组织方式,还停留在客户端、单线程环境下。 服务器端用这种逻辑写出来的代码,问题很多。往往是1个或少数几个连接没有问题,连接数一多,问题就会集中爆发出来。
建议:
服务器端坚决 不能用阻塞模式。(需要用begin开头的函数,坚决制止sleep函数)
线程池不用操心,底层已经做了。
管理好缓冲区
一般都需要添加Session管理逻辑。
[/Quote]
问下 我之前是不是搞线程通信的
现在BS上有这个需求 还望指出
我在看http://www.cnblogs.com/kingmoon/archive/2011/04/29/2032452.html
Socket的异步通信 之前的是同步通信 我才知道=。=!
混乱之序
2012-06-26
打赏
举报
回复
谢谢给的建议 一会试下
混乱之序
2012-06-26
打赏
举报
回复
貌似上面的 也不行
说下吧 我现在写了
1.仿WF多线程版本 Socket同步通信
——也就是之前的代码
2.线程池版本 Socket同步通信
——改进为线程池 初步验证也可以 但是没用异步的...
3.线程池 Socket异步通信版本
——在研究 =。=!求指点
okkk
2012-06-25
打赏
举报
回复
楼主的代码组织方式,还停留在客户端、单线程环境下。 服务器端用这种逻辑写出来的代码,问题很多。往往是1个或少数几个连接没有问题,连接数一多,问题就会集中爆发出来。
建议:
服务器端坚决 不能用阻塞模式。(需要用begin开头的函数,坚决制止sleep函数)
线程池不用操心,底层已经做了。
管理好缓冲区
一般都需要添加Session管理逻辑。
wygxz
2012-06-21
打赏
举报
回复
[Quote=引用 13 楼 的回复:]
学习啊
学习
等待cao老大批判,不是北大青鸟的学生,竟然还用这个阻塞模式啊
[/Quote] 北大青鸟的学生艹你妈了么?
tedcy
2012-06-21
打赏
举报
回复
[Quote=引用 13 楼 的回复:]
学习啊
学习
等待cao老大批判,不是北大青鸟的学生,竟然还用这个阻塞模式啊
[/Quote]
一直没搞明白select模型的优点。使用阻塞模型+线程池不是可以达到同样的效果吗?
天才在左疯子在右
2012-06-20
打赏
举报
回复
不会 呀
XiaMinet
2012-06-19
打赏
举报
回复
mylistenter.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
mylistenter.Start();
FileConfig.WritetFile(Constants.FileListenter + mylistenter.LocalEndpoint.ToString());
//int a, b;
//等待处理接入连接请求
while (true)
{
Socket
mySocket = mylistenter.AcceptSocket();
ThreadPool.QueueUserWorkItem(DoWork.ReceiveMethod, mySocket);
}
这样试试呢?
混乱之序
2012-06-19
打赏
举报
回复
但不是这个问题 listSocket
只是用于存储连接上的socket
主要用于发送指令的时候找到对应的socket
对于接受没有具体作用的
应该不是这个问题
但很奇怪之前是好的...
怀疑是不是server2008不熟悉
或IIS7.0不熟悉 导致的
混乱之序
2012-06-19
打赏
举报
回复
[Quote=引用 36 楼 的回复:]
private static Socket mySocket = null;
mySocket = mylistenter.AcceptSocket();
listSocket.Add(mySocket);
我理解就是listSocket应该是一个socket集合作为连接池的吧?
但是从这几行代码上看到,实际上你的listSocket里面所有的socket都是最后一个客户端连上的so……
[/Quote]
我检查下 谢谢
混乱之序
2012-06-19
打赏
举报
回复
啊哈哈 我自己又解决了 妹的
就说 之前是好的 改后怎么回事呢
线程执行的函数 不能是静态的
静态放内存了 恩 结贴
混乱之序
2012-06-19
打赏
举报
回复
不行 一样的 之前也是这样
AcceptSocket();等待连接
开线程 一样是进副本
混乱之序
2012-06-18
打赏
举报
回复
[Quote=引用 31 楼 的回复:]
怎么还要“重启IIS”?
[/Quote]
我程序是依托在IIS中的 开启后不知道怎么关闭端口了
所以就 重启IIS=。=!
有好方法吗?指导下
混乱之序
2012-06-18
打赏
举报
回复
[Quote=引用 31 楼 的回复:]
怎么还要“重启IIS”?
[/Quote]
所以我不知道 怎么关闭在IIS的网站
开启的Socket监听...
WF程序的关闭所有就可以了
XiaMinet
2012-06-18
打赏
举报
回复
private static Socket mySocket = null;
mySocket = mylistenter.AcceptSocket();
listSocket.Add(mySocket);
我理解就是listSocket应该是一个socket集合作为连接池的吧?
但是从这几行代码上看到,实际上你的listSocket里面所有的socket都是最后一个客户端连上的socket,Socket是服务端和客户端之间的通讯通道,如果有N个客户端连上了,服务端应该有N个socket实例的,服务端和每个客户端通讯的socket实例是不同的,大概看了下代码,您服务端和客户端的通讯是否仅仅只是最后一次连接的客户端是有效的?
混乱之序
2012-06-18
打赏
举报
回复
[Quote=引用 34 楼 的回复:]
做socket程序,你还要在iis中写,有点无语,为什么不直接写一个winform
[/Quote]
你放wf中 如何在BS上 发送指令到 客户端
别告诉我再进程间 通讯
我现在已经实现了
只是感觉有点不稳定 开启的端口会断开
加载更多回复(32)
C++
多线程
SOCKET
收发
C++
多线程
SOCKET
收发纯手工打造,网上的例子和解释都不行~既可以学习
多线程
操作,又可以实现SOCLET编程
基于TCP/IP的
Socket
多线程
通信(服务器和客户端)
基于TCP/IP的
Socket
多线程
通信(服务器和客户端),需要的请下载看看。
C#基于TCP的
Socket
多线程
通信(包含服务端和客户端)
C#基于TCP的
Socket
多线程
通信(包含服务端和客户端) 代码都有注释,方便新手阅读
java
多线程
+
Socket
+Swing做的局域网聊天程序
上次传了一个,结果忘了传源码,只有图片效果,害的大家以为我是标题党。 今天特地传了份源码。降一分。 这是服务端的src,客户端的也有。自己再我的资源中找吧。
c#
多线程
socket
开发(一个服务器对多个客户端)
c#语言开发
多线程
socket
服务器端程序,实现一个服务器同时与多个客户端连接对话。
C#
111,126
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章