2011-04-05 4 views
1

다른 플랫폼의 두 응용 프로그램이 서로 통신하는 데 도움이되는 서버 코드를 작성하고 있습니다. 그것을 조금 시각화로는 다음과 같이 될 것이다 : 두 개의 서로 다른 응용 프로그램, Java가있는 서버의 소켓 통신

앱 2

앱 1 < ------> 서버 < ------> APP2에서 후면 VAR1이며, 그것을 쓰기 무엇 서버 app1에 var2를 읽어 app2에 씁니다. 이처럼 :

while(true){
var1 = app2stream.readInt();
app1stream.writeInt(var1);
var2 = app1stream.readDouble();
app2stream.writeDouble(var2);
}

내 문제는 어떤 점에서 나는 내 서버에서이 코드를 가지고있다 :

app1.accept();
app2.accept();

이것이 의미하는 것은 상관없이 무엇을하고, 사실이 주어진 것입니다 서버는 항상 실행 중이며, app1.accept()는 차단 메소드이므로 app1이 먼저 연결되어야합니다.

이 문제가 발생합니까? 누가 처음 "왔는지"에 관계없이 두 응용 프로그램이 서버에 연결되도록하고 위의 코드로 서버가 진행될 때까지 기다리는 것이 좋습니다. accept() 부분에 대해서만 스레드를 사용할 수 있고 다른 스레드에 스트림을 전달할 수 있습니까? 채널에 대해 조금 읽었지만 약간의 버릇이 생겼다. 어떤 예도 좋을 것이다.

+0

JMS 구현을 고려 했습니까? 이것은 정확히 설계된 것처럼 들립니다. – karakuricoder

답변

1

사용 NIO

그것은 당신이 비 블로킹 소켓이 Selector 클래스를 사용하여 (동의 포함)을 수행 할 수 있습니다.

기본적으로 시스템 라이브러리에 대한 기본 액세스 권한과 멀티 스레드하지 않고도 작업을 처리 할 수있는 기능을 제공합니다.

+0

나는 당신이 연결된 기사를 읽고 있는데, 질문이 있으면 다시 올거야! – kotsosh

+0

NIO 채널 및 서버용 선택기 클래스를 사용할 수 있지만 다른 두 응용 프로그램 (클라이언트)에서 간단한 DataOutput/InputStream을 사용하여 너무 많은 코드를 변경하지 않아도되는지 궁금합니다. – kotsosh

+0

음, 물론. 그 문제에 대해서는 perl로 작성할 수 있습니다 :) 당신은 TCP 소켓을 사용하고 있습니다. –

0

달리 언급하지 않는 한 두 가지를 동일하게 취급해야합니다.

예를 들어 각 소켓이 연결될 때 "어떤 클라이언트?" 메시지.

그런 다음 모두 1로 응답이나 뭐 그냥 둘을 분리하면 클라이언트가 1 또는 2

로 응답 여부를 확인한다.

1

오직 하나의 수락 통화와 하나의 서버 소켓 만 있습니다. 연결되면 앱이 연결되었는지 여부를 결정할 수 있습니다. 연결 세부 정보에서 가져올 수없는 경우 앱에 매핑 할 수있는 인증 코드 (아마도 어쨌든 좋은 아이디어)를 보내도록합니다.

0

"표준"방법은 서버가 포트에서 수신 대기하도록하는 것입니다. 메시지가 들어 오면 즉시 새 스레드를 처리하여 처리하고 다시 다른 메시지를 수신합니다. 그런 다음 Glowcoder가 말한 것처럼 동일한 루프에서 모든 연결을 만들고 연결 후 어떤 연결인지 알아냅니다.

대체 스레드가 여러 개의 스레드를 가지며 각각 다른 포트에서 수신 대기한다고 가정합니다. 나는 그 일을 시도한 적이 없으며, 연결이 이루어질 때까지 블로킹을 차단할지 모르므로 결코 다른 스레드에 도달 할 수는 없습니다.

+0

어떻게 작동하는지에 대한 코드 예제를 추가하겠습니다. – corsiKa

+0

하지만 기다려야 할 것입니다, 미안합니다 - 직장에서의 비상 사태 : – corsiKa

관련 문제