Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天
2016-06-26 22:07
906 查看
一、分析:
1、修改原来的服务端,因为is.read(buffer)是阻塞式读取,所以必须把其抽取出来放置在新的子线程里。不知大家还记不记得多线程下载的原理也是这样,开个主线程,其它的分段读取又都放在另外的子线程里去运行
2、为了能把自己发送的信息转发给其它客户,必须使用LinkedList来添加所有的client,然后使用for循环把收到的信息转发
3、如图:
二、只需要服务器端实现:
package com.java.socket.server; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; /** * @描述 服务器端 * @项目名称 SocketServer * @类名 TCPServer * @author chenlin * @date 2012年6月26日 下午4:36:27 * @version 1.0 */ @SuppressWarnings("all") public class TCPServer { public static void main(String[] args) { final LinkedList<Socket> list = new LinkedList<Socket>(); int port = 10002; try { ServerSocket server = new ServerSocket(port); while (true) { // 获得客户端连接 // 阻塞式方法 System.out.println("准备阻塞..."); final Socket client = server.accept(); System.out.println("阻塞完成..."); // 添加到集合里 list.add(client); new Thread(new Runnable() { @Override public void run() { try { // 输入流,为了获取客户端发送的数据 InputStream is = client.getInputStream(); // 得到输出流 OutputStream out = client.getOutputStream(); byte[] buffer = new byte[1024]; int len = -1; System.out.println("准备read..."); while ((len = is.read(buffer)) != -1) { String text = new String(buffer, 0, len); System.out.println(text); // 回复信息 out.write("收到信息,over".getBytes()); // 把收到的信息转发给其它客户端 for (Socket s : list) { if (s != client) { OutputStream outputStream = s.getOutputStream(); outputStream.write(text.getBytes()); } } } } catch (Exception e) { e.printStackTrace(); } } }).start(); } } catch (Exception e) { e.printStackTrace(); } } }
———————————————————————
(java 架构师全套教程,共760G, 让你从零到架构师,每月轻松拿3万)
有需求者请进站查看,非诚勿扰
https://item.taobao.com/item.htm?spm=686.1000925.0.0.4a155084hc8wek&id=555888526201
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
(送:hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门)
——————————————————————–
相关文章推荐
- java-模拟tomcat服务器
- Linux socket 初步
- 小心服务器内存居高不下的元凶--WebAPI服务
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题