简单的聊天程序:
客户端
-
开启了两个线程,分别是监听线程,用于监听服务端发过来或者转发过来的信息
-
输入线程,用于实时监听键盘的输入
服务端
- 实现了好友互发信息
- 上线好友通知
package com.lee.code.replace;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* @description:
* @author:
* @create: 2020-12-28
*/
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",8882);
Thread t1 = new Thread(new Writer(socket));
Thread t2 = new Thread(new Listener(socket));
t1.start();
t2.start();
} catch (IOException e) {
e.printStackTrace();
}
}
static class Writer implements Runnable{
Socket socket;
public Writer(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try{
InputStream in = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
while(true){
String msg = reader.readLine();
System.out.println(msg);
}
}catch (Exception e){
}
}
}
//监听线程
static class Listener implements Runnable{
Socket socket ;
public Listener(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
OutputStream out = socket.getOutputStream();
BufferedWriter pw = new BufferedWriter(new OutputStreamWriter(out));
while(true){
Scanner scanner = new Scanner(System.in);
String text = scanner.next() + "\n";
pw.write(text);
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.lee.code.replace;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @description: Server
* @author:
* @create: 2020-12-28
*/
public class Server {
/**
* 在线用户列表
*/
Map<String, PrintWriter> loginUsers = new HashMap<>();
//在线好友列表
static Map<String, List<String>> friendsList = new HashMap<>();
static {
friendsList.put("杨老板", Arrays.asList(new String[]{"黄老二"}));
friendsList.put("黄老二", Arrays.asList(new String[]{"杨老板", "李老板"}));
friendsList.put("李老板", Arrays.asList(new String[]{"黄老二", "李老三"}));
}
public void listen() {
try {
ServerSocket serverSocket = new ServerSocket(8882);
while (true) {
Socket socket = serverSocket.accept();
ClientHandler clientHandler = new ClientHandler(socket);
ExecutorService executorService = Executors.newFixedThreadPool(100);
executorService.execute(clientHandler);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
LeeServer server = new LeeServer();
server.listen();
}
public List<String> getOnlineFriends(String username) {
List<String> onlinePersons = new ArrayList<>(loginUsers.keySet());
List<String> tempList = new ArrayList<>();
tempList.addAll(friendsList.get(username));
tempList.retainAll(onlinePersons);
return tempList;
}
public class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
public synchronized void sendMsg(String msg) throws IOException {
if(socket == null) throw new RuntimeException("socket is null");
OutputStream out = socket.getOutputStream();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(out), true);
pw.println(msg);
}
public synchronized void sendMsg(PrintWriter writer,String msg) throws IOException {
writer.println(msg);
}
@Override
public void run() {
try {
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
PrintWriter pw;
BufferedReader bufferedReader;
String loginUserName;
pw = new PrintWriter(new OutputStreamWriter(out), true);
bufferedReader = new BufferedReader(new InputStreamReader(in));
while (true) {
sendMsg("【登录】请输入用户名:");
loginUserName = bufferedReader.readLine();
if (!friendsList.containsKey(loginUserName)) {
sendMsg("没有查到该用户" + "\n");
} else {
loginUsers.put(loginUserName, pw);
List<String> friends = friendsList.get(loginUserName);
List<String> onlineFriends = getOnlineFriends(loginUserName);
sendMsg("您的好友列表:" + friends);
sendMsg("您的在线好友:" + onlineFriends);
//并将上线的消息广播给所有在线好友
for (String onlineFriend : onlineFriends) {
PrintWriter outPrint = loginUsers.get(onlineFriend);
sendMsg(outPrint,loginUserName+"上线啦");
}
break;
}
}
while (true) {
//想谁发信息
sendMsg("发送给:");
String friendName = bufferedReader.readLine();
if (friendsList.get(loginUserName).indexOf(friendName) != -1) {
if (loginUsers.get(friendName) != null) {
sendMsg("[TO:]" + friendName + ":" + "\n");
String line = bufferedReader.readLine();
PrintWriter outPut = loginUsers.get(friendName);
sendMsg(outPut,"[from:" + loginUserName + "]" + line );
} else {
sendMsg("该好友不在线");
}
} else {
sendMsg("该好友不存在");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}