1.我用多线程监听电脑的一个端口,1个线程对应局域网中的另一台电脑或者设备的端口地址
   现在有100个设备 同时发送数据过来(数据的大小在 byte[100]左右) 。请问我的电脑能顺利正确的接收到这些信息么?
   这100太设备几乎每秒都发送信息过来。2.我的电脑在收到信息后,判断收到 数据的大小, 然后返回 2个字节的 回馈信息 告诉他我收到了,请问同一个端口1边接收数据,这里又一边发送, 会出问题么?
 
3.我写的代码都是直接 TcpServer = threadLinstener.AcceptTcpClient(),  ns = TcpServer.GetStream(); 来接收。
  ns.Write(sd, 0, sd.Length);来发送的 ,没有用异步的方法。这样会出问题么?4.本人情况:研究 TCP多线程 刚1、2个星期,不是很懂,工作刚2个月。
望高人指点下。。

解决方案 »

  1.   

    轮询就是,服务器作为主动发起者,挨个问每个设备是否有数据啊,有就给我。这样做程序结构比较简单,并且容易控制。
    看你的代码你的设备是使用TCP连接的。那我想问一下,你的设备在你这个端口不侦听的情况下是如何运作的。
    是每隔多少时间连接一下服务器端口吗。你这里看来设备端是主动发起数据的,也只能用tcpServer 来监听一个端口开多线程来收,但是需要注意的是设备多了之后,线程也会多,需要在Accept的时候做一些控制,指定一个接受线程数目的上限。并且建立一个接收数据线程的句柄集合,以便推出服务程序时,可以依次停止这些线程。
      

  2.   

    既然需要接收多个端口的信息,最好使用异步方式,记住用lock锁定资源,避免发生冲突。 void Main()
            {
                IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
                TcpListener tcpListener = new TcpListener(ipAddress,500);
                tcpListener.Start();
           
                while (isListen)
                {
                    ChatClient chatClient = new ChatClient(tcpListener.AcceptTcpClient());
                }
                tcpListener.Stop();
            }public class ChatClient
        {
            private TcpClient _tcpClient;
            private byte[] byteMessage;
            public volatile string message;
            public static Hashtable clients= new Hashtable();
            
            public ChatClient(TcpClient tcpClient)
            {
                _tcpClient = tcpClient;
                string _clientEndPoint = _tcpClient.Client.RemoteEndPoint.ToString();            ChatClient.clients.Add(_clientEndPoint, this);            byteMessage=new byte[_tcpClient.ReceiveBufferSize];            lock (_tcpClient.GetStream())
                {
                    _tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null);
                }
            }        public void Receive(IAsyncResult iAsyncResult)
            {
                try
                {
                    int length;
                    
                    lock (_tcpClient.GetStream())
                    {
                         length= _tcpClient.GetStream().EndRead(iAsyncResult);
                    }
                    if (length < 1)
                    {
                        MessageBox.Show(_tcpClient.Client.RemoteEndPoint + "已经断线");
                        clients.Remove(_tcpClient);
                        return ;
                    }                message=Encoding.Unicode.GetString(byteMessage,0,length);                lock (_tcpClient.GetStream())
                    {
                        _tcpClient.GetStream().BeginRead(byteMessage, 0, _tcpClient.ReceiveBufferSize, new AsyncCallback(Receive), null);
                    }
                }
                catch (Exception ex)
                {
                    clients.Remove(_tcpClient);
                    _tcpClient.GetStream().Close();
                    _tcpClient.Close();
                }
            }
        }
    QQ群:59557329 .NET技术开发联盟
    希望大家可以踊跃参加,积极讨论
      

  3.   

    你好,我的水平有限,现在基本都参考别的代码写的。远程的设备,基本上都是要连接到服务器来主动发数据过来,他自己本身不能保存数据的。我不给他回馈信号,他会重发并且做不了别的事情了。
    1我现在也在想如何管理 新建出来的线程,不知道如何写,
    2轮询具体代码如何实现,请问有代码参考么?
    3 我现在 只能用TcpServer = threadLinstener.AcceptTcpClient();来得知有新的连接了,线程基本在100-200之间吧,现在如何得知连接断开了呢(比如我吧设备的网线给拔了,我现在这么做,程序就卡死了。)
    4.现在关闭程序的时候,还不能停止调试,可能很多线程没有结束吧。没有全部释放资源,我想。
    求解答 
      

  4.   

    引用:
    你好,我的水平有限,现在基本都参考别的代码写的。远程的设备,基本上都是要连接到服务器来主动发数据过来,他自己本身不能保存数据的。我不给他回馈信号,他会重发并且做不了别的事情了。
    1我现在也在想如何管理 新建出来的线程,不知道如何写,
    2轮询具体代码如何实现,请问有代码参考么?
    3 我现在 只能用TcpServer = threadLinstener.AcceptTcpClient();来得知有新的连接了,线程基本在100-200之间吧,现在如何得知连接断开了呢(比如我吧设备的网线给拔了,我现在这么做,程序就卡死了。)
    4.现在关闭程序的时候,还不能停止调试,可能很多线程没有结束吧。没有全部释放资源,我想。如果是设备主动发送的话,你可以在每个线程中检测有多久时间没有收到数据了,如果超时的话就退出线程。
    在关闭程序时候,应该停止所有的线程。