安卓socket实现QQ加好友聊天功能

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,大家下载好像要收费,第一次发博客,写的不太好,见谅。

加油!!!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值