小模拟服务器和客户端,出现了很奇怪的问题!谁知道···
document 1:
package com.network;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerSocketTest {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(4000);
Socket socket = serverSocket.accept(); // 产生 Socket 对象,试图和服务器连接.
InputStream in = socket.getInputStream();// 获得输入流.
OutputStream out = socket.getOutputStream();// 获得输出流.
byte[] buffer = new byte[100];// 用于存储输入流读取的字节.
int len = 0;
// while (-1 != (len = in.read(buffer, 0, buffer.length))) {
// String s = new String(buffer, 0, len);
// System.out.println(s);
// }
len = in.read(buffer, 0, buffer.length);
System.out.println(new String(buffer, 0, len));
out.write("Welcome".getBytes());// 向服务器发送信息.
in.close();
out.close();
socket.close();
}
}
document 2:
package com.network;
import
java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.
UnknownHostException;
public class ClientSocket {
public static void main(String[] args) throws UnknownHostException,
IOException {
Socket socket = new Socket("127.0.0.1", 4000); // new Socket 对象,试图和服务器连接.
OutputStream out = socket.getOutputStream(); // 获得输出流.
InputStream in = socket.getInputStream(); // 获得输入流.
try {
Thread.sleep(3000); // 为了防止没能向服务器写信息,让线程睡眠.
} catch (InterruptedException e) {
e.printStackTrace();
}
out.write("Hello".getBytes()); // 向服务器发送信息.
byte[] buffer = new byte[100]; // 用于存储输入流读取的字节.
int len = 0;
// while (-1 != (len = in.read(buffer, 0, buffer.length))) {
// String s = new String(buffer, 0, len);
// System.out.println(s);
// }
len = in.read(buffer, 0, buffer.length);
System.out.println(new String(buffer, 0, len));
out.close();
in.close();
socket.close();
}
}
问题:上面是我简单模拟服务器和客户端信息的发送和接收。
我发现在两个document中,在 InputStream read 的时候,如果用 我注释的代码代替下面的两行,就会出现服务器能收到客户端发的信息,但是客户端收不到信息。
如果像现在我注释的代码,就会都能正常接收,好奇怪的问题哈····谁能知道是什么情况呢?
------最佳解决方案--------------------无论是接收还是发送,都是会阻塞主线程的,你要先这么思考问题。
也就是说,如果你企图接收信息,而对方并没有发送的情况下,会持续阻塞在read()函数。
反之如果你企图拼命发送信息,而对方没有接收的情况下,当发送缓冲区满也会持续阻塞在write()函数。
所以要打破这个结构,那么一般来说“接收”最好是独立线程来处理,无论是服务器端还是客户端。
------其他解决方案--------------------我发现 代码:
“
while (-1 != (len = in.read(buffer, 0, buffer.length))) {
String s = new String(buffer, 0, len);
System.out.println(s);
}
”
在(服务器)有问题,但是这段代码在(客户端)没有问题!
------其他解决方案--------------------我猜是 (服务器)中的那段代码出现死循环了,总想着是不是与我的执行顺序有关(我是先执行服务器,后执行客户端,也只能这样),但是怎么想都简单不太通顺。