2.服务器端
------------------使用Map<K,V>集合保存连接的Sockets;K为客户端注册的信息,V是对应的socket
------------------开启线程保存不同的Sockets
------------------解析数据中待用的地址,然后在集合中get对应的Socket,然后发送信息;
1.服务器端
------------------使用Map<K,V>集合保存连接的Sockets;K为客户端注册的信息,V是对应的socket
------------------开启线程保存不同的Sockets
------------------解析数据中待用的地址,然后在集合中get对应的Socket,然后发送信息;
实际开发中可能还是会涉及服务器端之间的同学,还有就是数据库的拿去注册信息,寻找对应的socket,在这里只用单个SocketServer代替
package org.itheima.server;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class SoketServer_4 {
//
private static Map<String, Socket> clients = new LinkedHashMap<String, Socket>();
public static void main(String[] args) {
int port = 9999;
try {
// 1.创建服务器
ServerSocket server = new ServerSocket(port);
System.out.println("创建服务器");
while (true) {
// 2. 获取客户端的连接
System.out.println("准备accept");
// 保存客户端的实例
final Socket client = server.accept();// 阻塞式
System.out.println("accept完成");
new Thread(new Runnable() {
@Override
public void run() {
try {
// 获取输入流
InputStream is = client.getInputStream();
byte[] buffer = new byte[1024];
int len = -1;
// 阻塞式方法
System.out.println("准备读取");
while ((len = is.read(buffer)) != -1) {
System.out.println("读取完成");
String data = new String(buffer, 0, len);
System.out.println("输入的内容 :" + data);
// http --> 消息行,消息头,内容 ---->data
// session --> header ---> tomcat
// --->map<session,value>
// data --> data
// data --> #A --> 发送的是认证信息
// data --> 不是以# --> 文本信息 --> 对应的是谁 A#abcd
// 简易模型
//1. 认证
//2. 发送消息
//3. 朋友邀请 -->重新定义数据格式
if (data.startsWith("#")) {
// 认证信息,将client放到池子中
System.out.println("认证" + data);
clients.put(data, client);
} else {
// 文本消息
String[] split = data.split("#");
Socket c = clients.get("#" + split[0]);
if (c != null) {
System.out.println("给" + split[0]
+ "发送" + split[1]);
OutputStream os = c.getOutputStream();
os.write(split[1].getBytes());
}
}
// 将消息转给对应的人
// for (Socket c : clients) {
// if (c != client) {
//
// OutputStream os = c.getOutputStream();
// os.write(data.getBytes());
// }
// }
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}