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);
}
}
}