2016-12-01 1 views
0

서버에 연결된 모든 클라이언트가 소켓 수신기가되어야합니다. 서버는 특정 클라이언트에 연결을 시도하고 소켓 메시지를 통해 다양한 작업을 수행하도록 지시합니다. 그래서 내 질문은, 내 Java 클라이언트가 ServerSocket 수 있으며 서버 요청을 수신 대기입니까? 그리고 클라이언트 컴퓨터에로드 된 웹 페이지가 클라이언트 IP 주소를 알고 메시지를 보낼 수도 있습니다. 우리는 많은 클라이언트가 연결되어있는 서버에서 실행중인 응용 프로그램을 가지고 있으며 클라이언트 웹 페이지에서 단추를 누르면이 클라이언트와 연결하여 메시지를 보냅니다. 대부분의 시간 서버는 리스너이지만, 우리의 경우에는 클라이언트가 리스너가 서버 요청을 기다리는 정반대가 필요합니다. 그러나 서버는 클라이언트가 DHCP를 통해 연결되기 때문에 클라이언트 IP 주소가 연결을 설정하는 것임을 알아야합니다.클라이언트 소켓을 리스너로 사용 하시겠습니까?

Btw, 모든 고객은 기본적으로 당사 서버에서 웹 페이지를 실행하고 있으며 각 클라이언트는 자체 PC를 가지고 있습니다. 내가해야 할 일은 각 클라이언트 컴퓨터에서 USB 장치를 제어하는 ​​것입니다. 웹 사이트 소프트웨어를 제어 할 수 있기 때문에 클라이언트의 외부 하드웨어를 제어하는 ​​것이 원격으로 매우 어렵 기 때문에 소켓을 사용하여 소켓을 사용하는 것이 목표였습니다. 따라서 Java 응용 프로그램을 작성하고 클라이언트 시스템에서 실행되는 청취자 역할을 수행하면 누군가가 웹 페이지의 버튼을 누르면 서버가 클라이언트 시스템에 연결하여 메시지를 전송하려고 시도합니다. 나는 서버 측에서 이것을 처리하는 방법을 모르므로 모든 클라이언트에게 메시지를 브로드 캐스팅하고 싶지 않기 때문에 어떤 클라이언트가 말하는지 알고 있습니다. 단, 버튼 하나만 눌렀습니다. 각 클라이언트는 DHCP 주소 지정을 통해 연결되므로 hostID를 하드 코드 할 수 없습니다. 서버 측의 버튼 이벤트에 java/groovy 또는 ajax 스크립트를 첨부 할 수는 있지만 서버에서이 프로토콜을 설정하는 방법을 잘 모르겠습니다.

다음은 클라이언트/서버 측에서 사용할 수있는 소켓 연결의 예입니다. DHCP IP 주소가 올바르게 작동하도록 클라이언트를 알아야합니다.

서버 측 요청하는 클라이언트 작업

public void requestSocket() 
{ 
Socket socket = null; 
private BufferedReader in = null; 
private PrintWriter out = null; 

//Create socket connection for server 
    String serverAddress = "localhost"; // Needs to be the client DHCP IP address. 
    try 
    { 
     socket = new Socket(serverAddress, 4444); 
     out = new PrintWriter(socket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    } 
    catch (UnknownHostException e) 
    { 
     System.out.println("Unknown host: " + serverAddress); 
     System.exit(1); 
    } 
    catch (IOException e) 
    { 
     System.out.println(e); 
     System.out.println("No I/O"); 
     System.exit(1); 
    } 
} 

클라이언트 측 리스너는 사람이 이러한 질문에 답 할 수있는 서버

public void listenSocket() 
{ 
    int portNumber = 4444; 
    ServerSocket server = null; 
    Socket client = null; 
    BufferedReader in = null; 
    PrintWriter out = null; 

    try 
    { 
      client = new ServerSocket(portNumber); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Could not listen on port " + portNumber); 
     System.exit(-1); 
    } 

    try 
    { 
      server = client.accept(); 
    } 
    catch (IOException e) 
    { 
     System.out.println("Accept failed :" + portNumber); 
     System.exit(-1); 
    } 

    try 
    { 
     in = new BufferedReader(new InputStreamReader(server.getInputStream())); 
     out = new PrintWriter(server.getOutputStream(), true); 
    } catch (IOException e) { 
     System.out.println("Read failed"); 
     System.exit(-1); 
    } 

    while(true) 
    { 
     try 
     { 
      line = in.readLine(); 
      //Send data back to client 
      out.println(line); 
     } 
     catch (IOException e) 
     { 
      System.out.println("Read failed"); 
      System.exit(-1); 
     } 
    } 
} 

역할을?

+0

첫 번째 : 고객이 무엇입니까? 자바 클라이언트 또는 브라우저에서 웹 페이지? – Vadim

답변

1

첫 번째 : 고객은 무엇입니까? 자바 클라이언트 또는 브라우저에서 웹 페이지?

둘째 : JavaClient 인 경우 서버가 말하는 내용을 수신하기 위해 ServerSocket 만있을 수 있으며 서버는이를 수행하기 위해 각 클라이언트의 IP와 포트를 알아야합니다.

세 번째 : Java 클라이언트 용 실제로 JMS와 같은 태스크가있는 JMS입니다. 서버는 메시지를 게시하고 클라이언트는 필요한 메시지를 수신하고 처리합니다.

및 기타 : 웹 페이지 인 경우 JavaScript (또는 자동 새로 고침 메커니즘)에서 브라우저가 주기적으로 (타이머로) 새 메시지를 요청할 수있는 유일한 방법이 있습니다. HTML을 사용하면 서버가 클라이언트 브라우저에서 모든 작업을 시작할 수있는 방법이 없습니다. 항상 요청 - 응답입니다.

업데이트 : 그 같은 시도 :

<html> 
<head> 
    <title>Test Loop Back</title> 
</head> 
<body> 
    <form action="http://localhost:4444" id=in_form> 
    <table> 
     <tr> 
      <td> 
       <label>IN_MSG:</label> 
      </td> 
      <td> 
       <input type="text" name="IN_MSG" id="IN_MSG"/> 
      </td> 
     </tr> 
    </table> 
    <button type="submit" formmethod="post">Post Something</button> 
    </form> 
    </body> 
</html> 

을하고 포트 4444. MAYB에 듣고 당신의 배경 자바에서 충분히 할 수 있습니다 무엇을 얻을 참조?당신은 별도의 입력 필드로 필요한 모든 것을 전달할 수 있으며 모든 양식을 볼 수 없도록 숨길 수 있습니다.

서버에서 일부 데이터가 필요하면 배경 자바에 대한 준비가 필요합니다. 서버에서 백그라운드로 자바. enter image description here

주요 포인트는 서버에서 백그라운드 자바 로의 직접적인 통신을 피하는 것입니다. 모든 것은 브라우저를 통과하므로 IP, 포트, 프록시, 보안 등의 통증이 없습니다. 웹 페이지의 브라우저와 자바 스크립트가 모든 것을 처리합니다 ...

+0

나는 위의 예제를 편집하여 더 설명했다. 클라이언트 컴퓨터는 웹 서버에 연결된 PC 일뿐입니다. 이 경우 서버는 초 기자이며 클라이언트는 작업 수행 요청을 청취해야합니다. 다른 사람들이 이전에 그렇게했다고 확신하기 때문에 가능할 것입니다. 어쩌면 애플릿이 이것에 대한 더 나은 접근 방법 일 수도 있지만, 그런 식으로 구현하는 방법을 모른다. 소켓 메소드가 작동해야한다. – Wildview

+0

또한 웹 페이지에서 버튼을 누르면 서버 요청을 처리하기 위해 백그라운드에서 각 클라이언트 컴퓨터에서 실행되는 Java 응용 프로그램이 있습니다. – Wildview

+0

확인. 내가 말할 수 있듯이 거의 다 왔어. 하지만 당신의 클라이언트 = server.accept(); 반드시 무한 루프에 있어야하고 클라이언트 소켓을 얻은 후에는 다른 스레드를 시작해야합니다. 현재 코드는 서버에서 하나의 메시지 만 가져 와서 사라집니다. BTW 애플릿은 좋은 생각이 아닙니다. 보안 관리자로 소켓을 열면 더 많은 일을해야하고 코드도 같을 것입니다. – Vadim

관련 문제