Socket实现网络聊天室和联系人私聊功能

原创 2017年05月05日 11:13:16

使用socket技术实现网络聊天室和私聊功能

话不多说先上图:

  1. 聊天室群聊页面

聊天室群聊页面

  1. 在线用户的联系人列表
    在线用户的联系人列表

  2. socket连接页面
    socket配置页面

  3. 私聊页面
    与在线联系人私聊页面

项目介绍

  1. 与服务端实现socket连接:每个客户端连接到服务器的时候,服务器会将每个连接的socket保存在list集合中。
  2. 群聊功能:当有一个用户发送群聊消息给服务器的时候,服务器会将所有信息转发给list列表中的所有已连接的客户端。
  3. 私聊功能:用户发送私聊信息给服务器后,服务器会向一个目标ip发送消息。
  4. 显示在线联系人列表:当有新用户登录成功的时候,服务器会将在线联系人的信息用json字符串的形式发送给客户端,客户端通过解析json字符串来获取在线联系人的信息。

自定义一个强大的类SocketEvent:客户端与服务器通信全部都是通过这个类来保存数据的,然后使用fastjson工具来把类对象转换为json字符串来传输。

public class SocketEvent {

    private int type =0;

    private String msg ="";

    private String keyIP =""; // 关键IP

    private String temporaryIP =""; // 临时IP

    public SocketEvent() {
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getKeyIP() {
        return keyIP;
    }

    public void setKeyIP(String keyIP) {
        this.keyIP = keyIP;
    }

    public String getTemporaryIP() {
        return temporaryIP;
    }

    public void setTemporaryIP(String temporaryIP) {
        this.temporaryIP = temporaryIP;
    }
}

type: 标志当前发送的信息是什么类型的信息。服务端和客户端解 析数据就是通过这个它来判断属于哪种类型的消息

public static final int CHAT_PRIVATE  = 111; // 私聊的指令

    public static final int CHAT_GROUP  = 222; // 群聊的指令

    public static final int SOCKET_SUCCESS  = 333; // socket连接成功的指令

    public static final int SOCKET_FAIL  = 444; // socket连接失败的指令

    public static final int CONNECT_SUCCESS  = 666; // socket连接成功的指令

    public static final int CONNECT_FAIL  = 777; // socket连接失败的指令

    public static final int LOGIN_ARG = 888; // socket接收到标志新用户登录的指令

    public static final int CANCEL_ARG  = 999; // socket接收到标志用户注销的指令

    public static final int NEW_CLIENT  = 3332; // 新用户登录的指令

    public static final int ALL_CLIENT  = 3432; // 新用户登录后接收到所有在线用户的指令

    public static final int SEND_PRIVATE  = 5666; // 发送私聊消息的指令

    public static final int SEND_IPlIST  = 6666; // 发送已登录的用户IP集合的指令

keyIP:客户端消息发起者的ip地址

temperoryIP:临时的IP地址,如果是type是私聊类型的那么这个ip代表的就是目标联系人的ip地址

服务端代码 (ServerSocket)

1. 接收客户端的连接

Socket Socketclient = server.accept();

2.开启线程实时接收来自客户端的信息

// 实时获取客户端发送的数据
        @Override
        public void run() {
            try {
                while (true) {
                    if ((acceptLine = in.readLine()) != null) {
                        System.out.println("<接收到的消息是>" + acceptLine);

                        SocketEvent event = JSON.parseObject(acceptLine, SocketEvent.class);

                        switch (event.getType()) {
                        case UtilFactory.CHAT_GROUP:
                            sendMsgAvoid(event.getKeyIP(), acceptLine);
                            break;

                        case UtilFactory.SEND_PRIVATE:
                            event.setType(UtilFactory.CHAT_PRIVATE);
                            sendMsgTarget(event.getTemporaryIP(), JSON.toJSONString(event));

                            break;
                        }

                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

3. 向指定ip发送消息的方法和除了自己ip向其他所有ip发送消息的方法

// 向指定的ip地址发送消息
        private void sendMsgTarget(String targetIP, String msg) {
            int num = mList.size();

            for (int index = 0; index < num; index++) {
                Socket mSocket = mList.get(index);

                String ip = mSocket.getInetAddress().getHostAddress();

                if (ip.equals(targetIP)) {
                    PrintWriter pout = null;
                    try {
                        pout = new PrintWriter(
                                new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);
                        pout.println(msg);

                        // 退出方法
                        return;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }

        // 向除了这个ip以外的所有ip发送
        private void sendMsgAvoid(String avoidIP, String msString) {

            int num = mList.size();

            for (int index = 0; index < num; index++) {
                Socket mSocket = mList.get(index);

                String ip = mSocket.getInetAddress().getHostAddress();

                if (!ip.equals(avoidIP)) {
                    PrintWriter pout = null;
                    try {
                        pout = new PrintWriter(
                                new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "UTF-8")), true);
                        pout.println(msString);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            }
        }

客户端在mainActivity中接受来自服务端的所有信息,根据type来进行再次分装,使用Eventbus将信息发送给各个fragment来进行展示

@Subscribe(threadMode = ThreadMode.MAIN)
    public void privateChat(SocketEvent event) {
        switch (event.getType()) {
            case MyApplication.CHAT_PRIVATE:
                // 将消息post给私聊聊天室
                ChatMessageBean bean = new ChatMessageBean();
                bean.setMsg(event.getMsg());
                bean.setName(event.getKeyIP());
                bean.setType(ChatMessageBean.OTHERS_ARG);
                EventBus.getDefault().post(bean);
                break;

            case MyApplication.SEND_PRIVATE:
                sendMsg(JSON.toJSONString(event));
                break;
        }
    }

Java实现的聊天室,具有群聊和私聊功能

  • 2010年06月28日 10:41
  • 78KB
  • 下载

socket.io实现私聊

socket.io官网api地址 http://socket.io/docs/server-api/socket.io官方api以及很多教程都知识介绍了广播消息和在当前会话发送消息,在很多时候我们需...
  • koastal
  • koastal
  • 2016年12月15日 22:06
  • 4329

java Socket实现多人群聊与私聊

关于Socket套接字的一些基本知识与认识可以参见上一篇或自行查阅。 ServerSocket和Socket实现群聊与私聊涉及到多线程编程,实现过程的重点是利用Socket通信的原理,即不断的在服务...
  • zhaokx3
  • zhaokx3
  • 2016年10月16日 21:06
  • 4491

Socket编程实现简易聊天室

1.Socket基础知识   Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求。   Socket是支持TCP/IP协议的网...
  • salahelx
  • salahelx
  • 2015年06月21日 23:13
  • 7419

socket详解及简易聊天室编写

app源码下载地址:https://github.com/noyo/ChatRoom/tree/master 服务器端代码下载地址:http://download.csdn.net/detail/u...
  • u012975705
  • u012975705
  • 2015年09月26日 16:48
  • 6119

socket实现客户端和客户端之间通信和聊天

1.实体类 package edu.tcu.cn; import java.io.BufferedReader; import java.io.IOException; import java.i...
  • DREAMEER_DD
  • DREAMEER_DD
  • 2016年09月22日 19:48
  • 5090

浅谈java中的ServerSocket和Socket的通信原理实现聊天及多人聊天

聊天,QQ,微信,陌陌很多的即时通讯的软件,不管是桌面端还是移动端,在当今社交的时代都是不可或缺的一部分。这时候说Socket和ServerSocket感觉有点老调重弹感觉,相信很多人早就知道如何使用...
  • u013064109
  • u013064109
  • 2015年08月22日 00:00
  • 10177

Socket编程一实现简易的聊天功能以及文件传输

干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看。我从小就喜爱看武侠小说,一直有着武侠梦。从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江...
  • u012551350
  • u012551350
  • 2017年02月21日 21:26
  • 5676

java socket编程(1)——利用socket实现聊天之消息推送

网上已经有很多利用socket实现聊天的例子了,但是我看过很多,多多少有一些问题存在。 这里我将实现一个比较完整的聊天例子,并解释其中的逻辑。...
  • yehui928186846
  • yehui928186846
  • 2016年09月18日 10:30
  • 5527

Java聊天室(界面完整,群聊,私聊,用户列表)

  • 2015年05月21日 17:26
  • 46KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Socket实现网络聊天室和联系人私聊功能
举报原因:
原因补充:

(最多只允许输入30个字)