2013-02-19 31 views
0

这是从客户端接收值的函数。但问题是我只收到一次。无论多少次发送一些数据,MainWindows上的标签只会被更改一次。通过套接字接收/发送数据不完全工作,只接收一次值

我在这里做错了什么?

private void HandleClientComm(object client) 
{ 
    tcpClient = (TcpClient)client; 
    NetworkStream clientStream = tcpClient.GetStream(); 

    byte[] message = new byte[4096]; 
    int bytesRead; 

    while (true) 
    { 
     bytesRead = 0; 

     try 
     { 
      bytesRead = clientStream.Read(message, 0, 4096); 
     } 
     catch 
     { 
      break; 
     } 

     if (bytesRead == 0) 
     { 
      break; 
     } 

     if (String.IsNullOrWhiteSpace(data)) 
     { 
      ASCIIEncoding encoder = new ASCIIEncoding(); 
      data = encoder.GetString(message, 0, bytesRead); 

      MainWindow.Change(data); 
      tcpClient.Close(); 
     } 

     tcpClient.Close(); 

    } 

在客户端我有这下面的例子:

try 
{ 
    TcpClient tcpclnt = new TcpClient(); 
    Console.WriteLine("Connecting....."); 
    tcpclnt.Connect("127.0.0.1", 8001); 
    Console.WriteLine("Connected"); 
    while (true) 
    { 
     Console.Write("Enter the string to be transmitted : "); 
     String str = Console.ReadLine(); 
     Stream stm = tcpclnt.GetStream(); 
     ASCIIEncoding asen = new ASCIIEncoding(); 
     byte[] ba = asen.GetBytes(str); 
     Console.WriteLine("Transmitting....."); 
     stm.Write(ba, 0, ba.Length); 
     stm.Flush(); 
     Console.WriteLine("Sent....."); 
    } 

    tcpclnt.Close(); 
    Console.Read(); 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Error..... " + e.StackTrace); 
} 

公正的快速例子,所以当我输入的字符串名称,价值变动第一次,但是当我进入第二次或者如果我退出客户端程序并重新输入任何内容,则标签内容的值等于第一次发送的值。

回答

0

它看起来像您所呼叫的第一次成功读取后:

tcpClient.Close(); 

这将防止未来被成功读取。

如果你想避免这些类型的套接字问题,你考虑过使用网络库吗?我是图书馆networkComms.net的开发人员,你可以找到一个简短的例子或我的意思是here

+0

它没有工作,我现在检查你的图书馆。谢谢。 – moenad 2013-02-19 19:11:08

+0

到您网站的链接实际上并不是问题的答案,而只是为了宣传您的图书馆而设计的。预计堆栈溢出的答案将直接与被问到的问题相关。 – 2013-02-19 21:10:56

+0

@AndrewBarber - 恕我直言,我的答案的第一部分直接回答了这个问题。第二部分让OP知道我的经验是更好的解决方案。如果我不包括第二部分,请告知。 – MarcF 2013-02-19 21:18:51

0

您必须使用异步服务器套接字......看到这个样本从MSDN Link

+0

检查出来,谢谢你的链接。 – moenad 2013-02-19 19:11:28

+0

请给出答案:) – Antonio 2013-02-19 21:23:57

+1

@Antonio请不要让人投票或接受你的答案。 – 2013-02-20 08:48:58

0

如果使用tcpClient.Close()后clientStream.Read(),它会抛出一个异常,这将运行抓阻止并打破你的循环。 (你在地方致电tcpClient.Close()内的循环,使刚刚摆脱的只是一个无助。。这都是错误的。)

tcpClient.Close()不应该所谓除非你完全完成连接后(而且它应该只被调用一次。)

此外,

“您必须关闭的NetworkStream当您通过发送和接收数据。关闭的TcpClient不会释放NetworkStream“。

因此,请确保关闭TcpClient和NetworkStream,但只有当您完成循环中的处理时才会关闭。

相关问题