读书人

Socket监听开启多线程有关问题

发布时间: 2012-06-20 20:37:21 作者: rapoo

Socket监听开启多线程问题
我BS服务器 开启Socket监听

开启多线程

多个客户端连接之后

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

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

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

帮忙解答下

(顺便说下 线程池怎么用好些
其实我之前是都可以接受到的
改线程池 又重启IIS 换回多线程 不用线程池 就这样了 不知道什么原因)

[解决办法]
如果
Thread mythread = new Thread(new ThreadStart(DoWork.ReceiveMethod));
mythread.Start();
这样是正常的,就改成这样
ThreadPool.QueueUserWorkItem(v1 => DoWork.ReceiveMethod());
再有问题吧 DoWork 内容发上来吧
[解决办法]
ThreadPool.SetMinThreads(10, 10);
ThreadPool.SetMaxThreads(100, 100);
这两个不要去动

开启 代码

C# code
foreach (IPAddress item in Dns.GetHostEntry("").AddressList) 
{
if (System.Text.RegularExpressions.Regex.IsMatch(item.ToString(),
Constants.RegularHttp))
{
ipa = item;
break;
}
}//监听端口2020
TcpListener mylistenter = new TcpListener(ipa, Constants.IPPort);
//ThreadPool.SetMinThreads(10, 10);
//ThreadPool.SetMaxThreads(100, 100);
try
{
mylistenter.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
mylistenter.Start();
FileConfig.WritetFile(Constants.FileListenter + mylistenter.LocalEndpoint.ToString());
//int a, b;
//等待处理接入连接请求
while (true)
{
mySocket = mylistenter.AcceptSocket();
ThreadPool.QueueUserWorkItem(DoWork.ReceiveMethod, mySocket);
}
}
catch (Exception ex)
{
FileConfig.WritetFile(Constants.FileException + ex.ToString());
}
finally
{ }


ReceiveMethod 代码
C# code
private static void ReceiveMethod(object state){    Socket socket = (Socket)state;    int length = 0;    byte[] byteData = null;//new byte[1024];    string request = string.Empty;    string DataHeader = string.Empty;    string DataTrunk = string.Empty;    bool Flag = true;    while (true)    {        Thread.Sleep(100);        length = socket.Available;        if (socket.Connected && length > 16)        {            try            {                byteData = new byte[length];                //将从客户端流读取的数据保存到字符串request中                socket.Receive(byteData);                request = System.Text.UTF8Encoding.UTF8.GetString(byteData);                DataHeader = string.Empty;                DataTrunk = string.Empty;                ReceiveData(request, ref DataHeader, ref DataTrunk);                FileConfig.WritetFile(string.Format(Constants.FileNewData,                    DataHeader, DataTrunk, request.Length, request));            }            catch (Exception ex)            {                FileConfig.WritetFile(socket.RemoteEndPoint.ToString() + Constants.FileColseException +                    ex.ToString());                /*if (listSocket.Contains(socket))                {                    listSocket.Remove(socket);                }                socket.Shutdown(SocketShutdown.Both);                socket.Close();*/            }            finally            { }        }    }}
[解决办法]
我最近也在学习这个东西
[解决办法]
多线程不熟,那就先用单线程来实现,后面再优化

//ThreadPool.SetMinThreads(10, 10);
//ThreadPool.SetMaxThreads(100, 100);
其实随意设置它们并不好,因为你不知道客户机器的硬件配置。线程池是托管的,你不用去关心最大数和最小数,不要同时去开启太多的线程,同时保证线程能正常退出就行了
------解决方案--------------------


private static Socket mySocket = null;

mySocket = mylistenter.AcceptSocket();
listSocket.Add(mySocket);
我理解就是listSocket应该是一个socket集合作为连接池的吧?
但是从这几行代码上看到,实际上你的listSocket里面所有的socket都是最后一个客户端连上的socket,Socket是服务端和客户端之间的通讯通道,如果有N个客户端连上了,服务端应该有N个socket实例的,服务端和每个客户端通讯的socket实例是不同的,大概看了下代码,您服务端和客户端的通讯是否仅仅只是最后一次连接的客户端是有效的?

读书人网 >C#

热点推荐