《Java核心技术II》实现服务器
实现服务器
这节实现简单服务器,可以向客户端发送信息。
服务器套接字
ServerSocket用于建立套接字
var s = new ServerSocket(8189);
建立一个监听端口8189的服务器。
Socket incoming = s.accept();
此对象可以得到输入流和输出流。
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
示例来发送文本,将流转换为扫描器和写入器。
var in = new Scanner(inStream,StandardCharsets.UTF-8);
var out = new PrintWriter(new OutputStreamWriter(outStream,StandardCharsets.UTF-8),true);
给客户端发送一条问候信息:
out.println("你好!输入BYE关闭它。");
简单服务器程序中,只是读取客户端输入,每次读一行,并回送这一行。
实际中是要经过处理的。
String line = in.nextLine();
out.println("回复:"+line);
if(line.strip().equals("BYE")) done = true;
代码最后,关闭连接进来的套接字。
incoming.close();
服务器回应案例
package 第4章网络.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class EchoServer {
public static void main(String[] args) throws IOException {
try (var s = new ServerSocket(8189)) {
try (Socket incoming = s.accept()) {
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
try (var in = new Scanner(new InputStreamReader(inStream, StandardCharsets.UTF_8))) {
var out = new PrintWriter(new OutputStreamWriter(outStream, StandardCharsets.UTF_8), true);
out.println("你好!输入BYE关闭它。");
// 回应客户端的输入
boolean done = false;
while (!done && in.hasNextLine()) {
String line = in.nextLine();
System.out.println(line);
out.println("回应:" + line);
if (line.strip().equals("BYE")) {
done = true;
}
}
}
}
}
}
}
打开cmd,chcp 65001,更改代码为UTF-8
telenet ,进入交互界面
set localecho,本地输入回显出来
telnet进行访问
telnet localhost 8189
中文秒退
,原因不详,待解决,英文没问题。
BYE关闭,服务器也终止运行。
比如HTTP web服务器,都会不间断执行下面这个循环
- 通过输入数据流从客户端接收一个命令。
- 解码这个客户端命令。
- 收集客户端所请求的信息。
- 通过输出数据流发送信息给客户端。