先说WebSocket的客户端,用Javascript写就行

var websocekt=new WebSocket("ws://127.0.0.0:8888");//8888是端口号
websocket.onopen=function(event){//...当连接成功会执行这里的代码
}

对于WebSocket,连接成功是实现握手。

服务端先运行着,这边打开客户端,客户端建立websocket,就会向其指定的服务端地址端口发送一个

HTTP请求,大概如下:

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:8888
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: CoIrEpLMznRgAYho/n3ooQ==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36

这就是客户端建立websocket时发往服务端的请求消息

服务端也要加应一个相应的消息到客户端,成功了才算握手成功,才能开始正式的通信

注意其中的Sec-WebSocket-Key

服务端返回握手信息需要用到这个Key,拿这个Key生成一个Sec-WebSocket-Accept,加到返回信息中回送给客户端

我们建个服务端

public class Server {public Server() throws Exception{ServerSocket ss=new ServerSocket(30000);Socket socket=ss.accept();InputStream in=socket.getInputStream();OutputStream out=socket.getOutputStream();byte[] buff=new byte[1024];int count=-1;String req="";count=in.read(buff);req=new String(buff, 0, count);System.out.println("握手请求:"+req);String secKey=getSecWebSocketKey(req);System.out.println("secKey="+secKey);String response="HTTP/1.1 101 Switching Protocols\r\nUpgrade: "+"websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "+getSecWebSocketAccept(secKey)+"\r\n\r\n";System.out.println("Sec-Accept="+getSecWebSocketAccept(secKey));out.write(response.getBytes());count=in.read(buff);System.out.println("接收的字节数:"+count);for(int i=0;i<count-6;i++){buff[i+6]=(byte)(buff[i%4+2]^buff[i+6]);}System.out.println("接收的内容:"+new String(buff, 6, count-6, "UTF-8"));byte[] pushHead=new byte[2];pushHead[0]=buff[0];String pushMsg="收到!收到!欢迎加入WebSocket世界!";pushHead[1]=(byte)pushMsg.getBytes("UTF-8").length;out.write(pushHead);out.write(pushMsg.getBytes("UTF-8"));socket.close();ss.close();}private String getSecWebSocketKey(String req){Pattern p=Pattern.compile("^(Sec-WebSocket-Key:).+",Pattern.CASE_INSENSITIVE|Pattern.MULTILINE);Matcher m=p.matcher(req);if(m.find()){String foundstring=m.group();return foundstring.split(":")[1].trim();}else{return null;}}private String getSecWebSocketAccept(String key) throws Exception{String guid="258EAFA5-E914-47DA-95CA-C5AB0DC85B11";key+=guid;MessageDigest md=MessageDigest.getInstance("SHA-1");md.update(key.getBytes("ISO-8859-1"),0,key.length());byte[] shaHash=md.digest();BASE64Encoder encoder=new BASE64Encoder();return encoder.encode(shaHash);}public static void main(String[] args) throws Exception{new Server();}
}

其中Base64Encoder是在包sun.misc下,eclipse下需要在项目的BuildPath中对JRE中的Access rules进行设置。

页面这边

<body><script type="text/javascript">var webSocket=new WebSocket("ws://127.0.0.1:8888");
webSocket.onopen=function(){
alert("已打开连接");
webSocket.send("我是谁");
};
webSocket.onmessage=function(event){
alert("收到的消息是:"+event.data);
};
webSocket.onclose=function(event){
alert("close");
};</script>
</body>

先运行Server,再打开网页就会看到效果

转载于:https://blog.51cto.com/shuxiayeshou/1762152

Java Socket实现WebSocket服务器相关推荐

  1. Android之在Java socket作为服务器里面返回数据头部怎么写入浏览器需要下载文件的文件名

    1 问题 Android app里面写了一个Java socket的简单服务器,在浏览器里面输入相应的IP和端口访问服务器下载文件,Java socket怎么写返回数据的头部信息,浏览器才知道需要下载 ...

  2. 实现服务器和客户端数据交互,Java Socket有妙招

    摘要:在Java SDK中,对于Socket原生提供了支持,它分为ServerSocket和Socket. 本文分享自华为云社区<Java Socket 如何实现服务器和客户端数据交互>, ...

  3. 【小白入门】Socket和webSocket入门 这一篇就够了!用php的Socket自己实现简单webSocket服务器!

     这几天研究了下php实现webSocket的方法,网上查了不少博文,涉及到的知识点不少.但却非常值得学,因为这方面典型的应用场景非常的多,消息推送,聊天室,所有需要长连接的地方都会用到它.     ...

  4. Java网络编程——9.服务器Socket

    2019独角兽企业重金招聘Python工程师标准>>> 前一章从客户端的角度讨论了Socket,客户端就是向监听连接的服务器打开一个Socket的程序,不过如果不能与服务器对话,客户 ...

  5. h5 socket.io java,从HTML5 WebSocket到Socket.io

    HTML5 WebSocket 作为新一代的web标准,HTML5为我们提供了很多有用的东西,比如canvas,本地存储(已经分离出去了),多媒体编程接口,当然还有我们的WebSocket.WebSo ...

  6. java http服务端例子_简单的用 Java Socket 编写的 HTTP 服务器应用

    /*** SimpleHttpServer.java*/importjava.io.*;importjava.net.*;importjava.util.StringTokenizer;/*** 一个 ...

  7. 用JAVA SOCKET编程,读服务器几个字符,再写入本地显示

    Server: package cn.itcast.framework.socket;import java.io.BufferedReader; import java.io.IOException ...

  8. Java 网络实例二(查看主机指定文件的最后修改时间、Socket实现多线程服务器程序、Socket连接到指定主机、网页抓取)

    查看主机指定文件的最后修改时间 import java.net.URL; import java.net.URLConnection; import java.util.Date; import ja ...

  9. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

最新文章

  1. 条件选择结构:星期计划(switch)
  2. 大雁蛋人工孵化的方法_大鹅繁殖有哪些方法,您了解吗?
  3. 科大星云诗社动态20210521
  4. android 保存流媒体,Android实现使用流媒体播放远程mp3文件的方法
  5. 在 Eclipse 3.5中在线安装SVN插件
  6. Linux16.04安装Matlab2016b详细教程
  7. JoyOI(TYVJ)1061-Mobile Service【线性dp】
  8. iOS webview自适应实际内容高度的4种方法
  9. MySQL的position值是什么_MySQL数据库中系统函数POSITION功能简介
  10. Linux/Unix IO多路复用之select网络编程(含源码)
  11. 21-nginx单机1W并发优化
  12. python jieba分词教程_Python jieba分词
  13. 应急指挥调度管理系统|城市综合应急指挥调度系统
  14. 计算机ip地址和用户名和密码忘记了怎么办,192.168.1.112这是IP地址 我把密码忘了 怎么处理啊 电脑室现在还...
  15. Android使用WebView打包网页成app
  16. 如何应用SPSS的频率分析,分析数值分布规律
  17. 各种HDR标准的技术细节,读这一篇就够了
  18. 计算机一级ps知识,2017年9月计算机一级photoshop考试试题
  19. 把Excel里的url链接转换为图片显示
  20. 成人脑力训练 3.951

热门文章

  1. 华为手机的“美国梦”
  2. .NET设计模式(16):模版方法(Template Method)
  3. 视频直播网站开发千万不能忘的一个知识点
  4. Day4--Scrapy基本使用
  5. Java线程入门第三篇
  6. Shell编程基础---函数、数组
  7. gitlab更改默认Nginx
  8. 《Linux嵌入式实时应用开发实战(原书第3版)》——3.5 Linux文件系统
  9. 一道算法题,求更好的解法
  10. 我的CCIE实验考试