Android Socket 聊天室

Android网络编程之Socket通信实现简单聊天室 socket通信是基于底层TCP协议实现的,是一种可靠的网络连接,通过三次握手成功建立网络连接之后进行通信。这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信。socket是对TCP/IP的封装调用,本身并不是一种协议,我们通过socket来调用协议来跟服务端进行通信和数据的传输。socket就像客户端与服务端之间的一条信息通道,每一个不同的客户端都会建立 阅读详情

项目地址:https://github.com/SunnyLine/ChatRoom.git
切换“test”分支,运行old_server,安装app到手机上
在这里插入图片描述
部分截图:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

以下为代码逻辑部分
Java: 监听某个端口,有用户访问时,将这个Socket放入到一个集合中作为一个用户组,并监听这个Socket的消息。收到任意一个Socket的消息后,再将此消息分发给用户组的每一个成员。
Android:使用Socket连接指定IP指定端口,连接成功后发送一条信息给服务器,服务器会将之转发给其他人,其他人就可以知道组内有新用户加入的信息。离开此页面时也要发送给服务器一条离开的信息,服务器会告知其他用户。在子线程中监听服务器发送的数据进行显示。

Java代码如下:

public class Main {

	private static final int PORT = 9999;
    private static List<Socket> mList = new ArrayList<Socket>();
    private static ServerSocket server = null;
    private static ExecutorService mExecutorService = null; //thread pool
    
    public static void main(String[] args) {
    	try {
            server = new ServerSocket(PORT);
            mExecutorService = Executors.newCachedThreadPool();  //create a thread pool
            System.out.println("服务器已启动...");
            Socket client = null;
            while(true) {
                client = server.accept();
              //把客户端放入客户端集合中
                mList.add(client);
                mExecutorService.execute(new Service(client)); //start a new thread to handle the connection
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
    static class Service implements Runnable {
            private Socket socket;
            private BufferedReader in = null;
            private String msg = "";
            
            public Service(Socket socket) {
                this.socket = socket;
                try {
                    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                  //客户端只要一连到服务器,便向客户端发送下面的信息。
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            
            public byte[] readStream(InputStream inStream) throws Exception {  
                ByteArrayOutputStream outSteam = new ByteArrayOutputStream();  
                byte[] buffer = new byte[1024];  
                int len = -1;  
                while ((len = inStream.read(buffer)) != -1) {  
                    outSteam.write(buffer, 0, len);  
                }  
                outSteam.close();  
                inStream.close();  
                return outSteam.toByteArray();  
            } 

            @Override
            public void run() {
                try {
                    while(true) {
                        if((msg = in.readLine())!= null) {
                        	System.out.println("接收:"+msg);
                        	ChatBean bean =  new Gson().fromJson(msg, ChatBean.class);
                        	//当客户端发送的信息为:exit时,关闭连接
                            if(bean.content.equals("exit")) {
                                System.out.println("用戶:"+bean.name+"已退出谈论组");
                                mList.remove(socket);
                                in.close();
                                socket.close();
                                this.sendmsg();
                                break;
                              //接收客户端发过来的信息msg,然后发送给客户端。
                            } else {
                                this.sendmsg();
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            /**
             * 循环遍历客户端集合,给每个客户端都发送信息。
             * 可以使用观察者模式设计讨论组
             */
           public void sendmsg() {
               System.out.println(msg);
               int num =mList.size();
               for (int index = 0; index < num; index ++) {
                   Socket mSocket = mList.get(index);
                   PrintWriter pout = null;
                   try {
                       pout = new PrintWriter(new BufferedWriter(
                               new OutputStreamWriter(mSocket.getOutputStream())),true);
                       pout.println(msg);
                   }catch (IOException e) {
                       e.printStackTrace();
                   }
               }
           }
        }    

}

Android 部分代码如下:

public interface ChatView {

    public String getHost();
    public String getProt();
    public String getUserId();
    public void showDiaolg(String msg);
    public void receiveMsg(ChatBean bean);
}

public class SocketThread extends Thread {

    private Socket socket = null;
    private BufferedReader in = null;
    private PrintWriter out = null;

    private ChatView chatView;

    public SocketThread(ChatView chatView) {
        this.chatView = chatView;
    }

    private void init() {
        try {
            socket = new Socket(chatView.getHost(), Integer.parseInt(chatView.getProt()));
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
            if (!socket.isOutputShutdown()) {
                ChatBean bean = new ChatBean("join", chatView.getUserId());
                out.println(new Gson().toJson(bean));
            }
        } catch (UnknownHostException e1) {
            e1.printStackTrace();
            mHandler.sendEmptyMessage(-1);
        } catch (IOException ex) {
            ex.printStackTrace();
            mHandler.sendEmptyMessage(0);
        } catch (IllegalArgumentException e2) {
            e2.printStackTrace();
            mHandler.sendEmptyMessage(-2);
        }
    }

    public void sendMsg(String msg) {
        ChatBean bean = new ChatBean(msg, chatView.getUserId());
        if (!TextUtils.isEmpty(msg) && socket != null && socket.isConnected()) {
            if (!socket.isOutputShutdown()) {
                out.println(new Gson().toJson(bean));
            }
        }
    }

    //接收线程发送过来信息,并用TextView显示
    public Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case -2:
                    chatView.showDiaolg("IllegalArgumentException");
                    break;
                case -1:
                    chatView.showDiaolg("UnknownHostException");
                    break;
                case 0:
                    chatView.showDiaolg("IOException");
                    break;
                case 1:
                    String content = (String) msg.obj;
                    ChatBean bean = new Gson().fromJson(content, ChatBean.class);
                    chatView.receiveMsg(bean);
                    break;
            }
        }
    };

    @Override
    public void run() {
        super.run();
        init();
        //接收服务器的信息
        try {
            while (true) {
                if (!socket.isClosed()) {
                    if (socket.isConnected()) {
                        if (!socket.isInputShutdown()) {
                            String content;
                            if ((content = in.readLine()) != null) {
                                content += "\n";
                                Message message = mHandler.obtainMessage();
                                message.obj = content;
                                message.what = 1;
                                mHandler.sendMessage(message);
                            } else {

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

Android socket聊天室 效果图:利用socket实现了简单的聊天室功能。首先要用java先写一个ServerSocket服务器public class SocketTest { public static void main(String[] args) { try { //端口号从1-65535中任选一个,一般选择较大的 ServerSocket se 阅读详情

相关推荐

学习 | Android基于socket的聊天室

介绍 hello,这是我的第一篇技术博客,这是大二上Android课的时候讲到socket时上网搜相关技术时看到的一个基于Android+socket的聊天室,觉得蛮有趣的,就想分享给大家,也可以让大家更清楚了解socket通信。 源码 github:https://github.com/Jhuo007/Android 环境 jdk1.8 android studio3.6.2 idea 或者eclipse myeclipse 手机虚拟机两台以上 运行截图 PC服务端idea开启服务 Android目

Jhuo的博客 1213

Android通过Socket实现局域网通信例子

最近工作上涉及比较多局域网连接和通信的业务需求,发现自己在这块一直是一个空缺,因此在网上找了一些资料,也在AS上试着验证,基本没有什么问题。 好了,不多说,直接上代码。 首先是Server端的代码实现: 1)MainActivity.java package com.example.socketserver; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import andro

知难行易 3757

基于蓝牙Socket的安卓设备聊天室实战项目

简介:本项目“基于蓝牙Socket通讯的聊天室”实现两部安卓设备在无网络环境下通过蓝牙进行实时通信,构建点对点聊天功能。项目基于Android平台,利用BluetoothAdapter、BluetoothServerSocket和BluetoothSocket完成设备发现、配对与连接,通过输入输出流实现消息传输,并结合UI设计完成完整的聊天室交互。适用于学习蓝牙通信原理、Socket编程及移动应用开发,具备良好的教学与实践价值。

weixin_42593549的博客 743

【android】android socket 实现简易的聊天室功能

整个项目分为服务器端和客户端。服务器端用java编写,客户端为android。 服务器端: MyServerSocket.java :  主程序 package mypackage; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swi

hujiaxuan1995的专栏 740

从Gotham到Foundry:一文读懂Palantir三大产品线(Gotham/Foundry/Apollo)的核心差异与适用场景

本文深度解析Palantir三大产品线Gotham、Foundry和Apollo的核心差异与适用场景。Gotham专为国防与情报设计,提供军事级安全分析;Foundry是企业数字化转型的通用平台,支持低代码开发;Apollo则是云原生基石,确保系统可靠运行。通过对比产品架构与典型应用,帮助技术决策者根据需求做出明智选择。

weixin_42524499的博客 839

elementui中el-select和el-tree实现下拉树形多选功能

elementui中el-select和el-tree实现下拉树形多选功能

weixin_49203377的博客 6556

打造自己的Android聊天软件(socket篇)

其实打造属于自己的聊天软件很简单,今天我们讲学习如何简单的写一个群组聊天app,通过sockets实现。这不是唯一的方法,但却是最快和最简单的。最好和最有效的方式应该是使用推送通知(push notifications )而不是sockets。 翻译自http://www.androidhive.info/2014/10/android-building-group-chat-app-using

请叫我搞向 4万+

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1674

基于Socket通信的Android聊天室

本例采用PC端做服务器端,android端做客户端,进行Socket通信;能进行群聊,并能上传android端的本地文件(图片)到PC端,PC端又将收到的文件转发给所有用户。

毕业作品网站 693

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1885

SAP CAP 编程模型简介

官网 CAP 是用于构建企业级服务和应用程序的语言、库和工具框架。它引导开发人员沿着经过验证的最佳实践和大量现成的解决方案来应对重复性任务的“黄金之路”。 基于 CAP 的项目受益于对领域的主要关注。我们没有深入研究过于技术性的学科,而是专注于在快速变化的云技术世界中加速开发和保护投资。 CAP 框架融合了经过验证和广泛采用的开源和 SAP 技术,如下图所示。 在开源技术之上,CAP主要增加了: 核心数据服务 (CDS) 作为我们用于域模型和服务定义的通用建模语言。 用于 Node.js 和 Ja

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1544

android 使用WebRTC搭建视频聊天室 聊天机器人

android 使用WebRTC搭建视频聊天室

chezabo6116的博客 1442

WIFI和BT测试(射频工程师)

买不了吃亏买不了上当,我卖的是技能,你收获的是经验。

m0_58834499的博客 599

android socket 简易聊天室 java服务器,Android Socket通信实现简单聊天室

socket通信是基于底层TCP/IP协议实现的。这种服务端不需要任何的配置文件和tomcat就可以完成服务端的发布,使用纯java代码实现通信。socket是对TCP/IP的封装调用,本身并不是一种协议,我们通过socket来调用协议来跟服务端进行通信和数据的传输。socket就像客户端与服务端之间的一条信息通道,每一个不同的客户端都会建立一个独立的socket,双方都没有关闭连接的话,连接—也...

weixin_36397372的博客 480

ENVI_基于无人机数据的果树提取与相对健康监测

一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me...

提供技术服务、资源分享 429690771 1398

C#上位机性能优化全攻略:彻底解决界面卡顿+多线程死锁+PLC数据延迟,产线实测稳定运行2年

一开始我们用的是网上找的零散优化代码,根本满足不了要求,后来花了2个月的时间,把之前27条产线的代码整理、重构、优化,做了一套这套方案上线后,连续稳定运行2年零3个月:界面响应时间稳定在50ms以内,多线程死锁率持续为0,PLC数据延迟稳定在150ms以内,系统可用率≥99.99%,帮客户一年省下了超过480万的停线损失、罚款损失和人工成本,客户第二年就把剩下的22条产线也全部交给我们做了,还介绍了3家同行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 293

在Android中创建Socket客户端(实现在线聊天室)

下面实现安卓作为客户端实现网络聊聊天室的实例: 建立安卓客户端:  package com.example.mysocketclient;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; i

张亚运的专栏 3771

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android socket 简易聊天室 java服务器_【Android】Socket实现简易聊天室功能

人的一生总要去书写许多不知结局的故事。有的故事可以顺利完成,而有的故事或许将永远都是一种残缺。完美的结局是我们搏击风雨的见证,也是我们永久的期待,然而生活并不像我们所想象的那样美好,既然有年轻,也必然有衰老。简易聊天室,什么是聊天室呢,简单一点说就是一些人可以共同聊天,别人能够看见你发布的消息,你也可以看到别人的消息,大家的消息是公开的。功能分析:1、聊天功能,聊天是一个长时间的相互交互的过程,要...

weixin_35390057的博客 542

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android 基于Socket的聊天室

Socket是TCP/IP协议上的一种通信,在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。 Client

kkwant的博客 2185

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android-Socket实现简易聊天室

目录标题布局文件Server端Client端 布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.co

hayhead的博客 840

Android--使用socket通讯建立网络聊天室1

首先建立服务器端程序: 1.MyServerSocket.java package com.test.test; public class MyServerSocket { public static void main(String[] args) { new ServerListener().start(); } } 2.ServerListen

张亚运的专栏 1194

android socket聊天室——也不仅仅是聊天室

前提概要 笔者很久之前其实就已经学习过了socket,当然也是用socket做过了聊天室,但是觉得此知识点比较一般,并无特别难的技术点,于是也并未深究。 然而近期一个项目中对socket的使用却让笔者感觉socket强大无比,可以实现诸多功能。 个人Socket体验 项目主要有关智能家居,需要实现多台手机同时对灯进行操作(开或者关),主要需要实现以下几点: 1、进入界面时获取所有灯的...

许佳佳的博客 1万+

Android Socket 聊天室:打造你的专属实时通讯应用

Android Socket 聊天室:打造你的专属实时通讯应用 【下载地址】AndroidSocket实现简单聊天室附源码 本项目是一个基于 Android 平台的简单聊天室应用,使用 Socket 技术实现客户端与服务器之间的通信。该聊天室支持群聊和私聊功能,用户可以通过该应用进行实时聊天 ...

gitblog_06546的博客 1340

Android Socket之聊天室

公司开发需要用到socket通信的一些应用,所以就大体了解了一些其中的原理,看了一些视频,模仿做了一个聊天室。 聊天室的开发需要在服务器端记录每一个连接的socket,并向各个客户端发送消息。 服务端代码如下:因为accept()是一个阻塞函数,所以应该放在一个线程中,并保持一直监听状态。                              package com.jld.te

caochanghui的专栏 412

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信。计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用。 TCP/IP是个协议组,它分为三个层次:网络层、传输层和应用层: 网络层包括:I

aqi00的博客 7203

基于Socket的Android聊天室

Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序。本实例使用ServerSocket建立聊天服务器。将服务器端所有的通讯线程保存到一个集合当中,当有用户发来数据,则转发给所有用户,实现聊天室效果。Android端通过使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据,显示到界面上。开启多个虚拟机模拟多人聊天效果。

u012781057的博客 5414
上一篇: SwipeRefreshLayout+RecyclerView 下拉刷新
下一篇: Android EditView 输入限制(软键盘限制)
hello_12413
博客等级 码龄14年 8粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值