实现效果:服务器等待客户端的连接,然后开始聊天。(理想的效果应该是服务器做echo,客户端和客户端聊)。
注意事项:内部类是动态的,main函数是静态的,不能直接在main中new一个内部类,需要实例化main所在的类。
服务器:
package wanghm;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class HelloWorld {
public class ReceiveAgent implements Runnable {
Socket socket;
ReceiveAgent(Socket skt){
socket = skt;
}
@Override
public void run() {
try {
InputStreamReader ipr = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(ipr);
String msg;
while(true) {
msg = reader.readLine();
System.out.println("Receive: " + msg);
if(msg.equalsIgnoreCase("over"))break;
}
reader.close();
socket.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
public void go() {
try {
ServerSocket serverSocket = new ServerSocket(50001);
while(true) {
System.out.println("Server waiting...");
Socket s = serverSocket.accept();
System.out.println("Server accept: " + s.getPort());
Thread thread = new Thread(new ReceiveAgent(s));
thread.start();
PrintWriter pw = new PrintWriter(s.getOutputStream());
String message;
Scanner scanner = new Scanner(System.in);
while(true) {
message = scanner.nextLine();
pw.println(message);
pw.flush();
if(message.equalsIgnoreCase("over"))break;
}
pw.close();
s.close();
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new HelloWorld().go();
}
}
客户端
package wanghm;
import java.net.*;
import java.util.Scanner;
import java.io.*;
public class SocketClient {
public class ReceiveAgent implements Runnable {
Socket socket;
ReceiveAgent(Socket skt){
socket = skt;
}
@Override
public void run() {
try {
InputStreamReader ipr = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(ipr);
String msg;
while(true) {
msg = reader.readLine();
System.out.println("Receive: " + msg);
if(msg.equalsIgnoreCase("over"))break;
}
reader.close();
socket.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
public void go() {
try {
Socket socket = new Socket("127.0.0.1", 50001);
System.out.println("Client connecting...");
Thread thread = new Thread(new ReceiveAgent(socket));
thread.start();
PrintWriter pw = new PrintWriter(socket.getOutputStream());
String message;
Scanner scanner = new Scanner(System.in);
while(true) {
message = scanner.nextLine();
pw.println(message);
pw.flush();
if(message.equalsIgnoreCase("over"))break;
}
pw.close();
socket.close();
} catch(Exception ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new SocketClient().go();
}
}