2011-10-30 40 views
2

我真的想送過來TCP一些簡單的數據在我的java程序:Java的TCP簡單的通信提供了意想不到的效果

  String data = "70798090999a9b9c9d9e9fa0a1a2"; 
      ServerSocket srvr = new ServerSocket(1234); 
      Socket skt = srvr.accept(); 
      OutputStream out = skt.getOutputStream(); 
      out.write(hexStringToByteArray(data)); 
      out.close(); 
      skt.close(); 
      srvr.close(); 

隨着功能:

public static byte[] hexStringToByteArray(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) 
          + Character.digit(s.charAt(i+1), 16)); 
    } 
    return data; 
} 

和接收的數據爲:

 Socket skt = new Socket("localhost", 1234); 
    BufferedReader in = new BufferedReader(new 
     InputStreamReader(skt.getInputStream())); 

    while (!in.ready()) {} 
    while (in.ready()) { 
    System.out.println(in.read()); // Read one line and output it 
    } 

但不是接收一個正常增加自己的數字列表,我得到了一些增加並隨意減少:

121 
196 
234 
244 
246 
245 
250 
249 
251 
252 
8224 
176 
162 

我在哪裏做錯了什麼?

+0

你有沒有試過將它讀入一個字節[]? Becaus 8224顯然不適合一個字節 – Sibbo

回答

3

如果你想發送字節,我建議你閱讀字節,如果你想發送文本,我建議你閱讀文本。你不應該嘗試混搭,否則你很可能會感到困惑。

byte[] bytes = new BigInteger("70798090999a9b9c9d9e9fa0a1a2", 16).toByteArray(); 

ServerSocket ss = new ServerSocket(1234); 
Socket c = new Socket("localhost", 1234); 
Socket s = ss.accept(); 
final OutputStream out = s.getOutputStream(); 
out.write(bytes.length); 
out.write(bytes); 

final DataInputStream in = new DataInputStream(c.getInputStream()); 
int length = in.read(); 
byte[] bytes2 = new byte[length]; 
in.readFully(bytes2); 

System.out.println(new BigInteger(1, bytes2).toString(16)); 
c.close(); 
s.close(); 
ss.close(); 

打印

70798090999a9b9c9d9e9fa0a1a2 
3

您正在發送字節數組並僅讀取一個字節。

你必須使用循環像下面這樣寫着:

byte[] arr = new byte[1024]; 
while (in.read(arr) >= 0) { 
    // do something with the data. 
} 

這會工作,但它仍然不是你真正需要的。真的,你使用字符串進行操作,但是然後將字符串手動轉換爲字節數組,然後再讀取字節以手動將它們再次轉換爲字符串?

相反,你應該使用的PrintWriter寫字符串:

PrintWriter writer = new PrintWriter(new OutputStreamWriter(out)); 
writer.write(str); 

,然後使用BufferedReader中,當你正在閱讀的數據。

BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
String line = reader.readLine(); 
+0

實際上,最後我想發送非字符串的字節數組,這就是爲什麼我將字符串轉換爲字節數組進行測試的原因。 – ThePiachu

+0

除非保存read()返回的計數,否則它將不起作用,因此您知道有多少個字節。讀取在這段代碼中永遠不會返回零。 – EJP

1

擺脫一切準備就緒()測試。這些讀取會阻塞,直到數據到達,因此調用ready()實際上浪費時間,並且可能會丟失數據。

相關問題