socket websocket

1.websocket客户端

websocket允许通过JavaScript建立与远程服务器的连接,从而实现客户端与服务器间双向的通信。在websocket中有两个方法:  
    1、send() 向远程服务器发送数据
    2、close() 关闭该websocket链接
  websocket同时还定义了几个监听函数    
    1、onopen 当网络连接建立时触发该事件
    2、onerror 当网络发生错误时触发该事件
    3、onclose 当websocket被关闭时触发该事件
    4、onmessage 当websocket接收到服务器发来的消息的时触发的事件,也是通信中最重要的一个监听事件。msg.data
  websocket还定义了一个readyState属性,这个属性可以返回websocket所处的状态:
    1、CONNECTING(0) websocket正尝试与服务器建立连接
    2、OPEN(1) websocket与服务器已经建立连接
    3、CLOSING(2) websocket正在关闭与服务器的连接
    4、CLOSED(3) websocket已经关闭了与服务器的连接

  websocket的url开头是ws,如果需要ssl加密可以使用wss,当我们调用websocket的构造方法构建一个websocket对象(new WebSocket(url))的之后,就可以进行即时通信了。

<!DOCTYPE html>
<html><head><meta name="viewport" content="width=device-width" /><title>WebSocket 客户端</title></head><body><div><input type="button" id="btnConnection" value="连接" /><input type="button" id="btnClose" value="关闭" /><input type="button" id="btnSend" value="发送" /></div><script src="js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script><script type="text/javascript">var socket;if(typeof(WebSocket) == "undefined") {alert("您的浏览器不支持WebSocket");return;}$("#btnConnection").click(function() {//实现化WebSocket对象,指定要连接的服务器地址与端口socket = new WebSocket("ws://192.168.1.2:8888");//打开事件socket.onopen = function() {alert("Socket 已打开");//socket.send("这是来自客户端的消息" + location.href + new Date());};//获得消息事件socket.onmessage = function(msg) {alert(msg.data);};//关闭事件socket.onclose = function() {alert("Socket已关闭");};//发生了错误事件socket.onerror = function() {alert("发生了错误");}});//发送消息$("#btnSend").click(function() {socket.send("这是来自客户端的消息" + location.href + new Date());});//关闭$("#btnClose").click(function() {socket.close();});</script></body></html>

2.websocket服务器端

JSR356定义了WebSocket的规范,Tomcat7中实现了该标准。JSR356 的 WebSocket 规范使用 javax.websocket.*的 API,可以将一个普通 Java 对象(POJO)使用 @ServerEndpoint 注释作为 WebSocket 服务器的端点。

@ServerEndpoint("/push")public class EchoEndpoint {@OnOpenpublic void onOpen(Session session) throws IOException {//以下代码省略...}@OnMessagepublic String onMessage(String message) {//以下代码省略...}@Message(maxMessageSize=6)public void receiveMessage(String s) {//以下代码省略...} @OnErrorpublic void onError(Throwable t) {//以下代码省略...}@OnClosepublic void onClose(Session session, CloseReason reason) {//以下代码省略...} }

上面简洁代码即建立了一个WebSocket的服务端,@ServerEndpoint("/push")的annotation注释端点表示将WebSocket服务端运行在ws://[Server端IP或域名]:[Server端口]/项目/push的访问端点,客户端浏览器已经可以对WebSocket客户端API发起HTTP长连接了。
使用ServerEndpoint注释的类必须有一个公共的无参数构造函数,@onMessage注解的Java方法用于接收传入的WebSocket信息,这个信息可以是文本格式,也可以是二进制格式。
OnOpen在这个端点一个新的连接建立时被调用。参数提供了连接的另一端的更多细节。Session表明两个WebSocket端点对话连接的另一端,可以理解为类似HTTPSession的概念。
OnClose在连接被终止时调用。参数closeReason可封装更多细节,如为什么一个WebSocket连接关闭。
更高级的定制如@Message注释,MaxMessageSize属性可以被用来定义消息字节最大限制,在示例程序中,如果超过6个字节的信息被接收,就报告错误和连接关闭。

package action;import javax.websocket.CloseReason;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;//ws://127.0.0.1:8087/Demo1/ws/张三
@ServerEndpoint("/ws/{user}")
public class WSServer {private String currentUser;//连接打开时执行@OnOpenpublic void onOpen(@PathParam("user") String user, Session session) {currentUser = user;System.out.println("Connected ... " + session.getId());}//收到消息时执行@OnMessagepublic String onMessage(String message, Session session) {System.out.println(currentUser + ":" + message);return currentUser + ":" + message;}//连接关闭时执行@OnClosepublic void onClose(Session session, CloseReason closeReason) {System.out.println(String.format("Session %s closed because of %s", session.getId(), closeReason));}//连接错误时执行@OnErrorpublic void onError(Throwable t) {t.printStackTrace();}
}

url中的字符张三是的路径参数,响应请求的方法将自动映射。

3.小结

 Socket在应用程序间通信被广泛使用,如果需要兼容低版本的浏览器,建议使用反向ajax或长链接实现;如果纯移动端或不需考虑非现代浏览器则可以直接使用websocket。Flash实现推送消息的方法不建议使用,因为依赖插件且手机端支持不好。关于反向ajax也有一些封装好的插件如“Pushlet”。

参考:http://www.cnblogs.com/best/p/5695570.html

转载于:https://www.cnblogs.com/crazycode2/p/6922556.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript原型_JavaScript的原型:古怪,但这是它的工作原理

javascript原型by Pranav Jindal通过普拉纳夫金达尔 JavaScript的原型&#xff1a;古怪&#xff0c;但这是它的工作原理 (Prototype in JavaScript: it’s quirky, but here’s how it works) The following four lines are enough to confuse most JavaScript developers:以下…

mysql函数之SUBSTRING_INDEX(str,/,-1)

SUBSTRING_INDEX的用法&#xff1a; •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前&#xff0c;从字符串str返回自字符串。若count为正值,则返回最终定界符(从左边开始) 若为-1则是从后往前截取 SELECT substring_index(Hn_P00001, P, -1) -- 结果是…

mysql8.0主从配置,MySQL 8.0主从服务器(Master-Slave)配置

一、介绍MySQL 主从复制的方式有多种&#xff0c;本文主要演示基于基于日志(binlog)的主从复制方式。MySQL 主从复制(也称 A/B 复制) 的原理&#xff1a;Master将数据改变记录到二进制日志(binary log)中&#xff0c;也就是配置文件log-bin指定的文件&#xff0c; 这些记录叫做…

第十二章 Shell脚本编写及常见面试题(三)

本章目录&#xff1a;12.21 FTP下载文件#!/bin/bash if [ $# -ne 1 ]; thenecho "Usage: $0 filename" fi dir$(dirname $1) file$(basename $1) ftp -n -v << EOF # -n 自动登录 open 192.168.1.10 user admin adminpass binary # 设置ftp传输模式为二进制…

亚马逊面试有几轮_经过几个月的Google面试准备,我被亚马逊录用

亚马逊面试有几轮by Googley as Heck由Googley饰演Heck 经过几个月的Google面试准备&#xff0c;我被亚马逊录用 (After months of preparing for the Google interview, I got hired by Amazon) As you may know, the last 11 months have been very difficult for me. As a …

省选前的考试记录

日拱一卒功不唐捐 什么沙雕玩意儿 2018.12.24 T1 如果对 \(A\) 数组求出来高度递减的单调栈的话&#xff0c;会发现只有单调栈里的元素是有用的。因为如果有 \(A[i]<A[j] \And i<j\)&#xff0c;那电梯就可以在带 \(j\) 上楼的时候顺便把 \(i\) 带上并不会影响结果。所以…

软件工程课设-----日程管理系统

这学期进行了软件工程课设&#xff0c;题目是&#xff1a;日程管理系统&#xff08;JavaWeb&#xff09;&#xff0c;为期3周。这三周只有前两天是企业老师讲解是企业老师讲解相关的基础知识(老师讲的水平实在是不可恭维。。。。。。)。 多的不多说。直接进行对相关项目的介绍。…

matlab中的神经网络训练,MATLAB中的神经网络训练

我试图向前馈送反向传播&#xff0c;但是在网络训练之后&#xff0c;当模拟和打印模拟输出时&#xff0c;我看不到任何靠近目标的值&#xff0c;但它只是一个数字。代码如下。什么是错&#xff0c;什么是问题&#xff1f;前馈反向传播&#xff1a;>> load(E:/Inputdata.t…

Spring For All 顶级Spring综合社区服务平台

Spring For All 玩最纯粹的技术&#xff01;做最专业的 Spring 民间组织~ 欢迎加入&#xff1a;http://spring4all.com/ image.png

chromium 桌面_如何使用Chromium和PyInstaller将Web应用程序转换为桌面应用程序

chromium 桌面Packaging and distributing your app sounds simple in principle. It’s just software. But in practice, it’s quite challenging.打包和分发应用程序在原理上听起来很简单。 这只是软件。 但是在实践中&#xff0c;这非常具有挑战性。 I’ve been working …

PHP面向对象(三)

一、继承概念 继承性也是面向对象程序设计中的重要特性之一。它是指建立一个新的派生类&#xff0c;从一个先前定义的类中继承数据和函数&#xff0c;而且可以重新定义新的数据类型和函数&#xff0c;从而建立累的层次或等级关系。 格式&#xff1a;     [修饰符] class 子…

python数据结构的应用场景不包括,Python 数据结构学习

Python 数据结构学习列表list.append(x)在列表的末尾添加一个元素。相当于 a[len(a):] [x] 。list.extend(iterable)使用可迭代对象中的所有元素来扩展列表。相当于 a[len(a):] iterable 。list.insert(i, x)在给定的位置插入一个元素。第一个参数是要插入的元素的索引&#…

[Jinkey 原创]震惊!iOS 系统居然自带悬浮窗口调试工具

原文链接 : 震惊&#xff01;iOS 系统居然自带悬浮窗口调试工具 —— Jinkey 原创原文作者 : Jinkey1 背景 英文原文&#xff1a;http://ryanipete.com/blog/ios/swift/objective-c/uidebugginginformationoverlay/ 我写得这个并不是翻译而是用自己的理解重新表述这个功能&…

盲人编程_盲人如何编码

盲人编程About one out of every 200 software developers is blind. We know this because Stack Overflow asked 64,000 developers about this a few months ago.每200名软件开发人员中大约有1名是盲人。 我们之所以知道这一点&#xff0c;是因为几个月前 Stack Overflow 向…

hadoop环境搭建笔记

一、配置Linux &#xff08;1&#xff09;cat /etc/networks &#xff08;2&#xff09;cat /etc/sysconfig/network &#xff08;3&#xff09;vi /etc/udev/rules.d/70-persistent-net.rules eth1 改为eth0 &#xff08;4&#xff09;vi /etc/sysconfig/network-scripts/ifc…

边分治讲解

前言&#xff1a; 边分治和点分治一样属于树分治的一部分&#xff0c;相比于点分治&#xff0c;边分治对于与度数相关的问题有着很大的优势&#xff0c;同时边分治也是解决树上最优化问题的一种重要的算法。 分治过程&#xff1a; 边分治的分治过程与点分治类似&#xff0c;同样…

准确性 敏感性 特异性_如何掌握类型特异性的艺术

准确性 敏感性 特异性Do more specific definitions result in less flexibility?更具体的定义会导致灵活性降低吗&#xff1f; In this post I will try to avoid the debate about strong/static vs. weak/dynamic types (what more could possibly be said?), or even sc…

Pycharm社区版配置Django

Pycharm开发版(收费)自带Django模板&#xff0c;社区版(免费)需要通过命令行创建Django项目。 通过pip安装Django&#xff1a;pip install django2.0.2(版本号)&#xff0c;可通过以下命令检查是否安装成功 在命令行下创建Django项目(项目存放在D:\PyCharm) 1.创建项目 进入D:\…

家里也是不知不觉就电脑有不能开启了

一如既往的把电脑搬上去&#xff0c;我推测就是因为内存条金手指的接触不好了&#xff0c;然后多次的强制关机让我心疼&#xff0c;还有是花了30元装系统还是有些不服气&#xff0c;最后还是要回去弄好。 转载于:https://www.cnblogs.com/bkchengzheng/p/5662222.html