使用Socket模拟聊天室
客户端
客户端读线程
public class EchoClientReadThread implements Runnable{
private Socket socket;
private BufferedReader in;
public EchoClientReadThread(Socket socket,BufferedReader in){
this.in = in;
this.socket = socket;
}
@Override
public void run() {
try {
String str = null;
while ((str = in.readLine()) != null){
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端写线程
public class EchoClientWriteThread implements Runnable{
private PrintWriter out;
private Socket socket;
Scanner scanner;
public EchoClientWriteThread(Socket socket,PrintWriter out,Scanner scanner){
this.scanner = scanner;
this.out = out;
this.socket = socket;
}
@Override
public void run() {
String data =null;
while ((data=scanner.nextLine())!=null){
out.println(data);
}
}
}
客户主函数
public class EchoClient {
public static void main(String[] args) {
String host = "127.0.0.1";
int port = 12345;
try {
Socket socket = new Socket(host,port);
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
Scanner scanner = new Scanner(System.in);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Thread t1 = new Thread(new EchoClientReadThread(socket,in));
Thread t2 = new Thread(new EchoClientWriteThread(socket,out,scanner));
t1.start();
t2.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
服务端线程
public class EchoServerThread implements Runnable{
private ArrayList<Socket> socketarr ;
private Socket socket;
public EchoServerThread(ArrayList Socketarr,Socket socket){
this.socketarr = Socketarr;
this.socket = socket;
}
@Override
public void run() {
try {
InetSocketAddress address = (InetSocketAddress) socket.getRemoteSocketAddress();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data = null;
while ((data= in.readLine())!=null){
System.out.println("来自:"+address.getHostName()+":"+address.getPort()
+"的信息:"+data);
for (Socket s:socketarr){
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("来自:"+address.getHostName()+":"+address.getPort()
+"的信息:"+data);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端主函数
public class EchoServer {
public static void main(String[] args) {
int port = 12345;
try {
ArrayList<Socket> arrayList = new ArrayList<>();
ServerSocket sst = new ServerSocket(port);
while (true) {
Socket ssc = sst.accept();
InetSocketAddress address = (InetSocketAddress) ssc.getRemoteSocketAddress();
System.out.println(address.getHostName()+":"+address.getPort()+"已连接");
arrayList.add(ssc);
new Thread(new EchoServerThread(arrayList, ssc)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}