0
我設法將我的JavaScript客戶端連接到C++服務器(我使用的是winsock),並且服務器接收到一個HTTP標頭,但之後我無法發送或接收任何其他內容。 服務器發送消息(發送返回發送的字節數),但沒有任何消息到達客戶端。將JavaScript WebSocket連接到C winsock
客戶端:JavaScript的
function WebSocketTest()
{
if ("WebSocket" in window)
{
var ws = new WebSocket("ws://192.168.43.205:80");
ws.onopen = function()
{
ws.send("Message to send");//this doesn't work
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
alert("Message is received...");
document.getElementById("message").innerHTML += received_msg;
};
ws.onclose = function()
{
alert("Connection is closed...");
};
ws.onerror = function(error){
alert('Error detected: ' + error);
}
}
else
{
// The browser doesn't support WebSocket
alert("WebSocket NOT supported by your Browser!");
}
}
服務器:C/C++
#include <stdio.h>
#include "winsock2.h"
#include <iostream>
#include <string>
#pragma comment(lib, "Ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS
using namespace std;
void main() {
int size;
char buffer[1024];
WSADATA wsaData;
sockaddr_in service;
SOCKET ListenSocket, AcceptSocket;
service.sin_family = AF_INET;
service.sin_addr.s_addr = INADDR_ANY;
service.sin_port = htons(10011);
WSAStartup(MAKEWORD(2, 2), &wsaData);
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bind(ListenSocket, (SOCKADDR*)&service, sizeof(service));
listen(ListenSocket, SOMAXCONN);
AcceptSocket = accept(ListenSocket, NULL, NULL);
cout << "Client connected.\n";
size = recv(AcceptSocket, buffer, 1024, 0);
string msg(buffer, size);
/*
msg contains this:
GET/HTTP/1.1
Host: 172.16.199.150:10011
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,hu;q=0.6
Sec-WebSocket-Key: 34qTtPYjnRJheHKQowePRg==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
*/
string abc = "abc";
auto cmsg = abc.c_str();
size = send(AcceptSocket, cmsg, abc.size(), 0);
// size == 3, which means send was successful, but client doesn't receive anything
// hangs here, even tho client sent a message
size = recv(AcceptSocket, buffer, 1024, 0);
}
我們可以看到所有相關部件的代碼嗎? – mike510a
我們無法繼續處理這些信息。你可能更具體,並提供更多的證據和細節。 –
webSocket連接使用整個連接方案和它自己的數據格式(例如它是它自己的協議)。要接收webSocket連接,您必須支持整個webSocket協議。由於許多語言有很多預先編寫的實現,所以大多數人將獲得並使用現有的webSocket服務器實現,而不是從頭開始重寫。您可以在該文章中看到[編寫webSocket服務器](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers)需要的概述。 – jfriend00