2011-03-25 2 views
3

두 클라이언트가 서로를 알고있는 경우 (즉, 사용할 포트와 각각의 호스트 이름을 알고있는 경우) 소켓을 사용하여 서로 연결할 수 있습니까?네트워크에있는 두 클라이언트 연결

저는 서버로 실행될 수 있고 클라이언트로 실행될 수 있지만 둘 다 클라이언트 일 수 있다는 것을 알고 있습니다. 두 클라이언트 모두 라우터 나 방화벽 뒤에 있지 않고 각각 고유 한 IP를 가지고 있습니다.

나는 Java를 사용하기 때문에 하나의 ServerSocket과 다른 소켓의 소켓 인스턴스보다는 두 클라이언트 모두에서 두 개의 소켓 인스턴스를 사용하려고합니다.

답변

1

누군가가 어딘가에 연결을 수신해야합니다. 표준 소켓 연결은 활성 리스너 (표준 Java 소켓 용 ServerSocket)가있는 호스트 및 포트에 연결합니다. ServerSocket은 기본적으로 들어오는 연결을 기다리면서 차단합니다.

두 클라이언트 모두에서 ServerSocket 연결을 추가하는 경우 하나의 스레드가 연결을 수신하고 다른 하나가 나가는 연결을 시도하도록 할 수 있습니다. NIO를 사용하면 전체 애플리케이션을 차단하지 않고 들어오고 나가는 연결을 확인할 수있는 것과 같은 몇 가지 대안이 있습니다.

브로드 캐스팅을 살펴볼 수도 있지만 해당 솔루션에도 복잡성이 있습니다.

한 가지 더 생각해보십시오. 요구 사항에 따라 JXTA와 같은 P2P 프레임 워크를 항상 활용할 수 있습니다.

1

아니요, 그들은 단지 하나의면에만 server socket을 초기화하여 수행 할 수 있습니다. 클라이언트 중 하나가 연결을 설정하면 양쪽에서 쓰기/읽기 프로토콜을 구현할 수 있습니다. 이것은 연결을 "대기"하는 메커니즘입니다. 클라이언트 소켓이 서버 소켓에서 먼저 초기화되지 않은 경우 연결을받을 수 없습니다. 당신이 알고 당신은 HTTP 프로토콜에 충실 할 수 있도록

아이디어, 왜 모두 고객의 작은 HTTP 서버를 통합하지 않는다 (예 : Jetty)

0

아니, 당신은 포트를 듣고 ServerSocket를 필요 연결을 수락하십시오.

0

간단히 말해서 대답은 아니오입니다. 두 끝을 클라이언트로 사용할 수 없습니다. 두 개의 소켓을 서로 연결할 수있게하는 명령은 입니다.

소켓 API를 사용하여 연결을 만드는 유일한 방법은 한 쪽에서 연결을 수신하고 받아 들일 수 있고 다른 쪽에서 연결을 수신하는 것입니다.

일반적으로 한쪽 끝은 서버이고 다른 쪽 끝은 클라이언트라고 임의로 결정할 수 있습니다. 서버 측에서 수신 대기하고 클라이언트 측에서 연결합니다.

1

ServerSocket을 만들고 연결을 허용 할 수 있습니다. 이렇게하면 소켓 생성과 비교하여 한 줄의 코드가 추가되어 코드 오버 헤드가 적습니다. 당신은 단지 하나의 연결이 필요하기 때문에 서버 측

ServerSocket ss = new ServerSocket(port); // can be reused. 

Socket s = ss.accept(); 

에 클라이언트 측

Socket s = new Socket(hostname, port); 

은,이 것을 더 이상 복잡하지 않을 수 있습니다.

0

메시지의 안정적인 전달에 문제가없는 경우 TCP 대신 연결없는 UDP 프로토콜을 사용할 수 있습니다.

TCP는 연결 지향 프로토콜이므로 참가자 중 하나가 연결을 시작해야하고 다른 참가자는 연결을 청취해야합니다.