Websocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 连接成功后,服务端与客户端可以双向通信。在需要消息推送的场景,Websocket 相对于轮询能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
具体如下特点
在客户端的列表数据中有个 status 字段,服务器端需要花费较长的时间进行处理,处理完成后才会更新对应数据的 status 字段值,通过 Websocket 的处理流程如下:
通过注入 ServerEndpointExporter 类,用于在项目启动的时候自动将使用了 @ServerEndpoint 注解声明的 Websocket endpoint 注册到 WebSocketContainer 中。
为什么增加一个 ServerEndpointExporter Bean,并通过在一个类上增加 @ServerEndpoint 和 @Component 注解就可以实现服务器端 Websocket 功能,这里简单解析一下。
java 定义了一套 javaxservlet-api, 一个 >最好的方法是:每一客户端用唯一的ID来标示,
就像QQ号一样,
在客户端连接服务器,发送自己的ID,
然后和相应产生的SOCKET进行绑定,
一个客户端向另一个客户端发送信息时,要求在数据包里包含对方的ID号。可以定义一个类型下列的数据结构对数据包进行封装:
type
struct
_sdata
{
int
sourceID;//发送者自己的ID
int
destID;
//接收者的ID
char
datainfo[1];//数据信息
}SDATA,
PSDATA;定时器:使用SystemTimersTimer类 SystemTimersTimer t = new SystemTimersTimer(10000);//实例化Timer类,设置间隔时间为10000毫秒; tElapsed += new SystemTimersElapsedEventHandler(theout);//到达时间的时候执行事件; tAutoReset = true;//设置是一直执行(true)还是执行一次(false); tEnabled = true;//是否执行SystemTimersTimerElapsed事件; public void theout(object source, SystemTimersElapsedEventArgs e) { MessageBoxShow("OK!"); } 多线程方面:package Server;
import javaio;
import javanet;
import messageMessageType;
//该线程用于和客服端进行通信,是一个线程类
public class ServerClientComunicationThread extends Thread{
Socket s=null;
ObjectInputStream ois=null;
MessageType mt=null;
ObjectOutputStream oos=null;
public ServerClientComunicationThread(Socket s){
thiss=s;
}
public void run(){
//不停地从socket里面读取数据
while(true){
try {
ois=new ObjectInputStream(sgetInputStream());
mt=(MessageType)oisreadObject();
Systemoutprintln("服务器读取到的信息");
Systemoutprintln(mtgetContent()+" "+mtgetGetter()+" "+
mtgetMessagetype()+mtgetSendTime());
//将读取到的数据转发给对应的客服端
Systemoutprintln("从集合里面可以找到用户压迫将数据发送给"+ ManageOnlineUserhmget(mtgetGetter()));
oos=new ObjectOutputStream(( ManageOnlineUserhmget(mtgetGetter()))getOutputStream());
ooswriteObject(mt);
} catch (Exception e) {
eprintStackTrace();
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)