我真的很困惑这个客户端-服务器连接示例如何以及为何工作。
我有两个班级,
NetworkClient
和NetworkServer
。
NetworkClient
创建一个套接字并将其连接到服务器:
class NetworkClient {
public static void main(String[] args) {
Socket socket = null;
try {
socket = new Socket("localhost", 3141);
OutputStream out = socket.getOutputStream();
PrintStream ps = new PrintStream(out, true);
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
ps.println("Es begab sich aber zu der Zeit,");
System.out.println("client sent: Es begab sich aber zu der Zeit,");
System.out.println("client received: "+reader.readLine());
}
//some other code
}
}
并且
NetworkServer
接受该套接字:
public class NetworkServer {
private final ServerSocket srv;
public NetworkServer(int port) throws IOException {
srv = new ServerSocket(port);
}
private void connectAndTalk() {
Socket socket = null;
try {
socket = srv.accept();
communicate(socket);
}
// some code
}
private void communicate(Socket socket) throws IOException, InterruptedException {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintStream out = new PrintStream(socket.getOutputStream());
String s;
do {
s = in.readLine();
System.out.println("server received: "+s);
if(s.equals("Es begab sich aber zu der Zeit,")) {
TimeUnit.SECONDS.sleep(4);
out.println("dass ein Gebot ausging vom Kaiser Augustus,");
}
// some code
客户端写入其输出流并从其输入中读取。
为什么服务器从客户端的输入而不是输出流中读取?同样,为什么服务器要写入客户端的输出流?为什么看起来不是这样的?
private void communicate(Socket socket) throws IOException, InterruptedException {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getOutputStream()));
PrintStream out = new PrintStream(socket.getInputStream());
InputStream
用于入站数据。 OutputStream
表示出站数据。 就这么简单。
套接字有两个端点 - 客户端端点和服务器端点。 流对于每个端点都是本地的:
在客户端,
InputStream
用于入站数据FROM 服务器,OutputStream
用于出站数据TO 服务器。
在服务器端,
InputStream
用于FROM客户端的入站数据,OutputStream
用于TO客户端的出站数据。