创建一个 BIO server
2020-08-11 本文已影响0人
leeehao
在 Java 中使用 java.net.Socket
和 java.net.ServerSocket
操作套接字。
server
package bio;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class BioServer {
private int port;
public BioServer(int port) {
this.port = port;
}
public void listen() throws IOException {
try(ServerSocket server = new ServerSocket(this.port)) {
for (;;) {
acceptedSocket(server.accept());
}
}
}
private void acceptedSocket(Socket socket) {
new Thread(() -> {
try(Socket connectionSocket = socket) {
//Create Input&Outputstreams for the connection
InputStream inputToServer = connectionSocket.getInputStream();
OutputStream outputFromServer = connectionSocket.getOutputStream();
Scanner scanner = new Scanner(inputToServer, "UTF-8");
PrintWriter serverPrintOut = new PrintWriter(new OutputStreamWriter(outputFromServer, "UTF-8"), true);
serverPrintOut.println("Hello World! Enter Peace to exit.");
//Have the server take input from the client and echo it back
//This should be placed in a loop that listens for a terminator text e.g. bye
boolean done = false;
while(!done && scanner.hasNextLine()) {
String line = scanner.nextLine();
serverPrintOut.println("Echo from <Your Name Here> Server: " + line);
if(line.toLowerCase().trim().equals("peace")) {
done = true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
public static void main(String[] args) throws IOException {
BioServer bioServer = new BioServer( 8080);
bioServer.listen();
}
}
client
public class Client {
public static void main(String[] args) throws IOException {
for (int i = 0; i < 2; i++) {
new Thread(() -> {
Socket socket = null;
try {
socket = new Socket("127.0.0.1", 8080);
} catch (IOException e) {
e.printStackTrace();
}
Scanner scanner = null;
try {
scanner = new Scanner(socket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
for (;;) {
try {
System.out.println("Server response: " + scanner.nextLine());
TimeUnit.MILLISECONDS.sleep(new Random().nextInt(500));
String message = Thread.currentThread().getName() + "\n";
socket.getOutputStream().write(message.getBytes());
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}