继上一篇实现群聊,现在记录私聊的实现,下一篇记录一下实现文件的传输。
目录
一、实现思路
用户输入@name的方式发送消息(类似于QQ你@别人),但是想通过服务器端从信息中解析出这个@的人的名字不太可能,因为服务器端不知道截多长才是用户的名字。所以只能判断信息中是否包含了@name。String类的contains()方法可以做到。
服务端有以下两种思路去实现私聊
1.实现思路一
先判断用户是否@人了。
如果@人了,则发送消息的用户的服务套接字让其他的服务套接字判断这个@的名字是不是自己服务的用户的名字,如果是就转发,不是就不转发。
如果没@,则全部转发。
2.实现思路二
先判断用户是否@人了。
如果@人了,发送消息的用户的服务套接字根据@的名字让该名字的服务套接字转发。(哈希表)
如果没@,则全部转发。
二、实现代码
我们的用户端只负责输入,因此只需要改变服务端的代码。(这里也只记录服务器端的代码,用户端的代码和工具类代码在上一篇)。
1.思路一(服务端代码)
import java.io.Closeable;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import com.csi.qunliaoTest.OpenClient.ReceiveMsgThread;
public class OpenServer {
//一个列表存储服务Socket
List<ClientSocket> clientSockets =new ArrayList<>();
ServerSocket serverSocket = null;
//构造方法中创建服务器ServerSocket
public OpenServer() {
try {
//因为本代码是在云服务器运行,直接用InetAddress.getLocalHost()方法绑定云服务器的IP地址及端口号
serverSocket = new ServerSocket(7777, 50, InetAddress.getLocalHost());
System.out.println("----------服务器----------");
} catch (IOException e) {
//发生异常。调用自己写的Utils类关闭服务器
Utils.close(serverSocket);
}
//ServerSocket绑定成功,开始等待用户接入
if(serverSocket.isBound())
acceptClient();
}
//等待用户,并为他生成服务Socket
private void acceptClient(){
//while循环让服务器一直可以接入用户,一个用户接入服务器,服务器就生成一个为该用户服务的Socket
while(true) {
Socket socket=null;
try {
//ServerScoket的accept()方法是一个阻塞方法,他会在这里等用户接入,直到有用户接入,才会运行下面的代码
socket=serverSocket.accept();
System.out.println("一个用户接入.....");
//用ClientSocket类包装Scoket