Server端
server端是用Java实现的,看代码就行,要说的就是每有一个客户端连接进来就开启一个线程来操作,还有假如有客户端断开服务器连接之后,会向服务端发送好多null值,服务器还会异常报错,我查了一下,好像是和什么心跳包有关,但是我没有深究,写了这个之后,我发现我Java学的也并不是很好,我打算再把Java基础打牢固一点,边学边研究吧,我的解决办法就是接收到消息为null的时候就打印客户端断开连接,然后把客户端移除然后退出循环。
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
public class Server {
private static final HashMap<String, Socket> AllClient = new HashMap<>();
public static void main(String[] args) {
try {
//建立Server Socket,监听端口8888
ServerSocket ss = new ServerSocket(8888);//【代码1】
System.out.println("启动服务器....");
while (true) {
Socket s = ss.accept();
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
String UserToFriend = br.readLine();
if (UserToFriend != null) {
String[] UserAndFriend = UserToFriend.split(" ");
System.out.println("客户端:" + UserAndFriend[0] + "已连接到服务器");
AllClient.put("" + UserAndFriend[0], s);
new Thread(new Task(UserAndFriend[0], s, UserAndFriend[1], AllClient)).start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class Task implements Runnable {
Socket socket;
HashMap<String, Socket> Client;
String user;
String friend;
private Task(String user, Socket socket, String friend, HashMap<String, Socket> Client) {
this.user = user;
this.socket = socket;
this.friend = friend;
this.Client = Client;
}
@Override
public void run() {
try {
while (!socket.isClosed()) {
//通过Socket获取连接上的输入字符流。
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
// 读取客户端发送来的消息
String mess = br.readLine();
if (mess == null) {
System.out.println("客户端" + user + "已断开服务器");
Client.remove("" + user);
break;
}
if (Client.containsKey(friend)) {
Socket FriendSocket = Client.get(friend);
System.out.println("客户端" + user + "给" + "客户端" + friend + "发送消息:" + mess);
//通过Socket获取连接上的输出字符流。
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(FriendSocket.getOutputStream(), StandardCharsets.UTF_8));
bufferedWriter.write(mess + "\n");
bufferedWriter.flush();
} else {
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8));
bufferedWriter.write("该用户不在线..." + "\n");
bufferedWriter.flush();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Client端
client端是用安卓写的,因为得实现加好友,以及向好友对话的功能,所以我得做一个注册账号的功能,然后账号为主键,用于区分用户,当开启聊天之后,会像客户端传递两个值,一个是用户登录的账号,一个是想要对话的人的账号,然后服务端会判断想要对话的人的账号是否以及连接到服务器,连接到了就可以对话,没链接到的话就提示用户不在线,因为代码比较多就不展示了,大家可以看我上传的文件,里面就是我写的工程,如果要运行我写的工程的话记得把IP给改了,数据库地址也改成自己的,然后记得服务器的端口号和客户端的端口号得是一样的,我的不一样是因为我那个客户端的是外网地址和端口,如果大家想要外网连接的话可以在网上找点教程,把IP和端口改了就行。
总结
因为我也是菜鸟,写这个也是为了想学习一些东西,像不同时在同一个对话框中聊天就会显示对方不在线,还有就算是登录了账号有人发消息也收不到消息提示,还有很多问题没有解决,我觉得我还是得加强一些基础学习,懂的也太少太少,发这个主要是为了表达一下自己的想法,写这个在网上搜了很多相关的博客,感觉有点杂,所以我想让那些也想做这个的好找一点,如果有什么不懂的可以说一说,我懂得也不多,但是可以互相讨论,毕竟写这个的目的就是为了学习。
https://download.csdn.net/download/qq_61901126/88139676
工程网盘地址
链接:https://pan.baidu.com/s/1CDMljQ3xETJM4YaATse71A?pwd=8bgm
提取码:8bgm
突然发现资源发布在csdn,大家下载好像要收费,第一次发博客,写的不太好,见谅。
加油!!!!!