2012-05-30 94 views
1

我知道,在网络流做Flush则什么也不做,发送数据不

这就是为什么我定义StreamWriter这需要网络流作为构造函数的参数,然后我试图向客户发送信函S告诉他他的联系是成功的。

private StreamReader srReceiver; 
private StreamWriter swSender; 

// Occures when a new client is accepted 
private void AcceptClient() 
{ 
    srReceiver = new System.IO.StreamReader(TcpClient.GetStream()); 
    swSender = new System.IO.StreamWriter(TcpClient.GetStream()); 

    if (TcpClient.Available > 0) 
    { 
      char [] buff0 = new char[TcpClient.Available]; 

      // Read the account information from the client 
      srReceiver.Read(buff0, 0, TcpClient.Available); 

      sUserNumber = new string(buff0); 

      // We got a response from the client 
      if (!string.IsNullOrEmpty(sUserNumber)) 
      { 
       OraEntities Ent = new OraEntities(); 

       var user = Ent.USERS.FirstOrDefault(usr => usr.USER_NUMBER == sUserNumber); 

       // Check user validity 
       if (user == null) 
       { 
        Console.WriteLine("No user has this number: " + sUserNumber); 
        return; 
       } 
       else 
       { 
        // Add the user to Active Users List and start listening for messages from him 
        Server.AddUser(this, sUserNumber); 

        // S means connected successfully 
        swSender.WriteLine("S"); 
        swSender.Flush(); 

        // Start the new tread that hosts the listener 
        thrReceive = new Thread(HandleInput); 
        thrReceive.Start(); 
       } 
      } 
      else 
      { 
       CloseConnection(); 
       return; 
      } 
    } 
} 

但是没有任何东西在线上发送(没有运行时异常)。

我错过了什么?

+0

尝试添加CRLF(\ r \ n)的每行之后:swSender.WriteLine( “S \ r \ n”); –

+0

在AcceptClient内部使用一个'using(Stream s = TcpClient.GetStream())来代码,然后直接写入流而不是使用流写入器可能是值得的。 – Gavin

+0

@DarrenDavies试过了,没有工作。 –

回答

1

这里是我的测试代码,显示出它的工作:

服务器:

namespace SocketTestServer 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TcpListener lis = new TcpListener(IPAddress.Parse("127.0.0.1"), 2509); 
      lis.Start(); 
      lis.BeginAcceptTcpClient(new AsyncCallback(acceptClient), lis); 
      Console.ReadKey(); 
     } 

     private static void acceptClient(IAsyncResult ar) 
     { 
      TcpListener lis = ar.AsyncState as TcpListener; 
      using (TcpClient cli = lis.EndAcceptTcpClient(ar)) 
      { 
       using (NetworkStream ns = cli.GetStream()) 
       { 
        byte[] toSend = Encoding.ASCII.GetBytes("S\r\n"); 
        ns.Write(toSend, 0, toSend.Length); 
        Console.WriteLine("Client connected"); 
       } 
      } 
     } 
    } 
} 

客户:

namespace SocketTestClient 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (TcpClient client = new TcpClient()) 
      { 
       client.Connect(IPAddress.Parse("127.0.0.1"), 2509); 
       using (NetworkStream ns = client.GetStream()) 
       { 
        StreamReader sr = new StreamReader(ns); 
        Console.WriteLine(sr.ReadLine()); 
        Console.ReadLine(); 
       } 
      } 

     } 
    } 
} 

其中下面的截图,显示工作:

Screenshot of client/server working

0

我昨天有类似的问题。以下是问题 Read data from socket, send response and close

它的最后一个答案,还没有能够接受它,但因为我需要等待2天。

希望这将有助于

+0

我的问题是'如果我关闭了网络流(所以数据可以发送),我怎么能再次连接TcpClient?'。因为,当我试图再次使用NetworkStream时,我收到InvalidOperationException,我无法访问处置的对象。 –