2012-11-10 5 views
4

다음은 Kryonet의 기본을 다루는 this Youtube tutorial입니다.Kryonet은 접속 후 바로 연결을 끊습니다.

기본적으로 Kryonet Hello World입니다. 기본 서버와 클라이언트를 설치하는 방법을 설명하고, 클라이언트가 패킷을 서버에 보내고 아주 기본적인 통신을 할 수 있도록합니다.

source code에 대한 링크. 서버와 클라이언트 모두 동일한 패킷 클래스를 사용합니다.

서버를 실행하고 클라이언트가 IP에 연결하도록 요청할 수 있습니다. 그러나 내가 IP를 입력하면 연결 한 직후에 클라이언트가 종료됩니다.

클라이언트 출력 :

00:03 INFO: Connecting: /127.0.0.1:54555 
00:03 INFO: [kryonet] Connection 1 connected: /127.0.0.1 
00:03 INFO: [CLIENT] You have connected. 
BUILD SUCCESSFUL (total time: 3 seconds) 

[서버 명령 줄 로그 : 시스템이 TCP 연결을 닫처럼

00:00 INFO: [kryonet] Server opened. 
00:04 DEBUG: [kryonet] Port 54555/TCP connected to: /127.0.0.1:53217 
00:04 DEBUG: [kryo] Write: RegisterTCP 
00:04 INFO: [kryonet] Connection 1 connected: /127.0.0.1 
00:04 INFO: [SERVER] Someone has connected. 
00:04 DEBUG: [kryonet] Connection 1 update: Se ha forzado la interrupcion de una 
conexion existente por el host remoto 
00:04 INFO: [SERVER] Someone has disconnected. 
00:04 INFO: [kryonet] Connection 1 disconnected. 

보인다,하지만 난 정말 모르겠어요. Kryonet의 통신을 허용하려면 Windows 또는/및 라우터에서 무언가를 활성화해야합니까?

누군가가 문제를 발견 할 수 있습니까? 미리 감사드립니다.

명령 줄 로그에서 스페인어로 표시되는 줄은 "원격 호스트에서 기존 연결을 중단했습니다."와 유사합니다.

편집 조언 user1816380 후 : 여전히 원래의 오류를 보여 주지만, 때때로 당신이 볼 수있는 시간의 대부분

: 위해

00:00 INFO: [kryonet] Server opened. 
00:07 DEBUG: [kryonet] Port 54555/TCP connected to: /127.0.0.1:50787 
00:07 DEBUG: [kryo] Write: RegisterTCP 
00:07 INFO: [kryonet] Connection 1 connected: /127.0.0.1 
00:07 INFO: [SERVER] Someone has connected. 
00:07 DEBUG: [kryo] Read: Packet0LoginRequest 
00:07 DEBUG: [kryonet] Connection 1 received TCP: Packet0LoginRequest 
00:07 DEBUG: [kryo] Write: Packet1LoginAnswer 
00:07 DEBUG: [kryonet] Connection 1 sent TCP: Packet1LoginAnswer (6) 
00:07 DEBUG: [kryonet] Connection 1 update: Se ha forzado la interrupcion de una 
conexion existente por el host remoto 
00:07 INFO: [SERVER] Someone has disconnected. 
00:07 INFO: [kryonet] Connection 1 disconnected. 

답변

6

를 클라이언트가 연결 상태를 유지하기 KeepAlive 패킷을 송수신해야합니다. client.start()를 호출 할 때; client.connect(); 클라이언트 스레드가 자동으로 처리하는 백그라운드에서 시작됩니다.

사용자 입력을 처리하기 위해 무한 루프로 차단하기 때문에 클라이언트 스레드가이 작업을 수행하지 못하는 것처럼 보입니다 (While (true) 사용자 입력 받기).

대신 사용자 입력을 위해 별도의 스레드가 있어야합니다. 나는 또한 당신이() Log.info를 사용하는 것으로 나타났습니다

public void received(Connection c, Object o) { 
    System.out.println("received something"); 
    if (o instanceof Packet1LoginAnswer){ 

     boolean answer = ((Packet1LoginAnswer) o).accepted; 

     if (answer) { 
      System.out.println("Please enter your message for server"); 
      new Thread("Get User Input") { 
       public void run() { 
        try { 

         if (ChatClient.scanner.hasNext()){ 
         Packet2Message mpacket = new Packet2Message(); 
         mpacket.message = ChatClient.scanner.nextLine(); 
         client.sendTCP(mpacket); 
         System.out.println("Please enter another message"); 
         } 

        } catch (Exception ex) { 
         ex.printStackTrace(); 
         System.exit(1); 
        } 
       } 
      }.start(); 

     } else { 
       System.out.println("Answer is false"); 
      c.close(); 
     } 
    } 

    if (o instanceof Packet2Message){ 
     String message = ((Packet2Message) o).message; 
     Log.info(message); 
    } 
} 

: 여기 (아마 최고의)는 고객의 수신 기능을 구현하는 하나의 방법입니다. 이것은 Kryonet의 디버그 버전을 사용하는 경우에만 작동합니다. 표준 출력 기능을 사용하는 것이 좋습니다.

+0

감사합니다 당신의 도움을 user1816380하지만, 여전히 문제가, 내 업데이트 된 콘솔 메시지를 OP 보면 – TMichel

+0

이상한 것은 여전히 ​​원래 오류하지만 때때로을 보여줍니다 시간이 약간 달라지면 위의 내용을 편집하십시오. – TMichel

+0

클라이언트와 서버에서 TRACE 로깅을 변경하고 keep-alive 패킷이 수신되는지 확인하십시오. Log.set (Log.LEVEL_TRACE); – ojaber

0

KryoNet 2.20의 최신 버전을 사용하는 것과 동일한 문제 및 동작이 발생할 수 있습니다. 예를 들어 kryonet-2.12를 사용하면 문제가 해결 될 가능성이 큽니다.

그래서 kryonet - 2.20 대신 kryonet-2.12를 사용하려고이 관련있는 경우 예 (소스 코드에 링크로 더 이상 노력을) 잘 모르겠어요 ;-)

0

를 작동하지합니다 그러나...

당신이 TCP UDP에 대해 서버를 구성하는 경우 발생하지만 만 TCP를 통해 연결 클라이언트 을 가질 수 있습니다 설명하는 문제.

호스트 검색을 활용하고 싶지만 그 후에는 TCP 연결 만 필요하면 "run a separate server for UDP discovery"을 입력하는 것이 좋습니다.

0

나는 당신이 별도의 스레드에서 클라이언트를 시작하지 않는다고 생각한다.

"r122부터는 클라이언트 업데이트 스레드가 데몬 스레드로 만들어져 자식 프로세스가 초기화를 마치 자마자 닫힙니다."해결책은 "새 스레드 (클라이언트) .start를 사용할 수 있습니다."입니다.(); ").

그래서 당신이 아니라 당신이 난 그냥 같은 문제가 있었다

new Thread(client).start(); 
2

사용해야이

client.start(); 

처럼 클라이언트를 시작 예를 들어 말할 수, 나는 모든 다른 답변을 시도하지만 그들은 didn를 일하지 마라. 나는 TCP 포트 1941 및 UDP 포트 1942 에 서버를 호스팅하고 있었지만 클라이언트는 TCP 포트 1941 (UDP 포트 제외)이있는 서버에 연결하고있었습니다. 이 같은 UDP 포트를 추가하는 것은 나를 위해 그것을 해결 :

client.connect(5000, address, 1941, 1942); 
+0

해결 방법을 추가하면 무엇을 의미합니까? 사실 어떻게 실제로 추가합니까? 세 번째 인수는 TCP 포트 용이고 udp 포트 용은 넷째 인수입니다. – posixKing

+0

UDP 포트를 제공하지 않고 연결할 수 있으며 UDP없이 호스트 할 수 있습니다. UDP를 사용하여 호스트하고 호스트하지 않아도됩니다. – sirolf2009

+0

오, 알지만, 어떤 이유로 든 클라이언트가 연결을 끊고 계속합니다. 이유를 모르겠다. – posixKing