问题
服务端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();
}
}
}