public class ServerPlainTest { // 包内包外可见
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8189);
System.out.println("the server has startuped, waiting for connections.");
while (true) { // accept multiple clients connection request.
Socket s = ss.accept();
System.out.println("a client has connected successfully.");
new Thread(new ReceiveHandler(s, Role.SERVER)).start();
new Thread(new SendHandler(s, Role.SERVER)).start();
}
} catch (Exception e) {
System.out.println(e);
}
}
}
public class MessageHandler { // 包内包外可见.
}
// receive msg.
class ReceiveHandler implements Runnable { // 包内可见性.
private Socket socket;
private Role role;
public ReceiveHandler(Socket socket, Role role) {
this.socket = socket;
this.role = role;
}
public void run() {
try {
System.out.println(role + " executes ReceiveHandler.run method.");
InputStream is = socket.getInputStream();
Scanner in = new Scanner(is);
// echo client input
boolean done = false;
while (!done && in.hasNextLine()) {
String line = in.nextLine();
System.out.println("from "+ role + ": " + line);
if (line.trim().equalsIgnoreCase("bye")) {
done = true;
}
}
// close relative instance.
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// send msg.
class SendHandler implements Runnable { // 包内可见性.
private Socket socket;
private Role role;
public SendHandler(Socket socket, Role role) {
this.socket = socket;
this.role = role;
}
public void run() {
PrintWriter pw = null;
try {
System.out.println(role + " executes SendHandler.run method.");
Scanner s = new Scanner(System.in);
OutputStream os = socket.getOutputStream();
pw = new PrintWriter(os, true); // autoFlush=true.
if (role.equals(Role.SERVER)) {
pw.println("from server: you've connected with the server.");
}
while (s.hasNext()) {
String line = s.nextLine();
pw.println(line);
}
pw.println("connection closed successfully. bye!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
【2】solution:在编译 ServerPlainTest.java 之前,编译 MessageHandler.java, 这样会附带编译 ReceiverHandler.java and SendHandler.java ;