問題
服務端Socket,accept()到一個socket對象後,取出其InputStream sis
對象,sis.read()
一直取不到-1
解決
在客戶端Socket,當OutputStream sos = socket.getOutputStream();
在對sos對象操作完畢後,即數據寫入完成,並且flush()後,需要調用socket.shutdownOutput();
告訴服務端數據傳輸完畢.解決以上問題.
客戶端代碼
import java.io.OutputStream;
import java.net.Socket;
public class TcpSocketClient {
public static void main(String[] args){
Thread t = new Thread(){
public void run() {
try {
Socket socket = new Socket("127.0.0.1", 47708);
OutputStream sos = socket.getOutputStream();
for (int i = 0; i < 100; i++) {
Thread.sleep(500);
sos.write((byte)i);
int result = 1;
result *= i;
}
sos.flush();
//特別注意要加上這個,不然服務端的socket.getInputStream().read()一直獲取不了-1.
socket.shutdownOutput();
socket.close();
System.out.println("client socket finish!");
} catch (Exception e) {
System.out.println(e);
}
};
};
t.start();
}
}
服務端代碼
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class TcpSocketServer {
public static void main(String[] args) {
try {
System.out.println("TcpSocketServer start!");
ServerSocket serverSocket = new ServerSocket(47708);
while (true) {
System.out.println("TcpSocketServer waiting accept!");
Socket socket = serverSocket.accept();
System.out.println("TcpSocketServer accept and dealing!");
InputStream sis = socket.getInputStream();
int size = sis.available();
byte[] data = new byte[512];
int k = -1;
while((k = sis.read(data)) != -1) {
System.out.println(" k = " + k + " size = " + size + " Collect form Client data = " + Arrays.toString(Arrays.copyOf(data, k)));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}