2017-10-07 11 views
0

시스템에서 클라이언트를 시작했습니다. 그것은 어떤 7913. 내가 7913.소스 포트를 사용하여 Java의 TCP/IP를 사용하여 데이터를 보내고받는 방법

로그에서 실행되는 자바에서 서버 소켓에 TCP/IP를 통해 요청 데이터를 전송하지 오전 포트에서 실행된다 소켓에 보낸 메시지 [요지 =/190.161.153.109, 포트 = 7913 , localport = 54717]

해당 특정 데이터에 대한 응답도 받았습니다. 이제 서버는 내 응용 프로그램이 듣고있는 포트가 아닌 내 localport 54717에 요청을 보내려고합니다. [ie 7913]

요청을 처리하는 방법은 무엇입니까? telnet으로 내 localport에 연결하려고하면 연결이 거부됩니다.

코드 :

public static String ickTransport(String ickHeader,String ickdata, Socket connection) throws UnknownHostException, IOException 

    try 
    { 
     connection.setSoTimeout(Integer.parseInt(ickTimeOut)); 
     log.debug("ick Message for "+connection.toString()+" is " + ickMessage);    
     BufferedOutputStream bos = new BufferedOutputStream(connection.getOutputStream()); 
     DataOutputStream osw = new DataOutputStream(bos); 
     osw.writeShort(Integer.parseInt(ickHeader)); 
     osw.writeBytes(ickMessage); 
     osw.flush(); 

     DataInputStream stream = new DataInputStream(connection.getInputStream()); 
     int numberRecords = stream.readShort(); 
     if (numberRecords > 0) { 
      int nSizeRead = 0; 
      byte[] bRequest = new byte[numberRecords]; 

      int nSizeBuffer; 
      for (; numberRecords > 0; numberRecords -= nSizeBuffer) { 
       byte[] bBuffer = new byte[numberRecords]; 
       nSizeBuffer = stream.read(bBuffer); 
       System.arraycopy(bBuffer, 0, bRequest, nSizeRead, nSizeBuffer); 
       nSizeRead += nSizeBuffer; 
      } 
      ickResponse = new String(bRequest); 
      log.debug("Response from ick is " + ickResponse); 
     }    
    } 
    catch (SocketTimeoutException e) 
    { 
     log.error(e.getMessage());  
    } 

    return ickResponse;  
+2

TCP/IP 작동 방식에 대한 오해가 있습니다. – Henry

+0

먼저 추가 포트에서 수신 대기해야합니다. – Antoniossss

+0

내 시나리오는 서버가 소켓 서버 포트로 요청을 보냈다는 것입니다. 대신 마지막 서비스 포트로 요청을 보냅니다. 이 경우에는 54717입니다. 그러나 응답이 수신되면이 포트 54717이 닫힙니다. 코딩에서 어떻게 수용 할 수 있습니까? 친절하게 나를 인도 해주세요. –

답변

0

소켓을 듣고 무엇인지 이해해야합니다 당신에 무슨 일이 일어나고 있는지 이해하고 그것을 연결 소켓 어떻게 다른지.

응용 프로그램을 수신

(이 ServerSocket하는 수행) :
  • 당신이 bind 요청 또는 생성자에 지정된 포트에 연결합니다

  • 해당 포트에 새 연결을받을 JVM을 요청
  • 때 연결이 수신되면 청취 소켓이 상태를 변경하고 accept 메소드로 새 연결을위한 새 소켓을 제공합니다.

응용 프로그램이 새로운 연결을 설정하면 connect 메서드를 사용합니다. 당신이 소켓에 bind 요청을 사용하지 않는 것이 : (귀하의 예제에서 54,717)

  • 를 할당 새로운 동적 포트는
  • 서버에 요청을 연결하는 전송
  • 연결을 사용하면 요청을 송신/수신에 사용할 수 설립 후/from server

아무도이 동적 포트를 수신하지 않기 때문에 텔넷 요청이 거부됩니다.

+0

제 시나리오는 서버가 소켓 서버 포트에 요청을 보내지 않았다는 것입니다. 대신 마지막 서비스 포트로 요청을 보냅니다. 이 경우에는 54717입니다.그러나 응답이 수신되면이 포트 54717이 닫힙니다. 코딩에서 어떻게 수용 할 수 있습니까? 친절하게 나를 인도 해주세요. –

+0

클라이언트 응용 프로그램을 작성하는 경우 청취 소켓이 필요하지 않습니다. 모든 요청/응답에 대해 서버에 설정 한 연결 (포트 54717에서) 만 사용하십시오. 닫힌 경우 응용 프로그램 또는 응용 프로그램이 종료되었으므로 닫힙니다. –

+0

클라이언트 응용 프로그램은 보낸 요청에 대해 서버에서 응답을받습니다. 그러나 이제 서버는 내 응용 프로그램이 수신하는 포트가 아닌 새 로컬 요청을 내 localport 54717에 보내려고합니다 [예 : 7913]. 내 스레드도 소켓도 닫히지 않습니다. 그러나 요청은 내 신청 자체에 오지 않습니다. 신선한 요청을 얻기 위해 [localport 54717] 연결을 유지하는 방법? 모든 샘플 코드를주세요! –