用vs2005做了个简单的通信实例,但是有一些问题自已不明白,请教大家:
以下是一段监听的代码:
string messageStr = "";
                IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
                tcpListener = new TcpListener(ipAddress, port);
                tcpListener.Start();         
                while (true)
                {
                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                     socket =  tcpListener.AcceptSocket();
                    byte[] buffer = new byte[socket.Available];
                    int i = socket.Receive(buffer);
                    messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
                    if (messageStr != "")
                    {
                        this.rtbRecordMessage.AppendText("[user] " + ipAddress + "   " + System.DateTime.Now + "\n" + messageStr );
                        messageStr = "";
                    }
                }
<1> 如果在第六行加一个断点,然后在vs2005中运行,再运行另一个生成好的.EXE文件相互通信,可以实现通信,但只能通信二次,到第三次的时候就不监听了.不知道为什么
<2> 如果直接运行二个.EXE文件在本机做通信测试,接收端一次消息也收不到.

解决方案 »

  1.   

    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    建立一个连接...然后执行完毕...连接后接收消息... 然后你又NEW了SOCKET..老的就是没了引用.. SOCKET不能丢弃..
    如果丢弃你的发送端要重新建立连接.
      

  2.   

    string messageStr = "";
                    IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
                    tcpListener = new TcpListener(ipAddress, port);
                    tcpListener.Start();
                    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    while (true)
                    {
                       
                         socket =  tcpListener.AcceptSocket();
                        byte[] buffer = new byte[socket.Available];
                        int i = socket.Receive(buffer);
                        messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
                        if (messageStr != "")
                        {
                            this.rtbRecordMessage.AppendText("[user] " + ipAddress + "   " + System.DateTime.Now + "\n" + messageStr );
                            messageStr = "";
                        }
                    }改成这样也不行啊.
      

  3.   

    我来帮你把帖子重新贴一遍:
    //用vs2005做了个简单的通信实例,但是有一些问题自已不明白,请教大家:
    //以下是一段监听的代码:
                    string messageStr = "";
                    IPAddress ipAddress = Dns.Resolve(Dns.GetHostName().ToString()).AddressList[0];
                    tcpListener = new TcpListener(ipAddress, port);
                    tcpListener.Start();       
                    while (true)
                    {
                        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                        socket =  tcpListener.AcceptSocket();
                        byte[] buffer = new byte[socket.Available];
                        int i = socket.Receive(buffer);
                        messageStr = System.Text.UnicodeEncoding.UTF8.GetString(buffer);
                        if (messageStr != "")
                        {
                            this.rtbRecordMessage.AppendText("[user] " + ipAddress + "  " + System.DateTime.Now + "\n" + messageStr );
                            messageStr = "";
                        }
                    }<1> 如果在第六行加一个断点,然后在vs2005中运行,再运行另一个生成好的.EXE文件相互通信,可以实现通信,但只能通信二次,到第三次的时候就不监听了.不知道为什么
    <2> 如果直接运行二个.EXE文件在本机做通信测试,接收端一次消息也收不到.
      

  4.   

    LZ,你看看这样行不: static void Listen()
            {
                string data = "";
               TcpListener tcpListener = new TcpListener(2048);
               tcpListener.Start();
                Console.WriteLine("Begin linsten.......");
                while (true)
                {
                    Console.WriteLine("Waiting for a connection......... ");
                    TcpClient client = tcpListener.AcceptTcpClient();
                    Console.WriteLine("Client :"+client.Client.RemoteEndPoint.ToString() + "  connected!");
                    Byte[] bytes = new Byte[768];
                    NetworkStream stream = client.GetStream();
                    int i;
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                        Console.WriteLine("Received: {0}", data);
                        data = data.ToUpper();
                        byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                        Console.WriteLine("Sent: {0}", data);
                    }
                }        }
      

  5.   

    如果调试可以而全速跑起来不行的话,只有一种可能是,你循环体内的操作是很耗时并且需要等待的。对于socket的东西,还是使用多线程+信号量吧。
      

  6.   

    你应该先开一个监听函数,每监听到一个连接,就开一个新的线程,在线程中保持这个连接,然后不停的接收数据,像你这样每次都连接,怎么行private void OpenServerPort()
            {
                try
                {
                    serverTcpListen = new TcpListener(IPAddress.Parse(ServerIP), ServerReceivePort);
                    serverTcpListen.Start();
                    serverListenThread = new Thread(new ThreadStart(ServerListen));
                    serverListenThread.Start();
                }
                catch (Exception ex)
                {
                    //TODO:打开服务器端口失败后的异常处理
                    serverListenLoopTag = false;
                }
            }
            /// <summary>
            /// 监听服务器端口
            /// </summary>
            private void ServerListen()
            {
                while (serverListenLoopTag)
                {
                    try
                    {
                        tcpClient = serverTcpListen.AcceptTcpClient();
                        int bufflen = 0;
                        byte[] buffer = new byte[1024];
                        bufflen = tcpClient.Client.Available;
                        tcpClient.Client.Receive(buffer, 0, bufflen, SocketFlags.None);
                        string message = Encoding.ASCII.GetString(buffer, 0, bufflen);
                     }
                       catch (Exception ex)
                    {
                        //TODO:接收数据线程异常处理
                        serverListenLoopTag = false;
                        MessageBox.Show(ex.Message);
                    }
                  }
               }