您的位置:首页 > 移动开发 > Android开发

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入门)

——————————————————————–
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息