Socket监听开启多线程问题

混乱之序 2012-06-15 12:01:20
我BS服务器 开启Socket监听

开启多线程

多个客户端连接之后

为什么只能接受到最后一个连接上的 客户端数据
其他数据发哪了?什么情况
有解答的吗?

发送连接上的其他客户端都可以
但就是没接受上来

我线程不好Socket也是才接触的

帮忙解答下

(顺便说下 线程池怎么用好些
其实我之前是都可以接受到的
改线程池 又重启IIS 换回多线程 不用线程池 就这样了 不知道什么原因)
...全文
4913 52 打赏 收藏 转发到动态 举报
写回复
用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模型的优点。使用阻塞模型+线程池不是可以达到同样的效果吗?
  • 打赏
  • 举报
回复
不会 呀
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)

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧