日期:2014-05-18  浏览次数:20831 次

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