精华内容
下载资源
问答
  • 发送消息(换句话说,服务器→浏览器)您要发送的帧需要根据WebSocket框架格式进行格式化。对于发送消息,此格式如下:包含数据类型的一个字节(以及一些超出普通服务器范围的附加信息)包含长度的字节如果长度不适合于...

    发送消息

    (换句话说,服务器→浏览器)

    您要发送的帧需要根据WebSocket框架格式进行格式化。对于发送消息,此格式如下:包含数据类型的一个字节(以及一些超出普通服务器范围的附加信息)

    包含长度的字节

    如果长度不适合于第二个字节,则为两个或八个字节(然后,第二个字节是表示长度使用多少字节的代码)。

    实际(原始)数据

    第一个字节是1000 0001(或129)用于文本帧。

    第二个字节的第一个位设置为0因为我们没有对数据进行编码(从服务器到客户端的编码不是强制性的)。

    有必要确定原始数据的长度,以便正确地发送长度字节:如果

    0 <= length <= 125,您不需要额外的字节

    如果

    126 <= length <= 65535,您需要另外两个字节,第二个字节是

    126

    如果

    length >= 65536,您需要额外的8个字节,第二个字节是

    127

    长度必须被分割成单独的字节,这意味着您需要将位移到右边(数量为8位),然后只保留最后的8位。AND 1111 1111(这是255).

    在长度字节之后是原始数据。

    这将导致以下伪代码:bytesFormatted[0] = 129

    indexStartRawData = -1 // it doesn't matter what value is

    // set here - it will be set now:

    if bytesRaw.length <= 125

    bytesFormatted[1] = bytesRaw.length

    indexStartRawData = 2

    else if bytesRaw.length >= 126 and bytesRaw.length <= 65535

    bytesFormatted[1] = 126

    bytesFormatted[2] = ( bytesRaw.length >> 8 ) AND 255

    bytesFormatted[3] = ( bytesRaw.length      ) AND 255

    indexStartRawData = 4

    else

    bytesFormatted[1] = 127

    bytesFormatted[2] = ( bytesRaw.length >> 56 ) AND 255

    bytesFormatted[3] = ( bytesRaw.length >> 48 ) AND 255

    bytesFormatted[4] = ( bytesRaw.length >> 40 ) AND 255

    bytesFormatted[5] = ( bytesRaw.length >> 32 ) AND 255

    bytesFormatted[6] = ( bytesRaw.length >> 24 ) AND 255

    bytesFormatted[7] = ( bytesRaw.length >> 16 ) AND 255

    bytesFormatted[8] = ( bytesRaw.length >>  8 ) AND 255

    bytesFormatted[9] = ( bytesRaw.length       ) AND 255

    indexStartRawData = 10

    // put raw data at the correct index

    bytesFormatted.put(bytesRaw, indexStartRawData)

    // now send bytesFormatted (e.g. write it to the socket stream)

    接收讯息

    (换句话说,浏览器→服务器)

    您获得的帧格式如下:包含数据类型的一个字节。

    包含长度的字节

    如果长度不适合第二个字节,则增加两个或八个字节。

    四个字节,它们是掩码(=解码键)

    实际数据

    第一个字节通常并不重要-如果您只是发送文本,则只使用文本类型。它将是1000 0001(或129)在这种情况下。

    第二个字节和额外的两个或八个字节需要一些解析,因为您需要知道长度使用了多少字节(您需要知道实际数据的起始位置)。长度本身通常是不必要的,因为您已经有了数据。

    第二个字节的第一个位总是1这意味着数据被蒙住了(=编码)。从客户端到服务器的消息总是被屏蔽。你需要删除第一位secondByte AND 0111 1111..有两种情况下,结果字节不表示长度,因为它不适合于第二个字节:第二个字节

    0111 1110,或

    126,表示长度使用以下两个字节

    第二个字节

    0111 1111,或

    127,表示长度使用以下八个字节

    这四个掩码字节用于解码已发送的实际数据。解码算法如下:decodedByte = encodedByte XOR masks[encodedByteIndex MOD 4]

    哪里encodedByte是数据中的原始字节,encodedByteIndex是从第一个字节计数的字节的索引(偏移)。真实数据,其中有索引0. masks包含四个掩码字节的数组。

    这导致了用于解码的下列伪码:secondByte = bytes[1]

    length = secondByte AND 127 // may not be the actual length in the two special cases

    indexFirstMask = 2          // if not a special case

    if length == 126            // if a special case, change indexFirstMask

    indexFirstMask = 4

    else if length == 127       // ditto

    indexFirstMask = 10

    masks = bytes.slice(indexFirstMask, 4) // four bytes starting from indexFirstMask

    indexFirstDataByte = indexFirstMask + 4 // four bytes further

    decoded = new array

    decoded.length = bytes.length - indexFirstDataByte // length of real data

    for i = indexFirstDataByte, j = 0; i 

    decoded[j] = bytes[i] XOR masks[j MOD 4]

    // now use "decoded" to interpret the received data

    展开全文
  • 如何在android中使用websocket协议进行服务器通信发布时间:2021-01-20 16:44:36来源:亿速云阅读:132作者:Leah本篇文章给大家分享的是有关如何在android中使用websocket协议进行服务器通信,小编觉得挺实用的,...

    如何在android中使用websocket协议进行服务器通信

    发布时间:2021-01-20 16:44:36

    来源:亿速云

    阅读:132

    作者:Leah

    本篇文章给大家分享的是有关如何在android中使用websocket协议进行服务器通信,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

    客户端代码:import com.example.test.R;

    import android.app.Activity;

    import android.os.Bundle;

    import android.view.View;

    import android.view.View.OnClickListener;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.Toast;

    import de.tavendo.autobahn.WebSocketConnection;

    import de.tavendo.autobahn.WebSocketConnectionHandler;

    import de.tavendo.autobahn.WebSocketException;

    public class MainActivity extends Activity implements OnClickListener {

    private Button bt;

    private EditText ed_name;

    private EditText ed_text;

    private Button bt1;

    WebSocketConnection wsc;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    bt = (Button) findViewById(R.id.bt);

    ed_name = (EditText) findViewById(R.id.ed_name);

    ed_text = (EditText) findViewById(R.id.ed_text);

    bt1 = (Button) findViewById(R.id.bt1);

    bt.setOnClickListener(this);

    bt1.setOnClickListener(this);

    wsc = new WebSocketConnection();

    }

    private void connect() {

    System.out.println("开始连接websocket///");

    try {

    wsc.connect("ws://192.168.1.245:8080/DriveServer/mainservlet",

    new WebSocketConnectionHandler() {

    @Override

    public void onBinaryMessage(byte[] payload) {

    System.out.println("onBinaryMessage size="

    + payload.length);

    }

    @Override

    public void onClose(int code, String reason) {

    System.out.println("onClose reason=" + reason);

    }

    @Override

    public void onOpen() {

    System.out.println("onOpen");

    showtext("连接成功");

    // wsc.sendTextMessage("Hello!");

    // wsc.disconnect();

    }

    @Override

    public void onRawTextMessage(byte[] payload) {

    System.out.println("onRawTextMessage size="

    + payload.length);

    }

    @Override

    public void onTextMessage(String payload) {

    System.out.println("onTextMessage" + payload);

    showtext(payload);

    }

    });

    } catch (WebSocketException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    @Override

    public void onClick(View v) {

    // TODO Auto-generated method stub

    int id = v.getId();

    switch (id) {

    case R.id.bt :

    wsc.sendTextMessage("我是客户端,我通过ws往服务器发数据");

    break;

    case R.id.bt1 :

    connect();

    break;

    default :

    break;

    }

    }

    private void showtext(String msg) {

    Toast.makeText(this, msg, 0).show();

    }

    }

    下面是服务器代码:

    用的是jetty7自带的websocket库package com.websocket;

    import java.io.IOException;

    import java.io.UnsupportedEncodingException;

    import java.nio.ByteBuffer;

    import java.nio.CharBuffer;

    import java.text.SimpleDateFormat;

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.Set;

    import javax.servlet.ServletException;

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

    import org.eclipse.jetty.websocket.WebSocket;

    import org.eclipse.jetty.websocket.WebSocket.OnTextMessage;

    import org.eclipse.jetty.websocket.WebSocketServlet;

    public class ChatWebSocketServlet extends WebSocketServlet {

    private static final long serialVersionUID = 911879078000755859L;

    private List list = new ArrayList();

    class MyWebSocket implements OnTextMessage {

    private String userName = "匿名用户";

    public MyWebSocket(String userName) {

    if (userName != null && userName.length() > 0) {

    this.userName = userName;

    }

    }

    private Connection conn;

    public void onClose(int arg0, String arg1) {

    // TODO Auto-generated method stub

    System.out.println("onOpen 断开连接了。。。。。。。。" + arg1 + " " + arg0);

    list.remove(this);

    }

    public void onOpen(Connection arg0) {

    // TODO Auto-generated method stub

    System.out

    .println("onOpen 连接了。。。。。。。。。。。。" + arg0.getMaxIdleTime());

    this.conn = arg0;

    if (!list.contains(arg0)) {

    list.add(this);

    } else {

    System.out.println("这个用户已经连接了");

    }

    System.out.println(".." + list.size());

    }

    public void onMessage(String arg0) {

    String toname = arg0.substring(0, 3);

    System.out.println("toname-->" + toname);

    try {

    list.get(0).getConn()

    .sendMessage(arg0.substring(3));

    System.out.println("发送的数据" + arg0.substring(3));

    } catch (IOException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    private Connection getConn() {

    return this.conn;

    }

    }

    public WebSocket doWebSocketConnect(HttpServletRequest arg0, String arg1) {

    // TODO Auto-generated method stub

    String name = "";

    name = arg0.getParameter("username");

    System.out.println(name + "is connected");

    return new MyWebSocket(name);

    }

    @Override

    protected void service(HttpServletRequest request,

    HttpServletResponse response) throws ServletException, IOException {

    // TODO Auto-generated method stub

    super.service(request, response);

    }

    }

    以上就是如何在android中使用websocket协议进行服务器通信,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

    展开全文
  • Websocket接收和发送消息

    千次阅读 2021-03-09 03:49:07
    本篇文章帮大家学习Websocket接收和发送消息,包含了Websocket接收和发送消息使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。通常在服务器发送一些数据时发生Message事件。服务器...

    本篇文章帮大家学习Websocket接收和发送消息,包含了Websocket接收和发送消息使用方法、操作技巧、实例演示和注意事项,有一定的学习价值,大家可以用来参考。

    通常在服务器发送一些数据时发生Message事件。服务器发送到客户端的消息可以包括纯文本消息,二进制数据或图像。无论何时发送数据,都会触发onmessage函数。

    此事件充当客户端对服务器的耳朵。每当服务器发送数据时,都会触发onmessage事件。

    以下代码段描述了打开Web Socket协议的连接。

    connection.onmessage = function(e){

    var server_message = e.data;

    console.log(server_message);

    }

    还需要考虑使用Web套接字可以传输哪些类型的数据。Web套接字协议支持文本和二进制数据。就javascript而言,文本指的是字符串,而二进制数据则表示为ArrayBuffer。

    Web套接字一次只支持一种二进制格式。二进制数据的声明明确地完成如下 -

    socket.binaryType = "arrayBuffer";

    socket.binaryType = "blob";

    字符串

    字符串是一种人类可读的格式,如xml和JSON。每当引发onmessage事件时,客户端都需要检查数据类型并采取相应措施。

    用于确定数据类型为字符串(String)的代码片段如下所述 -

    socket.onmessage = function(event){

    if(typeOf event.data === String ) {

    console.log(“Received data string”);

    }

    }

    JSON(javaScript对象表示法)

    它是一种轻量级格式,用于在计算机之间传输人类可读的数据。JSON的结构由键值对组成。

    示例

    {

    name: "James Devilson",

    message: "Hello World!"

    }

    以下代码显示如何处理JSON对象并提取其属性 -

    socket.onmessage = function(event) {

    if(typeOf event.data === String ){

    //create a JSON object

    var jsonObject = JSON.parse(event.data);

    var username = jsonObject.name;

    var message = jsonObject.message;

    console.log("Received data string");

    }

    }

    XML

    尽管从浏览器到浏览器的技术各不相同,但解析XML并不困难。最好的方法是使用jQuery等第三方库进行解析。

    在XML和JSON中,服务器以字符串形式响应,该字符串在客户端进行解析。

    ArrayBuffer

    它由结构化二进制数据组成。封闭的位按顺序给出,以便可以容易地跟踪位置。ArrayBuffers可以方便地存储图像文件。

    使用ArrayBuffers接收数据非常简单。使用运算符instanceOf(不是equal)运算符。以下代码显示了如何处理和接收ArrayBuffer对象 -

    socket.onmessage = function(event) {

    if(event.data instanceof ArrayBuffer ){

    var buffer = event.data;

    console.log("Received arraybuffer");

    }

    }

    演示应用程序

    以下程序代码显示如何使用Web套接字发送和接收消息。

    WebSocket Test

    var wsUri = "wss://echo.websocket.org/";

    var output;

    function init()

    {

    output = document.getElementById("output");

    testWebSocket();

    }

    function testWebSocket()

    {

    websocket = new WebSocket(wsUri);

    websocket.onopen = function(evt) { onOpen(evt) };

    websocket.onclose = function(evt) { onClose(evt) };

    websocket.onmessage = function(evt) { onMessage(evt) };

    websocket.onerror = function(evt) { onError(evt) };

    }

    function onOpen(evt)

    {

    writeToScreen("CONNECTED");

    doSend("Websocket教程(Power by jikedaquan.com)");

    }

    function onClose(evt)

    {

    writeToScreen("DISCONNECTED");

    }

    function onMessage(evt)

    {

    writeToScreen('RESPONSE: ' + evt.data+'');

    websocket.close();

    }

    function onError(evt)

    {

    writeToScreen('ERROR: ' + evt.data);

    }

    function doSend(message)

    {

    writeToScreen("SENT: " + message);

    websocket.send(message);

    }

    function writeToScreen(message)

    {

    var pre = document.createElement("p");

    pre.style.wordWrap = "break-word";

    pre.innerHTML = message;

    output.appendChild(pre);

    }

    window.addEventListener("load", init, false);

    WebSocket Test

    在浏览器中打开上面代码文件,得到以下结果:

    展开全文
  • I have a WebSocket server implemented in Java. When a client connects I want to send an image over this connection for the client to use in a canvas element. I have come up with the following server c...

    I have a WebSocket server implemented in Java. When a client connects I want to send an image over this connection for the client to use in a canvas element. I have come up with the following server code:

    public void onOpen(Connection connection) {

    try {

    BufferedImage image = ImageIO.read(new File("image.jpg"));

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    ImageIO.write(image, "jpg", baos);

    byte[] byteArray = baos.toByteArray();

    connection.sendMessage(byteArray, 0, byteArray.length);

    } catch (Exception e ){

    System.out.println("Error: "+e.getMessage());

    }

    }

    The client-side Javascript looks like this:

    onmessage : function(m) {

    if (m.data) {

    if (m.data instanceof Blob) {

    var blob = m.data;

    var bytes = new Uint8Array(blob);

    var image = context.createImageData(canvas.width, canvas.height);

    for (var i=0; i

    image.data[i] = bytes[i];

    }

    }

    }

    }

    The connection works and the data is sent (blob.size has the correct value), but the image is not drawn onto the canvas. Firefox gives me the error message "TypeError: Value could not be converted to any of: HTMLImageElement, HTMLCanvasElement, HTMLVideoElement.".

    I am aware of the fact that this using WebSockets is not the best way to send an image to the client. After sending the image the WebSocket is only used to send text messages.

    What do I need to change for the image to be sent an applied to the canvas?

    Resources used:

    解决方案

    Try converting the image to base64 before sending, for example:

    function drawImage(imgString){

    var canvas = document.getElementById("canvas");

    var ctx = canvas.getContext("2d");

    var image = new Image();

    image.src = imgString;

    image.onload = function() {

    ctx.drawImage(image, 0, 0);

    };

    }

    Here's a link on how to convert the image to base64 in Java

    展开全文
  • 用netty搭建的websocket服务器,发现在发送大文件时,引起客户端断线,经看日志,发现发送大文件时,服务器没有发送回应客户端websocket的pong包,导致客户端自动断线。但是如果发送文件时,对于每次发包间隔一定...
  • netty5写回websocket的数据,websocket接收不到handler处理如下package com.amarky.websocket;import org.apache.log4j.Logger;import io.netty.buffer.ByteBuf;import io.netty.buffer.Unpooled;import io.netty....
  • /******************************************************************************* Compilation: javac StdAudio.java* Execution: java StdAudio* Dependencies: none** Simple library for reading, wr...
  • 同一个用户A,分别在浏览器两个窗口分别打开,想B,C两个用户发送消息,现在B和C都能购接受...采用的技术是node.js + websocket这是B和C发送消息代码:sendMessage:function(){if(this.socket.connected){if($("#sen...
  • websocket是什么呢,websocket是一个和服务器通信的新的协议,一般而言,浏览器和服务器通信最常用的是http协议,但是http协议是无状态的,每次浏览器请求信息,服务器返回信息后这个浏览器和服务器通信的信道就被...
  • 打算用websocket做一个简单的视频直播,服务器端用python做的,从摄像头不断的抓图片,然后传送给浏览器,通信用websocket。现在遇到的问题是,服务器端抓到的图片可以传送给浏览器,浏览器也可以显示出来,但是...
  • WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。image.png1、新建SpringBoot项目image.png2、pom.xml依赖xsi:schemaLocation=...
  • 一、引入maven配置: <dependency> <groupId>org.springframework....spring-boot-starter-websocket</artifactId> </dependency> 二、config配置: import org.springframewor
  • 问题已经解决,通过抓包发现websocket连接及发送均为正常,感谢版主xmt1139057136提供思路问题出在服务器端内容发送环节,因为不太了解websocket发送机制,这个错误看起来有点犯2下面贴出代码,希望出现同样问题的...
  • # 导入websocket模块 from websocket import create_connection # 接口地址,接口地址表单形式,包含了token url = 'wss://client.gcw.net/ws?name=201910211104411&token=174c664eca00297a7ee14fd968ccaec1&...
  • 强调一定要判断一下当前的msg为不为空 因为它有可能会保存到上一次的数据,如下图 ...我在判断到msg不为空的时候(也就是保存的上一次的接收服务器数据的时候)把当前的侦听器移除 封装的socket代码 ...
  • JAVA实现WebSocket服务器

    2021-04-30 16:54:46
    简单的话可以在客户端进行ajax轮询,但对于服务器来说会有大量的无效请求,客户端一多还容易扑街,于是准备上WebSocket。 环境为Spring Boot。 思路 关于客户端 客户端连接上的时候,将该连接对象存入服务器内存中...
  • 简单的说就是想从服务器获取文件画到canvas上,然后会报错Failed to execute 'createObjectURL' on 'URL': No function was found that matched the signature provided. 有大大可以告诉我原因么,我就想测试一下,...
  • 易语言websocket服务器源码系统结构:握手包处理,生成握手参数列,创建返回握手包,返回数据包处理,接收数据包解码,高级截取文本,取sha1,切片,ord,字节集到十六进制,十六进制到字节集,取十进制,取数值,utf8到gbk,gbk到...
  • 由于公司需要开发一个监控系统,前后端方案使用 Angular+Django进行开发,协议:Websocket 由于开发时Django + Weboscket配置时找到的文档多数较老,或者大多数复制粘贴,很多代码前后不对应,所以开贴记录一下。ps...
  • 接上文QT Websocket实现服务器客户端通讯(客户端部分)webhttps://blog.csdn.net/qq_39573345/article/details/80682232服务器Serverdialog.ccwebsocket#include "Serverdialog.hpp"#include #include #include #...
  • await websocket.send(parsed) response = await websocket.recv() print(response) start_server = websockets.serve(time, '127.0.0.1', 4040) asyncio.get_event_loop().run_until_complete(start_server) ...
  • Android服务器搭建Android服务器搭建AndServer搭建HTTP服务器配置依赖创建服务器举例展示Java-WebSocket搭建WebSocket配置依赖创建服务器举例展示Android服务器搭建搭建Android服务器,是有一定需求的。当需要一定...
  • 1.使用的Cocos2d-lua,使用websocket进行通信。问题举例:服务器像推送的A,B两条消息:消息A: {protocolNum:11111,ranks: [{Id: 800,Num: 1,cName: LG,score: 135275,num_One: 1,num_two: 0},{Id: 999,Num: 1,cName...
  • 首先我使用节点js和ws模块构建了websocket服务器。然后使用chrome和firefox,我连接到该服务器,连接成功建立。但是,我从浏览器发送的消息不会到达服务器。如果收到消息,我在服务器上有一些代码给console.log。...
  • WebSocket是一种允许通过保持服务器端和用户端始终连接来进行双向通信的技术,所以WebSocket既可以发送数据也可以接收数据,本篇文章我们就来看看如何使用WebSocket发送和接收数据。我们先来看一下如何发送文本数据...
  • WebSocket服务器因某些原因无法正常工作(WebSocket server not working for some reasons)我尝试使用ws创建一个非常简单的服务器,当我运行服务器node index.js并且我在我的浏览器中午餐localhost:8080时,我的...
  • 一、开始的话使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息。之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上查看日志,非常麻烦,...
  • Client是基本类WebSocketClientTest是主方法入口maven 地址,可能还需要其他的包等会截图org.java-websocketJava-WebSocket1.3.0import java.io.UnsupportedEncodingException;import java.net.URI;import java.net....
  • 近年来随着 Web 前端的快速发展,浏览器新特性层出不穷,越来越多的应用可以在浏览器端通过浏览器渲染引擎实现,Web 应用的即时...WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端
  • 服务器上的Spring websockets正在正常发送websocket消息(通过SockJS + STOMP),客户端正在接收它们,但是服务器没有接收到来自客户端的消息,尽管进行了数小时的研究,我仍然看不到任何原因为什么。下面的代码:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,812
精华内容 12,724
关键字:

websocket接收服务器