一、分析:

1、修改原来的服务端,因为is.read(buffer)是阻塞式读取,所以必须把其抽取出来放置在新的子线程里。
不知大家还记不记得多线程下载的原理也是这样,开个主线程,其它的分段读取又都放在另外的子线程里去运行

2、为了能把自己发送的信息转发给其它客户,必须使用LinkedList来添加所有的client,然后使用for循环把收到的信息转发

3、如图:

Android 使用Socket实现服务器与手机客户端的长连接二:多Client对一Server聊天_server

二、只需要服务器端实现:

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();
}
}

}