文档章节

android实现简单的聊天室

w
 wuwulh
发布于 2012/11/09 13:24
字数 874
阅读 2187
收藏 16

     先说一下流程。首先是建立一个java工程,并创建两个java类,一个用于接收到客户端的连接,并把连接添加list中,第二类实现线程runnable接口,专门用来接收发送客户发送的信息。其次,建立android工程,并创建两个类,一个用于显示聊天界面,另一个负责接收服务器端返回的信息。这个例子肯定会有考虑不周的地方但是只是为了学习android中网络相关api的使用,所以请大家谨慎拍砖。

首先还是android的内容


[html]  view plain copy print ?
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <EditText  
  7.         android:id="@+id/et_show"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:lines="5"  
  11.         android:hint="所有聊天信息"  
  12.         android:gravity="center"  
  13.          />  
  14.     <EditText  
  15.         android:id="@+id/et_input"  
  16.         android:layout_below="@+id/et_show"  
  17.         android:layout_width="fill_parent"  
  18.         android:layout_height="wrap_content"  
  19.         android:hint="输入聊天信息"  
  20.         android:gravity="center"  
  21.          />  
  22.     <Button   
  23.         android:id="@+id/bt_send"  
  24.         android:layout_below="@+id/et_input"  
  25.         android:layout_width="fill_parent"  
  26.         android:layout_height="wrap_content"  
  27.         android:text="发送信息"  
  28.         />  
  29. </RelativeLayout>  

接着是MainAvitvity.java



[java]  view plain copy print ?
  1. public class MainActivity extends Activity {  
  2.       
  3.     private EditText et_show,et_input;  
  4.     private Button bt_send;  
  5.     private OutputStream os;  
  6.     private Handler handler;  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_main);  
  12.           
  13.         et_input = (EditText) this.findViewById(R.id.et_input);  
  14.         et_show = (EditText) this.findViewById(R.id.et_show);  
  15.         bt_send = (Button) this.findViewById(R.id.bt_send);  
  16.           
  17.           
  18.         try {  
  19.             //定义客户连接的socket  
  20.             Socket socket = new Socket("本机IP",30000);  
  21.             //启动客户端监听线程  
  22.             new Thread(new ClinetThread(socket,handler)).start();  
  23.             os = socket.getOutputStream();  
  24.         } catch (UnknownHostException e) {  
  25.             e.printStackTrace();  
  26.         } catch (IOException e) {  
  27.             e.printStackTrace();  
  28.         }  
  29.           
  30.           
  31.         bt_send.setOnClickListener(new OnClickListener() {  
  32.             @Override  
  33.             public void onClick(View v) {  
  34.                 try {  
  35.                     //得到输入框中的内容,写入到输入流中  
  36.                     os.write((et_input.getText().toString()+"\r\n").getBytes("utf-8"));  
  37.                     et_input.setText("");  
  38.                 } catch (UnsupportedEncodingException e) {  
  39.                     // TODO Auto-generated catch block  
  40.                     e.printStackTrace();  
  41.                 } catch (IOException e) {  
  42.                     // TODO Auto-generated catch block  
  43.                     e.printStackTrace();  
  44.                 }  
  45.             }  
  46.         });  
  47.           
  48.           
  49.         handler = new Handler(){  
  50.             @Override  
  51.             public void handleMessage(Message msg) {  
  52.                 super.handleMessage(msg);  
  53.                 if(msg.what == 1){  
  54.                     //得到服务器返回的信息  
  55.                     et_show.append("\n"+msg.obj.toString());  
  56.                 }  
  57.             }  
  58.         };  
  59.     }  
  60.       
  61. }  

第三是客户端的线程类



[java]  view plain copy print ?
  1. public class ClinetThread implements Runnable{  
  2.   
  3.     Socket socket = null;  
  4.     Handler handler = null;  
  5.       
  6.     BufferedReader br = null;  
  7.       
  8.     public ClinetThread(Socket socket,Handler handler) {  
  9.         this.socket = socket;  
  10.         this.handler = handler;  
  11.         try {  
  12.             br = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  13.         } catch (IOException e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.           
  17.     }  
  18.       
  19.     @Override  
  20.     public void run() {  
  21.         String content = null;  
  22.         try {  
  23.             while((content = br.readLine())!=null){  
  24.                 Message msg = new Message();  
  25.                 msg.what = 1;  
  26.                 msg.obj = content;  
  27.                 handler.sendMessage(msg);  
  28.             }  
  29.         } catch (IOException e) {  
  30.             e.printStackTrace();  
  31.         }  
  32.     }  
  33.       
  34. }  

接下来是Java工程中的主类



[java]  view plain copy print ?
  1. /** 
  2.  * 创建ServerSocket监听的主类 
  3.  * 该类只负责接收客户端的socket连接请求,每当客户端 
  4.  * 连接到该serversocket之后,程序将对应socket加入到list 
  5.  * 并为该socket开一挑单独的线程,负责socket的所有通信任务 
  6.  * @author Administrator 
  7.  * 
  8.  */  
  9. public class SimpleServer {  
  10.       
  11.     //定义保存所有Socket的ArrayList  
  12.     public static ArrayList<Socket> socketList = new ArrayList<Socket>();  
  13.       
  14.     public static void main(String[] args) {  
  15.         try {  
  16.             ServerSocket ss = new ServerSocket(30000);  
  17.             while (true) {  
  18.                 Socket s = ss.accept();  
  19.                 socketList.add(s);  
  20.                 new Thread(new ServerThead(s)).start();  
  21.             }  
  22.         } catch (IOException e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.           
  26.     }  
  27. }  

其次java工程中的线程类



[java]  view plain copy print ?
  1. /** 
  2.  * 负责每个线程通信的类 
  3.  * 该类不断读取客户端数据,使用自定义的readFromClient()方法读取 
  4.  * 客户端数据,如果出现异常表明该socket对应的客户端socket出现了问题 
  5.  * 程序将该socket从list中移除。 
  6.  * 当服务器线程读取到了客户端数据后,遍历list集合,并将数据发送到每个 
  7.  * socket中 
  8.  * @author Administrator 
  9.  * 
  10.  */  
  11. public class ServerThead implements Runnable {  
  12.   
  13.     //定义当前线程处理的socket  
  14.     Socket s = null;  
  15.     //该线程所处理的socket对应的输入流  
  16.     BufferedReader br = null;  
  17.       
  18.     public ServerThead(Socket s) throws IOException {  
  19.         this.s = s;  
  20.         br = new BufferedReader(new InputStreamReader(s.getInputStream()));  
  21.     }  
  22.   
  23.     @Override  
  24.     public void run() {  
  25.         String conntent = null;  
  26.         while((conntent=readFromClient())!=null){  
  27.             //遍历socket中的每一个socket  
  28.             for(Socket s:SimpleServer.socketList){  
  29.                 try {  
  30.                     OutputStream os = s.getOutputStream();  
  31.                     os.write((conntent+"\n").getBytes("utf-8"));  
  32.                 } catch (IOException e) {  
  33.                     e.printStackTrace();  
  34.                 }  
  35.                   
  36.             }  
  37.         }  
  38.     }  
  39.   
  40.     private String readFromClient() {  
  41.         try {  
  42.             return br.readLine();  
  43.         } catch (IOException e) {  
  44.             e.printStackTrace();  
  45.             SimpleServer.socketList.remove(s);  
  46.         }  
  47.         return null;  
  48.     }  
  49.   
  50. }  
  51. 转载请标明出处:雅荷湾

© 著作权归作者所有

w

wuwulh

粉丝 12
博文 53
码字总数 6288
作品 1
东城
私信 提问
加载中

评论(2)

烟雨清安
烟雨清安
这个需要服务器吗
我来支持一下,给个讨论的好地方328969986验证:3 欢迎参与哦
干货!融云直播聊天室sdk集成大全

直播聊天室 为方便开发者了解和接入融云直播聊天室,本文将介绍融云直播聊天室功能特点、主要构成及常见功能的解决方案。 产品介绍 融云直播聊天室,是专门为视频直播业务提供的一个产品。主...

程序猿怪
2017/07/25
526
1
Android基于XMPP Smack Openfire下学习开发IM

http://blog.csdn.net/h7870181/article/details/8653865 Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等 http://blog.csdn.net/h7870181/article/de......

天下杰论
2014/07/17
0
1
一套代码,快速实现一个语音聊天室

前言:本文将简要分享几个语音聊天室的应用场景,并讲述基于声网SDK,实现语音聊天室的步骤。 语音聊天在泛娱乐社交行业中有着重要的地位,行业中很多佼佼者也都为用户提供了语音聊天室,甚至...

Agora
2018/06/20
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
【转】Android 基于Socket的聊天室

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

长平狐
2012/06/28
7.5K
5

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL在启动时如何分配共享缓存

相信很多人知道 shared_buffers 这个参数,它设置共享缓存的大小,本篇简单讲一下它是怎样分配的。 1、参数设置(src/backend/utils/misc/guc.c) /* * We sometimes multiply the numbe...

有理想的猪
26分钟前
2
0
jsonFormat注解导致时间后台和页面差8小时

阿里云提醒fastjson < 1.2.51 远程代码执行漏洞。 jar包升级1.1.40升级到1.2.58后前台和后台拿到的时间数据差8小时。 解决方法,在实体注解上添加内容 @JsonFormat(pattern = "yyyy-MM-dd HH...

S三少S
26分钟前
42
2
Linux全自动网络安装 —— PXE

前言: 最近整理一些以前的学习笔记。 过去都是存储在本地,此次传到网络留待备用。 网络装机的优势: 1).规模化:同时装配多台主机; 2).自动化:自动装系统、配置等各种服务; 3).远程实现...

迷失De挣扎
38分钟前
5
0
Spark利用Broadcast实现Join避免Shuffle操作

在Spark中, 诸如ReduceByKey,GroupByKey等操作会触发Shuffle, 影响性能。 本文提供了一种利用广播Broadcast, 实现了join操作, 避免了Shuffle。 正常的join操作 val sc = new Spark...

dreamness
44分钟前
3
0
在 Vivado 中使用 Synopsys VCS 运行仿真

了解如何在 Vivado 中使用 Synopsys VCS simulator 运行仿真。我们将演示如何编译仿真库、为 IP 或整个项目生成仿真脚本,然后运行仿真。 http://xilinx.eetop.cn/viewnews-3057 基于 Zynq 的...

whoisliang
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部