2012-02-21 39 views
-1

我在C#中使一个简单的TCP客户端/服务器,我有问题。当我用telnet测试我的代码时,服务器正在读取插口并记录结果。但是,当我的客户端在套接字上写入一个句子时,服务器在readLine函数中被阻塞。无法读取在c#中的TCP套接字与readline()

这里有我的客户:

public Boolean initConnection(String ip) 
     { 
      try 
      { 
       this.client.Connect("127.0.0.1", 40000); 
       this.output = this.client.GetStream(); 
       this.reader = new StreamReader(this.output, Encoding.UTF8); 
       this.writer = new StreamWriter(this.output, Encoding.UTF8); 
       writer.Write("one sentence"); 
       return (true); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       return (false); 
      } 
     } 

,并在这里你有我的服务器:

class SNetwork 
    { 
     private Thread Tread; 
     private TcpListener server; 
     private TcpClient client; 
     private StreamReader reader; 
     private StreamWriter writer; 
     private NetworkStream output; 
     private State state; 

     public void initReading() 
     { 
      this.server = new TcpListener(IPAddress.Any, 40000); 
      output = client.GetStream(); 
      reader = new StreamReader(output, Encoding.UTF8); 
      writer = new StreamWriter(output, Encoding.UTF8); 
      this.Tread = new Thread(new ThreadStart(this.read)); // this.Tread is a thread 
      this.Tread.Start(); 
     } 

    private void read() 
     { 
      try 
      { 
       while (Thread.CurrentThread.IsAlive) 
       { 
        String result; 

        if (this.client.Client.Poll(10, SelectMode.SelectRead)) 
        { 
         this.state = State.Closed; 
         break; 
        } 
        else 
        { 
         result = reader.ReadLine(); 
         if (result != null && result.Length > 0) 
          Console.WriteLine(result); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
      } 
     } 
} 

任何人都可以帮助我PLZ?我没有找到一个解决方案

+0

试着用'writer.WriteLine( “一句”);' – 2012-02-21 17:06:45

回答

1

此代码:

writer.Write("one sentence"); 

不写一行终结 - 让你的服务器代码不知道你已经完成了线。将其更改为WriteLine(并刷新作者)应该没问题。

你总是需要牢记的是TCP/IP是一个基于流协议 - 你不能指望服务器为您开具Write电话与许多Read调用接收数据,如果你”在上面的行终止协议,你需要确保你终止你的线路。

(作为一个独立的问题,它是仿效.NET命名约定是个好主意......)

+0

ARF。感谢这一点。它工作正常! – 2012-02-21 17:26:15