服务端:
package test.chat;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author Cris
* @version 1.0
* @className TestServer
* @description <功能描述>
* @date 2020/1/24 23:36
*/
public class TestServer {
//装入连接的socket对象
private static ArrayList<Socket> online = new ArrayList<>();
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket server = new ServerSocket(9988);
boolean flag =true;
while(flag) {
//将连接的socket对象保存到online中
Socket socket = server.accept();
online.add(socket);
//创建线程并启动
MyThread myThread = new MyThread(socket);
myThread.start();
}
//这个没起到作用,我暂时不知道怎么跳出循环
server.close();
}
//匿名内部类
private static class MyThread extends Thread{
private Socket socket;
public MyThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
//获得输入流
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String content;
while((content = br.readLine()) != null){
if("再见".equals(content)){//收到再见后,回复一句,客户端下线
//不回复客户端一直在等待别人发消息,暂时没有想到办法解决
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("服务器跟您说再见!");
break;
}
sendMessageToOthers(socket.getInetAddress().getHostAddress()+"说:"+content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendMessageToOthers(String str){
Iterator<Socket> iterator = online.iterator();
//当ArrayList中还有socket对象,取出来
while(iterator.hasNext()) {
Socket online = iterator.next();
//不给自己发送消息
if(!online.equals(socket)) {
try {
OutputStream os = online.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println(str);
} catch (IOException e) {
//出现异常,该客户掉线
iterator.remove();
}
}
}
}
}
}
客户端:
package test.chat;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* @author Cris
* @version 1.0
* @className TestClient
* @description <功能描述>
* @date 2020/1/24 23:35
*/
public class TestClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.31.195",9988);
//启动线程
SendThread sendThread = new SendThread(socket);
ReciveThread reciveThread = new ReciveThread(socket);
sendThread.start();
reciveThread.start();
//对主线程加塞,等待发送完数据
try {
sendThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//数据发送完也就意味着不再接收
reciveThread.setFlag(false);
//再次对主线程进行加塞,等到数据接收完
try {
reciveThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//关闭socket
socket.close();
}
}
class SendThread extends Thread{
private Socket socket;
public SendThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
while(true) {//一直在输入
//键盘输入
System.out.println("请输入要发送的消息:");
Scanner input = new Scanner(System.in);
String content = input.next();
//将输入的内容发送到服务器
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println(content);
if ("再见".equals(content)) {//"再见"意味着结束输入
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ReciveThread extends Thread{
private Socket socket;
private boolean flag = true;
public ReciveThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
//接收服务器传来的消息
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
while(flag){//当flag为false时不再接收
String content = br.readLine();
System.out.println(content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void setFlag(boolean flag) {
this.flag = flag;
}
}