websocket服务端开发

基于http请求以拉的方式去做服务器的推送,无论是实时性和有效字节都是差强人意的效果。

公司的im系统在与客户端的交互上实际上借助了websocket来实现服务器与客户端的事实消息推送,今天就来简单了解下这个协议,并且自己实现对websocket的响应。

可以看到在理解了tcp和http之后,websocket的设计其实并不复杂,再最开始建立链接的时候客户端实际上会进行一次http请求,只不过请求头的内容有些特别,这里我们来看下:

GET /chat HTTP/1.1

Host: server.example.com

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Origin: http://example.com

Sec-WebSocket-Protool: chat,superchat

Sec-WebSocket-Version:13

可以看到这个报文里包含了一些附加头信息。其中附加头信息"Upgrade: WebSocket" ,表明这是一个申请协议升级的http请求。"Sec-WebSocket-Key"是随机的,服务端会用这些数据构造出

一个SHA-1的信息摘要,把"Sec-WebSocket-Key"加上一个魔幻字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"。使用SHA-1加密,然后进行BASE-64编码,将结果作为"Sec-WebSocket-Accept"头的值,返回给客户端:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protool: chat

实现对websocket请求的响应:

public class WebsocketServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket=new ServerSocket(8080);
        Socket socket= serverSocket.accept();
        new Thread(new Handle(socket)).start();
    }
}
public class Handle implements Runnable{
    private Socket socket;

    Handle(Socket socket){
        this.socket=socket;
    }

    @Override
    public void run() {
        try {
            BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            OutputStreamWriter streamWriter=new OutputStreamWriter(socket.getOutputStream());
            BufferedWriter bufferedWriter=new BufferedWriter(streamWriter);
            String key=null;
            //读报文
            while (true){
               String s= reader.readLine();
               System.out.println(s);
                if (s.equals("")){
                   break;
                }else{
                    if (s.contains("Sec-WebSocket-Key")){
                        String keyValue[]=s.split(":");
                        key=keyValue[1].trim()+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
                    }
                }
            }
            //写报文
            MessageDigest messageDigest=DigestUtils.getSha1Digest();
            byte[] key2=messageDigest.digest(key.getBytes());
            Base64 base64 = new Base64();
            String finalKey=base64.encodeToString(key2);
            bufferedWriter.write("HTTP/1.1 101 Switching Protocols\r\n");
            bufferedWriter.write("Upgrade: websocket\r\n");
            bufferedWriter.write("Connection: Upgrade\r\n");
            bufferedWriter.write("Sec-WebSocket-Accept: "+finalKey+"\r\n");
            bufferedWriter.write("Sec-WebSocket-Protool: chat\r\n");
            bufferedWriter.write("\r\n");
            bufferedWriter.write("test");
            bufferedWriter.write("\r\n");
            bufferedWriter.flush();
            //接收数据
            System.out.println("响应报文已经发送");
            while (true){
                Thread.sleep(2000);
                String s=reader.readLine();
                System.out.println(s==null);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

原文地址:https://www.cnblogs.com/lccsblog/p/11144921.html

时间: 2024-07-31 22:15:37

websocket服务端开发的相关文章

不要害怕服务端开发(一)

经历了前端技术的变更,发现我再也不想去追前端技术了,同学们做java的现在还是做java,我之前做flash的现在没饭吃了,去年改做h5,行业不好混啊,java稳如狗. 之前一直想学服务端开发,现在改变了工作环境,稍微有点时间了,加上最近上班的工作实在是闲,上头布置的游戏前端demo,用3d写了一个,然后用2d写了一个,后面又用h5写了一个. 也找不到好的形容词去形容现在的状态,因为还在试用期,所以不敢太冒进,一直停留在写demo的进度上. 昨天开始,学着用nodejs写来静态服务器. 然后今天

用nodejs快速实现websocket服务端(带SSL证书生成)

有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的websocket却是接近于html5原始websocket协议,socket.io居然没有用武之地了. 当然情况也没有惨到需要你自己一步一步去实现websocket服务端,我们的大node有很多websocket库,ws就是其中一个,号称最轻量级,最快.ws的用法比较简单,直接看github说明(

如何进行SuperMap iServer服务端开发

有时候在进行地图应用开发时,可能单纯的客户端无法满足要求(如功能和性能等因素),这时就需要进行iServer的服务端开发.SuperMap iServer 6R/7c的服务端开发步骤如下: 一.在Eclipse中新建一个Dynamic Web Project 此过程截图略去 二.引用iServer所需的各类jar包 经测试后发现,必须引用iServer/WEB-INF/lib下的所有jar包,否则运行时会出现一些奇怪的错误.这些jar包所在的位置为[iServer安装目录]\webapps\is

在线教学、视频会议软件 Webus Fox(2) 服务端开发手册

上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1配置 1.1 IIS配置 Fox支持最基本的.net Framework4.0和IIS6/IIS7. 在IIS7中,对应应用程序池,需要配置为经典模式,支持.net4.0 1.2 web.config配置 Fox服务器端是暂时是host在IIS上,将来将Host在Windows Service上.对于IIS的配置,web.config是

专业移动APP 手机APP后台服务端开发

专业移动APP 手机APP后台服务端开发优势:8年PHP 9年JAVA开发经验采用THINKPHP 和JFINAL ,SBadmin 2框架进行开发完善的开发文档免费一年BUG维护 可签协议,可先预付20%,也可分段付款, 亲 请带好需求文档! QQ 184377367 报价原则1:功能列表2:兼容性3:安全要求等级4:是否需要完善的开发文档5:后台UI是否有要求

.NET服务端开发—多线程使用小结(多线程使用常识)

有一段时间没有更新博客了,最近半年都在着写书<.NET框架设计-大型企业级框架设计艺术>,很高兴这本书将于今年的10月份由图灵出版社出版,有关本书的具体介绍等书要出版的时候我在另写一篇文行做介绍.可以先透露一下,本书是博主多年来对应用框架学习的总结,里面包含了十几个重量级框架模式,这些模式都是我们目前所经常使用到的,对于学习框架和框架开发来说是很好的参考资料,大家敬请期待. 好了,进入文章主题. 最近几个月本人一直从事着SOA服务开发工作,简单点讲就是提供服务接口的:从提供前端接口WEBAPI

WCF服务端开发和客户端引用小结

1.服务端开发(包含寄宿) 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序,可生成一个带.svc后缀名的文件.该文件与webform中的aspx文件类似,有后置代码,这些后置代码是服务接口的实现.这种方式创建的WCF服务都承载在IIS或WAS上. (2)创建WCF服务库 WCF服务库是一个类库,如前所述包含一个服务接口和服务实现,此种方式创建的WCF服务可根据

服务端开发之下载图片等文件

服务端开发中,当客户端需要加载服务端发送的图片文件时,需要服务端提供一个下载图片的程序. 下载图片工具类的代码如下: import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; public class DownloadImageUtil { public stat

Teamcenter9 ITK服务端开发配置

说明:由于Tc9创造性的出现了64bit的版本,还有个更创造性的要求,就是64位的只能在VS2008sp1中编译,故以VS2008重新写了开发配置 首选项名称 TC_customization_libraries 环境 首先,来个环境的截图,E盘下目录. 创建项目 Eg:libMax_register_callbacks.c #include <tc.h> #include <user_server_exits.h> #include <user_exits/user_exi