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);
}
.
.
.