模拟Socket的通讯----(3)---服务器端--可忽略
来源:互联网 发布:怎么用邮箱注册知乎 编辑:程序博客网 时间:2024/05/21 08:36
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();
}
}
}
0 0
- 模拟Socket的通讯----(3)---服务器端--可忽略
- Java Socket 模拟客户端与服务器端通讯
- 模拟Socket的通讯----(2)---客户端
- Java 简单的Socket通讯的服务器端实现
- 简单的socket通讯方法客户端和服务器端
- 简单的C# Socket 通讯,可传文件
- (源代码)基于wince OS客户端与基于window OS的服务器端之间的SOCKET通讯
- Windows Socket 编程 服务器端 可多用户连接
- 直播项目,在线聊天功能--socket实现客户端和服务器端通讯的简单案例
- SOCKET服务器端的操作
- Socket服务器端的代码
- 完整版的Socket服务器端
- java之Socket模拟服务器端与客户端
- C# socket通信 模拟服务器端、客户端
- 可忽略的小概率
- Java客户端与服务器端的超简易通讯3
- delphi的socket通讯
- delphi的socket通讯
- mysql 二进制日志恢复
- 队列:队尾----队头 对应 栈底----栈顶 对应 序号 N----3,2,1,0
- 一个线性布局中,为什么 android:layout_gravity="right"不能控制按钮在屏幕右侧?
- 理解Cookie和Session机制
- 端口号冲突
- 模拟Socket的通讯----(3)---服务器端--可忽略
- 【bzoj4321】queue2
- OC学习旅程(二)类和对象的存储细节、#paragma mark 和 新建类时的常见错误
- java list的遍历
- 集合中元素的顺序
- linux:环境变量配置文件
- CentOs Yum在线安装MYSQL5.6
- LinkedList和ArrayList、ArrayDeque的比较
- 译:PendingIntent详解