2014-05-21 12 views
2

내 목표는 웹 소켓을 사용하여 자바 서버 소켓과 브라우저 사이의 연결을 설정하는 것이다. 지금까지는 연결이 작동하지만 데이터 스트림은 그렇지 않습니다. 서버 소켓에서 웹 소켓으로 String을 보내고 싶습니다.자바 서버 소켓 전송 문자열 웹 소켓

문제는 입력 스트림과 출력 스트림입니다. 웹 소켓은 "zustimmung"을 run()에서 읽은 서버 소켓에 in.readLine()으로 보냅니다. 그러나이 문자열을 읽지 않습니다, "GET/HTTP/1.1"읽습니다.

출력도 작동하지 않습니다 (필자는 writeUTF() 때문인 것으로 짐작합니다).

그럼 내 질문 : 웹 소켓과 서버 소켓 사이에서 문자열을 전송하는 데 사용할 수있는 데이터 스트림은 무엇입니까?

코드 서버 :

import java.net.*; 
import java.io.*; 

public class ServerCommunicator extends Thread{ 

    private final static int PORT = 7777; 

    private static ServerSocket serverSocket; 
    private static Server server; 

    private Socket incoming; 
    private DataOutputStream out; 
    private DataInputStream in; 

    public static void main (String args[]) 
    { 
     try { 
      serverSocket = new ServerSocket (PORT); 
      System.out.println("Waiting for Clients.."); 

      server = new Server(); 

      while (true) { 
       Socket incoming = serverSocket.accept(); 
       ServerCommunicator communicator = new ServerCommunicator(incoming); 
       communicator.start(); 
      } 
     }catch (Exception e) {e.printStackTrace();} 
    } 

    public ServerCommunicator (Socket incoming) 
    { 
     this.incoming = incoming; 

     try { 
      out = new DataOutputStream (incoming.getOutputStream()); 
      in = new DataInputStream (incoming.getInputStream()); 
     } catch (Exception e) {e.printStackTrace();} 
    } 

     public void run() 
     { 

      try { 
       String input = in.readLine(); 
       String reply; 
       reply = server.auszaehlen(input); //returns a String 
       out.writeUTF(reply); 

       out.flush(); 
       incoming.close(); 
      } catch (Exception e) {e.printStackTrace();} 
     } 
} 

자바 스크립트 코드를 HTML은 :

<!DOCTYPE HTML> 
<html> 
<head> 
<script type="text/javascript"> 
function WebSocketTest() 
{ 
    if ("WebSocket" in window) 
    { 
    alert("WebSocket is supported by your Browser!"); 
    // Let us open a web socket 
    var ws = new WebSocket("ws://localhost:7777"); 
    ws.onopen = function() 
    { 
     // Web Socket is connected, send data using send() 
     ws.send("zustimmung"); 
     alert("Message is sent..."); 
    }; 
    ws.onmessage = function (evt) 
    { 
     var received_msg = evt.data; 
     alert("Message is received..."); 
    }; 
    ws.onclose = function() 
    { 
     // websocket is closed. 
     alert("Connection is closed..."); 
    }; 
    } 
    else 
    { 
    // The browser doesn't support WebSocket 
    alert("WebSocket NOT supported by your Browser!"); 
    } 
} 
</script> 
</head> 
<body> 
<div id="sse"> 
    <a href="javascript:WebSocketTest()">Run WebSocket</a> 
</div> 
</body> 
</html> 

답변

0

당신이 웹 소켓을 사용하여 연결, 그냥 소켓 연결보다 더 HTTP 요청을 보냅니다. HTTP 요청은 소켓을 열고 일부 메타 정보를 보낸 다음 데이터를 보냅니다.

서버에서 읽고있는 내용은 해당 메타 정보의 첫 번째 줄입니다. 서버에 대한 일반적인 HTTP 요청은 여러 줄이어야하며 같이한다 :

GET/HTTP/1.1 
Host: example.com 
Accept: * 

zustimmung 

여러 헤더 당신이 읽을 필요 라인, 다음에 빈 줄, 다음 데이터가있을 수 있습니다. 서버가 한 행만 읽습니다. 여러 행을 읽고 빈 줄을 찾은 다음 데이터를 읽으려면 루프가 필요합니다.

Wikipedia has good examples 요청 및 응답의 형식입니다. 다음은 예시 응답입니다.

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= 
Sec-WebSocket-Protocol: chat 
+0

좋습니다. 많이 고마워! 루프를 어떻게 설정합니까? 그리고 String을 웹 소켓으로 다시 보내려면 어떻게해야합니까? – user3590787

+0

루프가 분명합니다. 죄송합니다. 나머지 질문 : 문자열을 다시 보내는 방법? ;) – user3590787