待完善
package BIO;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class EchoServer {
private static class ClientThread implements Runnable { // 客户端线程类
private Socket client = null; // 客户端Socket
private Scanner scan = null; // 输入流
private PrintStream out = null; // 输出流
private boolean flag = true; // 循环标记
public ClientThread(Socket client) throws Exception { // 接收客户端Socket
this.client = client; // 保存Socket
this.scan = new Scanner(client.getInputStream()); // 输入流
this.scan.useDelimiter("\n"); // 设置分隔符
this.out = new PrintStream(client.getOutputStream()); // 输出流
}
@Override
public void run() { // 线程执行
while (this.flag) { // Echo循环处理
if (scan.hasNext()) { // 有数据发送
String val = scan.next().trim(); // 接收数据
if ("byebye".equalsIgnoreCase(val)) { // 结束响应
out.println("ByeByeBye...."); // 回应信息
this.flag = false; // 结束循环
} else {
out.println("【ECHO】"+ val); // Echo信息
}
}
}
try {
scan.close(); // 关闭输入流
out.close(); // 关闭输出流
client.close(); // 关闭客户端
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(8080); // 设置服务监听端口
System.out.println("等待客户端连接............."); // 打印提示信息
boolean flag = true ; // 循环标记
while (flag) {
Socket client = server.accept() ; // 处于循环中,可以n个服务器连接n个服务端
new Thread(new ClientThread(client)).start();
}
server.close(); // 关闭服务端
}
}
客户端
package BIO;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class EchoClient {
private static final BufferedReader KEYBOARD_INPUT = new BufferedReader(
new InputStreamReader(System.in));
public static String getString(String prompt) throws Exception { // 键盘信息输入
System.out.print(prompt);
String str = KEYBOARD_INPUT.readLine();
return str;
}
public static void main(String[] args) throws Exception {
Socket client = new Socket("localhost", 8080); // 定义服务端的连接信息
// 现在的客户端需要有输入与输出的操作支持,所以依然要准备出Scanner与PrintWriter
Scanner scan = new Scanner(client.getInputStream()); // 接收服务端输入内容
scan.useDelimiter("\n");
PrintStream out = new PrintStream(client.getOutputStream()); // 向服务器端发送内容
boolean flag = true; // 循环标记
while (flag) { // 循环处理
String input = getString("请输入要发送的内容:").trim(); // 获取键盘输入数据
out.println(input); // 加换行
if (scan.hasNext()) { // 服务器端有回应
System.out.println(scan.next()); // 输出回应信息
}
if ("byebye".equalsIgnoreCase(input)) { // 结束判断
flag = false; // 修改循环标记
}
}
scan.close(); // 关闭输入流
out.close(); // 关闭输 出流
client.close(); // 关闭客户端
}
}