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

Client A  发信息给 Client B ,  A的信息首先发送信息到服务器Server ,Server接受到信息后再把A的信息广播发送给所有的Clients

首先我们要在服务器建立一个ServerSocket ,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。

Socket accept():如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket

Server示例:

//创建一个ServerSocket,用于监听客户端Socket的连接请求ServerSocket ss = new ServerSocket(30000);
//采用循环不断接受来自客户端的请求while (true){
//每当接受到客户端Socket的请求,服务器端也对应产生一个SocketSocket s = ss.accept();
//下面就可以使用Socket进行通信了...
}

客户端通常可使用Socket的构造器来连接到指定服务器
Client示例:

//创建连接到服务器、30000端口的SocketSocket s = new Socket("192.168.2.214" , 30000);
//下面就可以使用Socket进行通信了...

这样Server和Client就可以进行一个简单的通信了
当然,我们要做的是多客户,所以每当客户端Socket连接到该ServerSocket之后,程序将对应Socket加入clients集合中保存,并为该Socket启动一条线程,该线程负责处理该Socket所有的通信任务

//定义保存所有Socket的ArrayListpublic static ArrayList<Socket> clients = new ArrayList<Socket>();

当服务器线程读到客户端数据之后,程序遍历clients集合,并将该数据向clients集合中的每个Socket发送一次。这样就可以实现一个聊天室的功能了

下面来看看整个功能的demo

先建立一个Java工程,把Server.java运行起来,然后再运行手机模拟器

    

服务器打印信息:

程序文件结构:

嘿嘿,大家别笑我,我的JAVA水平还是初学者,很多地方都觉得很菜,代码规格程度:小学。 有待提高啊!

1.先看看主Activity : SocketmsgActivity.java

SocketmsgActivity.java

2.初始化IP和端口Activity, IniActivity.java

IniActivity.java

3.初始化用户名称Activity, IniuserActivity.java

IniuserActivity.java

4.config.java

config.java

布局文件:

1.main.xml

main.xml

2.config.xml

config.xml

3.configuer.xml

configuser.xml

style文件:dimens.xml

dimens.xml

最后是服务器文件:Server.java

  1 import java.io.*;
2 import java.net.*;
3 import java.text.DateFormat;
4 import java.text.SimpleDateFormat;
5 import java.util.*;
6
7 import javax.sound.sampled.Port;
8 import javax.swing.JOptionPane;
9
10 public class Server {
11
12 ServerSocket ss = null;
13 private String getnameString=null;
14 boolean started = false;
15 List<Client> clients = new ArrayList<Client>();
16 List<Info> infos = new ArrayList<Info>();
17 public static void main(String[] args) {
18 String inputport = JOptionPane.showInputDialog("請輸入該服務器使用的端口:");
19 int port = Integer.parseInt(inputport);
20 new Server().start(port);
21 }
22
23 public void start(int port) {
24 try {
25 ss = new ServerSocket(port);
26 System.out.println("服務器啟動");
27 started = true;
28 } catch (BindException e) {
29 System.out.println(" 端口已经被占用");
30 System.exit(0);
31 }
32 catch (IOException e) {
33 e.printStackTrace();
34 }
35
36 try {
37 while (started) {
38 Socket s = ss.accept();
39 Client c = new Client (s);
40 System.out.println("a client is connected");
41 new Thread(c).start();
42 clients.add(c);
43
44
45 }
46 } catch (IOException e) {
47 e.printStackTrace();
48 }
49 finally {
50 try {
51 ss.close();
52 } catch (IOException e) {
53 e.printStackTrace();
54 }
55 }
56 }
57 public List<Client> getClient(){
58 return clients;
59 }
60
61 class Client implements Runnable {
62 private String chatKey="SLEEKNETGEOCK4stsjeS";
63 private Socket s = null;
64 private DataInputStream dis = null;
65 private DataOutputStream dos = null;
66 private boolean bConnected = false;
67 private String sendmsg=null;
68 Client (Socket s) {
69 this.s = s;
70 try {
71 dis = new DataInputStream (s.getInputStream());
72 dos = new DataOutputStream (s.getOutputStream());
73 bConnected = true;
74 } catch(IOException e) {
75 e.printStackTrace();
76 }
77 }
78
79 public void send (String str) {
80
81 try {
82 //System.out.println(s); 83 dos.writeUTF(str+"");
84 dos.flush();
85 } catch(IOException e) {
86 clients.remove(this);
87 System.out.println("对方已经退出了");
88 }
89 }
90 public void run() {
91 try {
92 while (bConnected) {
93 String str = dis.readUTF();
94 DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
95 String date = " ["+df.format(new Date())+"]";
96 if(str.startsWith(chatKey+"online:")){
97 Info info = new Info();
98 getnameString = str.substring(27);
99
100 info.setName(getnameString);
101 infos.add(info);
102 for (int i=0; i<clients.size(); i++) {
103 Client c = clients.get(i);
104 c.send(getnameString+" on line."+date);
105 }
106 System.out.println(getnameString+" on line."+date);
107 }else if(str.startsWith(chatKey+"offline:")){
108 getnameString = str.substring(28);
109 clients.remove(this);
110 for (int i=0; i<clients.size(); i++) {
111 Client c = clients.get(i);
112 c.send(getnameString+" off line."+date);
113 }
114 System.out.println(getnameString+" off line."+date);
115 }
116 else{
117 int charend = str.indexOf("end;");
118 String chatString = str.substring(charend+4);
119 String chatName = str.substring(25, charend);
120
121 sendmsg=chatName+date+"\n"+chatString;
122 for (int i=0; i<clients.size(); i++) {
123 Client c = clients.get(i);
124 c.send(sendmsg);
125 }
126 System.out.println(sendmsg);
127 }
128 }
129 } catch (SocketException e) {
130 System.out.println("client is closed!");
131 clients.remove(this);
132 } catch (EOFException e) {
133 System.out.println("client is closed!");
134 clients.remove(this);
135 }
136 catch (IOException e) {
137 e.printStackTrace();
138 }
139 finally {
140 try {
141 if (dis != null) dis.close();
142 if (dos != null) dos.close();
143 if (s != null) s.close();
144 } catch (IOException e) {
145 e.printStackTrace();
146 }
147 }
148 }
149 }
150
151 class Info{
152 private String info_name = null;
153 public Info(){
154
155 }
156 public void setName(String name){
157 info_name = name;
158 }
159 public String getName(){
160 return info_name;
161 }
162 }
163 }

以上只是一个粗略的聊天室功能,如果要实现私聊,还需要保存该Socket关联的客户信息。一个客户端可以将信息发送另一个指定客户端。实际上,我们知道所有客户端只与服务器连接,客户端之间并没有互相连接。这个功能等我以后有时间再写个demo.....

原文链接:http://www.cnblogs.com/-run/archive/2011/12/29/2306363.html
可以在原文中查看代码

Android 基于Socket的聊天室(一)的更多相关文章

  1. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  2. java基于socket公共聊天室的实现

    项目:一个公共聊天室功能的实现,实现了登录聊天,保存聊天记录等功能. 一.实现代码 1.客户端 ChatClient.java import java.io.BufferedReader; impor ...

  3. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  4. 基于WebSocket实现聊天室(Node)

    基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...

  5. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  6. 【视频】零基础学Android开发:蓝牙聊天室APP(四)

    零基础学Android开发:蓝牙聊天室APP第四讲 4.1 ListView控件的使用 4.2 BaseAdapter具体解释 4.3 ListView分布与滚动事件 4.4 ListView事件监听 ...

  7. 【视频】零基础学Android开发:蓝牙聊天室APP(二)

    零基础学Android开发:蓝牙聊天室APP第二讲 2.1 课程内容应用场景 2.2 Android UI设计 2.3 组件布局:LinearLayout和RelativeLayout 2.4 Tex ...

  8. 【视频】零基础学Android开发:蓝牙聊天室APP(三)

    零基础学Android开发:蓝牙聊天室APP第三讲 3.1 ImageView.ImageButton控件具体解释 3.2 GridView控件具体解释 3.3 SimpleAdapter适配器具体解 ...

  9. 【视频】零基础学Android开发:蓝牙聊天室APP(一)

    零基础学Android开发:蓝牙聊天室APP第一讲 1. Android介绍与环境搭建:史上最高效Android入门学习 1.1 Google的大小战略 1.2 物联网与云计算 1.3 智能XX设备 ...

随机推荐

  1. 创建并配置Filter

    创建Filter需要两个步骤: 创建FIlter处理类. web.xml文件中配置Filter. 创建Filter类 创建Filter必须实现javax.servlet.Filter接口,在该接口中定 ...

  2. java判断某个字符串包含某个字符串的个数

    /** * 判断str1中包含str2的个数 * @param str1 * @param str2 * @return counter */ public static int countStr(S ...

  3. 关于spring mvc MaxUploadSizeExceededException 死循环解决方案

    当看到这文章的时候相信你现在应该遇到这样的问题了,我也是自己遇到了后来找到解决方案了记录下来,如果下次遇到就可以直接解决了. 至于为什么会出现这样的情况,可以看这篇文章:https://bz.apac ...

  4. java中直接打印对象

    java中直接打印对象,会调用对象.toString()方法.如果没有重写toString()方法会输出"类名+@+hasCode"值,hasCode是一个十六进制数 //没有重写 ...

  5. Android -- 系统信息(内存、cpu、sd卡、电量、版本)获取

    内存(ram)                                                                              android的总内存大小信息 ...

  6. android开发 解决启动页空白或黑屏问题

    遇到的情况: app启动时进入启动页时出现白屏页,然后大概一秒之后就出现了背景图片. 原因:app启动时加载的是windows背景,之后再加载布局文件的,所以开始的黑屏/白屏就是windows的背景颜 ...

  7. 利用Python获取ZOJ所有题目的名字

    先贴出代码,行数比较少,仅仅用正则表达式分析出题目Title所在的标签并把题目Title提取出来 import urllib.request import re import dbm #定义URL,其 ...

  8. URAL 1920 Titan Ruins: the Infinite Power of Magic

    大意: 有一张N*N的网格,你每次可以走一步,每格只能走一次,有没有一种方法让走了L步后回到一个距原点1步远的格子?  没有输出Unsuitable device,否则输出Overwhelming p ...

  9. zoj 1450 Minimal Circle 最小覆盖圆

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=450 You are to write a program to fi ...

  10. BZOJ1565 植物大战僵尸

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1565 这题看上去并不会做,结果又是最大权闭合子图的裸题. 于是就去看了一发论文,明白建图的 ...