Java 套接字客户端-服务器连接。为什么服务器从客户端的输入读取而不是从输出流读取?

问题描述 投票:0回答:1

我真的很困惑这个客户端-服务器连接示例如何以及为何工作。

我有两个班级,

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());
java sockets io stream
1个回答
0
投票

InputStream
用于入站数据。
OutputStream
表示出站数据。 就这么简单。

套接字有两个端点 - 客户端端点和服务器端点。 流对于每个端点都是本地的:

  • 在客户端,

    InputStream
    用于入站数据FROM 服务器,
    OutputStream
    用于出站数据TO 服务器。

  • 在服务器端,

    InputStream
    用于FROM客户端的入站数据,
    OutputStream
    用于TO客户端的出站数据。

© www.soinside.com 2019 - 2024. All rights reserved.