服务器类TcpServer
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class TcpServer {
public static List<ServerThread> list = new ArrayList<ServerThread>();
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(9527);
System.out.println("服务器正在监听。。。");
while (true) {
Socket socket = server.accept();
System.out.println("一个客户端成功连接");
ServerThread st = new ServerThread(socket);
list.add(st);
st.start();
}
}
}
客户端类TcpClient
package com.qf.g_hmwk;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class TcpClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket socket = new Socket("127.0.0.1",9527);
new WriteThread(socket).start();
new ReadThread(socket).start();
}
}
服务器负责转发消息的线程类ServerThread
package com.qf.g_hmwk;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.List;
import com.qf.utils.CloseAll;
public class ServerThread extends Thread {
private Socket socket;
private BufferedReader br;
private BufferedWriter bw;
public ServerThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
@Override
public void run() {
welcome();
try {
while (true) {
String msg = br.readLine();
if (msg.startsWith("@") && msg.contains("#")) {
String[] msgs = msg.substring(1).split("#");
String name = msgs[0];
String content = msgs[1];
sendToAnother(name,content);
} else {
sendToOthers(msg);
}
}
} catch (IOException e) {
sendToOthers("【温馨提示】:用户"+getName()+"退出了聊天室。");
} finally {
CloseAll.closeAll(socket,br,bw);
}
}
private void sendToOthers(String msg) {
for(ServerThread st : TcpServer.list) {
if (st != this) {
st.sendMsg(getName()+"说:"+msg);
}
}
}
private void sendToAnother(String name, String content) {
for(ServerThread st : TcpServer.list) {
if (st.getName().equals(name)) {
st.sendMsg(getName()+"悄悄对你说:"+content);
}
}
}
private void welcome() {
try {
String msg = br.readLine();
setName(msg);
for(ServerThread st : TcpServer.list) {
st.sendMsg("【温馨提示】:欢迎"+msg+"进入聊天室");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendMsg(String msg) {
try {
bw.write(msg);
bw.newLine();
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收服务器转发的信息并打印的线程类ReadThread
package com.qf.g_hmwk;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import com.qf.utils.CloseAll;
public class ReadThread extends Thread{
private Socket socket;
private BufferedReader br;
public ReadThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
@Override
public void run() {
try {
while (true) {
String msg = br.readLine();
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
CloseAll.closeAll(socket,br);
}
}
}
接收控制台输入信息发给服务器的线程类WriteThread
package com.qf.g_hmwk;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import com.qf.utils.CloseAll;
public class WriteThread extends Thread{
private Socket socket;
private BufferedReader br;
private BufferedWriter bw;
public WriteThread(Socket socket) throws IOException {
this.socket = socket;
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
}
@Override
public void run() {
try {
System.out.println("请输入用户名:");
while (true) {
String msg = br.readLine();
bw.write(msg);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
CloseAll.closeAll(socket,br,bw);
}
}
}
运行截图
启动服务器以及三个客户端(展示三个客户端)
输入用户名