一、目的
实现下面效果:
1.每个客户端一个名称
2.私聊
3.群聊
4.发文件
客户端只能向服务器端发送文件或者文字 服务器端只能得到客户端发来的数据,所以 必须服务器端和客户端有一个规范
客户的意图可以在其发送的字符里面体现
1.登录 u+姓名u+
2.私聊 p+姓名!聊天内容p+
3.群聊 a+ 聊天内容 a+
4.发文件 f+
5.发语音 v+
服务器的返回体现意思
登录 成功 1 失败 -1
二、代码
1.服务器端
主线程
public class Server {
//保存每个用户的姓名和socket
public static UserManager manager = new UserManager();
public static void main(String[] args){
try(ServerSocket serverSocket = new ServerSocket(8000)){
//监听所有来链接的客户端
while(true){
Socket socket = serverSocket.accept();
//让子线程处理socket
new ServerThread(socket).start();
}
}catch (IOException e){
//e.printStackTrace();
}
}
}
子线程
class ServerThread extends Thread{
private Socket socket;
public ServerThread(Socket socket){
this.socket = socket;
}
@Override
public void run() {
BufferedReader bufferedReader = null;
PrintStream ps = null;
try {
//登录
//得到对应的输入流
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//得到对应的输出流
ps = new PrintStream(socket.getOutputStream());
String line = null;
while((line = bufferedReader.readLine()) != null){
if(line.startsWith(ChatProtocol.LOGIN_FLAG)&&line.endsWith(ChatProtocol.LOGIN_FLAG)) {
//获取名字
int endIndox = line.length()-2;
String name = line.substring(2, endIndox);
判断这个用户是否已经登录
if (Server.manager.isLogined(name)) {
//已登录
//发送结果给客户端
ps.println(ChatProtocol.FAILURE);
} else {
//未登录
//保存当前登录