客户端
package com.xsh.internet.socket;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/*
客户端
*/
public class ChatClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.9.21.235", 9999);
//创建两个线程实现读写同步进行
//读
new Thread(new Runnable() {
@Override
public void run() {
try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
while(true) {
String data = br.readLine();
System.out.println(data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//写
new Thread(new Runnable() {
@Override
public void run() {
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
Scanner input = new Scanner(System.in);
while(true){
String str = input.next();
bw.write(str);
bw.newLine();
bw.flush();
if(str.equals("88")||str.equals("拜拜")||str.equals("退出")){
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
服务端
package com.xsh.internet.socket;
import java.io.*;
import java.net.Socket;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatThread extends Thread {
private List<Socket> socketList;
private Socket socket;
private String ip;
private String data;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public ChatThread(Socket socket, List socketList){
this.socket = socket;
this.socketList = socketList;
}
public void run(){
try (BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
while(true) {
data = br.readLine();
String regex = "\\[10.9.21.[0-9]{3}\\]";
//匹配ip地址,这里需要自己改,我这里直接用的自己格式的ip,没有匹配标准的
String ipreg = "((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})(\\.((2(5[0-5]|[0-4]\\d))|[0-1]?\\d{1,2})){3}";
//这里regex需要自己更改
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(data);
while(matcher.find()){
ip = matcher.group();
}
data = data.replaceAll(regex, "");
if(ip != null) {
//我这里是把发送的ip地址用[]包住了,所以这里去掉
ip = ip.replaceAll("\\[|\\]", "");
}
System.out.println(socket.getLocalAddress().getHostName() + "发送内容:" + data + "发送到:" + ip);
//如果发送以下内容,正常退出,并且列表中删除该Socket
if(data.equals("88")||data.equals("拜拜")||data.equals("退出")){
System.out.println(socket.getInetAddress().getHostAddress() + "正常下线了");
socketList.remove(socket);
break;
}
//遍历ArrayList,找出要发送消息的Socket,将消息发送给该ip
for (int i = 0; i < socketList.size(); i++) {
if (socketList.get(i).getInetAddress().getHostAddress().equals(ip)) {
Socket socket = socketList.get(i);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bw.write("[" + socket.getInetAddress().getHostAddress() + "]" + data);
bw.newLine();
bw.flush();
break;
}
}
}
} catch (IOException e) {
System.out.println("异常下线");
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行代码
package com.xsh.internet.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ChatServer {
public static void main(String[] args) {
ServerSocket listen = null;
List<Socket> socketList = Collections.synchronizedList(new ArrayList<>());
try {
//设置端口号为9999
listen = new ServerSocket(9999);
System.out.println("服务器启动");
while(true) {
Socket socket = listen.accept();
//将监听到的代码添加到列表中
socketList.add(socket);
System.out.println(socket.getInetAddress().getHostAddress());
ChatThread chatThread = new ChatThread(socket, socketList);
//使用多线程实现多人聊天
new Thread(chatThread).start();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(listen != null){
listen.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}