1

OperaブラウザでサポートされているWebSocket機能について学習しようとしています。Webからサンプルコードを入手しました。

WebSocketを使用してOpera12.xブラウザから一部のポート(たとえば9999)でサービスを提供する単純なcエコーサーバー(Webサーバーを使用しない)に接続することは可能ですか?これを試しましたが、機能していません。ブラウザでエラー:未定義の切断エラーが発生します。Linuxエコーサーバー側では、接続要求を取得して受け入れていますが、データを読み取ることができません。

Webサーバーからではなく、ローカルでテストページを読み込んでいます。

単純なエコーサーバーでは不十分な場合、単純なエコーサーバーを拡張してHTTP応答を返し、それを機能させることは可能ですか。基本的に、私はブラウザからWebSocketインターフェイスを使用して、Webサーバーを使用せずにサーバーに接続しようとしています。

ありがとう、ラジ

websocketクライアント(http://www.websocket.org/echo.htmlからコピー)

<!DOCTYPE html> 

 <meta charset="utf-8" /> 

 <script language="javascript" type="text/javascript"> 

  var wsUri = "ws://192.168.100.2:9999/"; 
 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 rocks"); 
 } 

  function onClose(evt) 
 { 
 writeToScreen("DISCONNECTED"); 
 } 

  function onMessage(evt) 
 { 
 writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>'); 
 websocket.close(); 
 } 

  function onError(evt) 
 { 
 writeToScreen('<span style="color: red;">ERROR:</span> ' + 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); 

 </script> 

 <div id="output"></div> 

 </html>

エコーサーバー(http://www.cs.utah.edu/~swalton/listings/sockets/programs/part2/chap6/simple-server.cからコピー)。

.

#define MY_PORT     9999
#define MAXBUF      1024

int main(int Count, char *Strings[])
{   int sockfd;
    struct sockaddr_in self;
    char buffer[MAXBUF];

    /*---Create streaming socket---*/
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
    {
        perror("Socket");
        exit(errno);
    }

    /*---Initialize address/port structure---*/
    bzero(&self, sizeof(self));
    self.sin_family = AF_INET;
    self.sin_port = htons(MY_PORT);
    self.sin_addr.s_addr = INADDR_ANY;

    /*---Assign a port number to the socket---*/
    if ( bind(sockfd, (struct sockaddr*)&self, sizeof(self)) != 0 )
    {
        perror("socket--bind");
        exit(errno);
    }

    /*---Make it a "listening socket"---*/
    if ( listen(sockfd, 20) != 0 )
    {
        perror("socket--listen");
        exit(errno);
    }

    /*---Forever... ---*/
    while (1)
    {   int clientfd;
        struct sockaddr_in client_addr;
        int addrlen=sizeof(client_addr);

        /*---accept a connection (creating a data pipe)---*/
        clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
        printf("%s:%d connected\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        printf("Received %d\n", recv(clientfd, buffer, MAXBUF, 0));
        printf("Date %s\n\n", buffer);


        /*---Echo back anything sent---*/
        send(clientfd, buffer, recv(clientfd, buffer, MAXBUF, 0), 0);

        /*---Close data connection---*/
        close(clientfd);
    }
.
.
.
4

1 に答える 1

3

WebSocketプロトコルは生のTCPソケット接続ではありません。サーバーはWebSocketプロトコルもサポートしている必要があります。

http://www.websocket.org/echo.htmlにオンラインWebSocketエコーサービスがあります

本当にWebSocketからrawソケットサーバーに接続したい場合は、websockifyを使用して2つの間をブリッジできます。免責事項:私はwebsockifyを作成しました。

于 2013-03-09T02:14:27.693 に答える