Java进阶作业二:使用BIO写一个EchoServer

写在开头

自Java1.4之后,Java中有两套IO API,一套基于流(InputStream、OutputStream),一套基于Channel + Buffer(New-IO)。前者只支持阻塞的IO模型,后者既支持阻塞IO也支持非阻塞IO,同时还有事件驱动的IO模型(使用Selector,一个线程可处理多个Channel)。

这里我使用传统IO写一个EchoServer,所谓EchoServer就是服务器会将收到的内容原封不动的发送给客户端。下面是服务端和客户端的代码。

服务端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class BioGreetServer {

    private ServerSocket serverSocket;
    private Socket clientSocket;
    private PrintWriter out;
    private BufferedReader in;

    public void start(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        clientSocket = serverSocket.accept();
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        System.out.println("server starting...");
        while (true) {
            String greeting = in.readLine();
            // 客户端发送 close server,服务器退出
            if ("close server".equals(greeting)) {
                out.println("server closed");
                stop();
                break;
            } else {
                // 服务器将收到的内容返回给客户端
                out.println(greeting);
            }
        }

    }

    public void stop() throws IOException {
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
    }

    public static void main(String[] args) throws IOException {
        BioGreetServer server = new BioGreetServer();
        server.start(8888);
    }
}

客户端

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class BioClient {

    private Socket client;
    private PrintWriter out;
    private BufferedReader in;

    public void startConnection(String ip, int port) throws IOException {
        client = new Socket(ip, port);
        out = new PrintWriter(client.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
    }

    public String sendMsg(String msg) throws IOException {
        out.println(msg);
        String resp = in.readLine();
        return resp;
    }

    public void stopConnection() throws IOException {
        in.close();
        out.close();
        client.close();
    }

    public static void main(String[] args) throws IOException {
        BioClient client = new BioClient();
        client.startConnection("127.0.0.1", 8888);
        while (true) {
            Scanner in = new Scanner(System.in);
            String msg = in.nextLine();

            // 控制台发送exit,退出客户端
            if ("exit".equals(msg)) {
                client.stopConnection();
                break;
            }

            String resp = client.sendMsg(msg);
            System.out.println("server-resp:" + resp);
        }
    }

}

运行效果

posted @ 2021-05-26 21:37  陈玉林  阅读(66)  评论(0编辑  收藏  举报