2014-02-16 147 views
0

我打算在C#.NET中編寫Java TCP服務器和客戶端。 我將Java用於服務器,因爲我有能力在Linux上運行服務器。 我的問題是,.NET客戶端可以連接到服務器,但如果我發送一些東西給服務器,服務器不會收到任何東西。Java Tcp服務器和.Net Tcp客戶端發送和接收問題

這裏是我的客戶:

static void Main(string[] args) 
    { 
     try 
     { 
      System.Net.Sockets.TcpClient tcpclnt = new System.Net.Sockets.TcpClient(); 
      Console.WriteLine("Connecting....."); 

      tcpclnt.Connect("192.168.178.26", 1337); 

      Console.WriteLine("Connected"); 
      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(); 

      byte[] bb = new byte[100]; 
      int k = stm.Read(bb, 0, 100); 

      for (int i = 0; i < k; i++) 
       Console.Write(Convert.ToChar(bb[i])); 

      tcpclnt.Close(); 
     } 

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

這裏是我的服務器:

public static void main(String argv[]) throws Exception 
{ 
    String clientSentence; 
    String capitalizedSentence; 

    ServerSocket socket = new ServerSocket(1337); 

    while(true) 
    { 
     System.out.println("... Server gestartet"); 
     Socket connectionSocket = socket.accept(); 
     BufferedReader inputFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
     System.out.println(connectionSocket.getRemoteSocketAddress()); 
     DataOutputStream outputStream = new DataOutputStream(connectionSocket.getOutputStream()); 
     clientSentence = inputFromClient.readLine(); 
     System.out.println("Received: " + clientSentence); 
     capitalizedSentence = clientSentence.toUpperCase() + "\n"; 
     outputStream.writeBytes(capitalizedSentence); 
    } 
} 

我測試的代碼僅用於測試PROTOTYP連接到Java服務器。我也打算與iOS和可能Windows Phone的Java Tcp服務器進行通信。 所以我希望你們中的任何一個人都能爲我解答。

回答

2

您的客戶端發送一個行的字節,並等待響應,保持該流打開。

ReadLine返回之前,您的服務器等待換行(或流的末尾,即連接正在關閉)。所以雙方都在等待對方。

我建議你在客戶端使用環繞流的OutputStreamWriter - 然後你可以非常簡單地使用WriteLine(而不是自己搞亂編碼)。當服務器看到換行符時,它會響應。我還會在客戶端上使用InputStreamReader,而不是在每個字節上調用Convert.ToChar。從根本上講,如果您只想傳輸文本,並且很樂意使用「一條線」作爲消息傳遞單元,則使用上的作者/讀者對,兩個兩邊都是最簡單的方法。

+0

感謝您的回答,它幫助了我很多。好的,將來我不會只發送一行。我打算髮送可能的json對象或xml的東西到服務器。 – Alex