簡體   English   中英

JAVA中的I / O-從java.net.Socket讀取數據

[英]I/O in JAVA - reading data from java.net.Socket

我的客戶端有問題-我用JAVA開發的服務器應用程序。 我使用java.net*包中的SocketServerSocket 當客戶端連接到服務器時,客戶端發送消息,例如7200字節。 在服務器中,我使用InputStream 有時我收到整個消息(7200字節),但是很多時候我收到的消息少於7200字節。 JAVA中有什么方法可以接收整個消息並關閉連接? 也許我應該在JAVA中使用其他庫進行tcp / ip連接?

可能會有所幫助: InputStream.read()文檔。

讀取從輸入流一定數量的字節,並將其存儲到緩沖數組b。 實際讀取的字節數以整數形式返回。

直到整個字節緩沖區填滿或流結束,該方法才會阻塞。 相反,它會返回當前可用的盡可能多的數據。

從文件讀取時,這不太可能發生,但是對於套接字來說,這是很正常的。

返回已寫入字節緩沖區的實際字節數,因此您可以確定是否有足夠的數據。

您可以使用read(buf,start,len)來從緩沖區的開頭而不是從數據塊的開頭開始。 例如,如果你正在讀正好 7200字節,這樣做:

byte [] buf = new byte[7200];
int len = 7200;
int pos=0;

while(len > 0) {
  int rd = is.read(buf, pos, len);
  if(rd<0) {
      //premature EOF
      break;
  }
  pos += rd;
  len -= rd;
}

否則,如果您不預先知道消息的長度,則可以選擇幾種方法。 其中:

  1. 發送消息長度為前4個字節,然后始終先讀取4個字節,然后分配必要大小的緩沖區並讀入其中
  2. 讀入緩沖區,直到收到“ END-OF-MESSAGE”標記。 例如“ END-OF-LINE”。 找到它后-停止閱讀並處理消息。

我建議從jboss到tcpip通信使用jgroups( http://www.jgroups.org/manual/html/index.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM