2015-03-25 120 views
0

我有兩個應用程序,一個用Java編寫,另一個用C#編寫。我試圖從Java應用程序發送一個字符串到C#應用程序。java和c#應用程序之間的Socket通信

我的用於發送所述字符串java代碼如下:

String response; 
try { 
    DataOutputStream outToServer = 
     new DataOutputStream(outGoingSocket.getOutputStream()); 
    BufferedReader inFromServer = 
     new BufferedReader(new InputStreamReader(outGoingSocket.getInputStream())); 

    outToServer.writeBytes(message + '\n'); 
    outToServer.flush(); 

    response = inFromServer.readLine(); 

    System.out.println("Received: " + response);   
} catch (Exception ex) { 
    System.err.println("Exception in incoming socket: " + ex.getMessage()); 
} 

用於接收數據我的C#代碼如下:

Byte[] bytes = new Byte[1000]; 
String data = null; 
try { 
    Console.Write("Waiting for a connection... "); 
    TcpClient client = incomingSocket.AcceptTcpClient(); 
    Console.WriteLine("Connected!"); 

    data = null; 
    NetworkStream stream = client.GetStream(); 

    int i; 
    while (true) { 
     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { 
      data = System.Text.Encoding.ASCII.GetString(bytes, 0, i); 
      Console.WriteLine("Received:", data); 
      processReceivedMessage(data); 
      ackSocket(stream, "OK"); 
     } 
    } 
} catch (Exception ex) { 
    Console.WriteLine("Exception: ", ex); 
} 

我有一個問題與在接收到所述數據C#應用程序。當我在Java應用程序發送字符串「數據」,並嘗試打印使用Console.WriteLine("Received: {0}", data) C#應用程序接收到的數據,輸出的是:

Received: D 
Received: ata 

如果我使用Console.WriteLine("Received: ", data),輸出爲:

Received: 
Received: 

我希望我的C#應用​​程序能夠接收由Java應用程序發送的完整字符串。我試圖增加緩衝區字節數組的大小到1000,但它沒有幫助。我沒有使用套接字的經驗,有人可以告訴我我做錯了什麼嗎?

+0

嗨@spender,請把您的意見作爲答案,我可以接受它,非常感謝您的StreamReader – Xitrum 2015-03-25 11:07:07

+0

是的,我似乎花了很多時間在評論中發佈答案......已將所有內容都轉移到了回答你。 – spender 2015-03-25 11:10:09

回答

2

因此,正如您所看到的,接收端會收到一個響應,可能比總郵件小得多。

你不應該試圖改變這種行爲......這是網絡編程的事實。你的工作是將它們重新粘合在一起。

「我希望我的C#應用​​程序收到完整的字符串」

那麼,如何在您的應用程序接收意味着知道它已收到完整的字符串?您是否發送了一個長度字段來表示要傳送多少數據?也許你期望\ n指出消息的結尾?零字節?

如果您的終止符確實是一個換行符,那麼您可能需要考慮將您的NetworkStream轉換爲StreamReader並且在其上調用ReadLine。現在,StreamReader將繼續從流中讀取,直到它到達換行符,然後將您的線路交給您。

相關問題