2011-01-14 2 views
0

을 받아 내가 다음 코드 조각이 :ServerSocket의 행동

if (servsock == null) { 
    System.out.println("HELLO1!"); 
    servsock = new ServerSocket(63456, 10); 
    System.out.println("HELLO2!"); 
} 
try { 
    System.out.println("HELLO3!"); 
    sock = servsock.accept(); 
} catch (Exception ex) { 
    if (servsock != null && !servsock.isClosed()) { 
     System.out.println("PICO1!"); 
     servsock.close(); 
    } 
    if (servsock != null && servsock.isClosed()) { 
     System.out.println("PICO2!"); 
     manager.log("SERVER SOCKET closed and nulled."); 
     servsock = null; 
    } 
    sock = servsock.accept(); 
} 
System.out.println("HELLO4!"); 
is = sock.getInputStream(); 
System.out.println("HELLO5!"); 
bis = new BufferedInputStream(is); 
System.out.println("HELLO6!"); 

이 코드의 실행 가능한 run() 방법에서 실행되고, 파일이 전송 된 경우,이 모든 통신을 중지하도록되어 있습니다.

이상한 점은 루프가 아니라는 점입니다. 코드가 받아 들일 수 있습니다, 파일 전송을 만들지 만 HELLO1이 왜 다시 화면에 있는지 이해할 수 없습니다. 따라서 두 번째로이 코드를 다시 실행하려고하면 "Connection refused"가 표시됩니다.

"10"은 나에게서 해킹되었지만 원래 코드는 결코 백 로그를 사용하지 않습니다.

어떤 제안을 해주시겠습니까?

이전을 실행하는 실행 코드는 다음과 같습니다

지금
final IClientInterface clientInterface = client.getClient(); 
final prgHolder = new ProgHolder(); 
Pong ftppong = new Pong(); 
ftppong.setFileNames(bout64.toByteArray()); 
ftppong.setDstFolder(dstFolder); 
prgHolder.setName("pong"); 
prgHolder.setTask(pong); 
Thread t = new Thread(new Runnable() { 
    public void run() { 
     try { 
      IClientInterface.execute(prgHolder); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
}); 
t.start(); 

정확한 문제는, 내가 (63456) 명령에 새로운 ServerSocket의에 도달하면, 클라이언트는 "거부 연결"하지만, 프로그램을 얻을 수 있음 멀리있는 PC에서, 넓고 열린 청취자입니다! "netstat"은 그것을 확인합니다!

그래서 다른 창에서 프로그램을 다시 실행하고 모든 HELLO 메시지를 전달하고 작업을 완료합니다!

그러면 스레드가 먼 PC에서 멈추고 포트 63456을 바인딩 해제합니다!

코드로 실패하지만 수신 요청을 수락하는 이유는 무엇입니까?

+0

나는 오류의 정확한 지점을 발견했다. 쓰레드가 끝나면. t.start(); "Socket sock = new Socket ("distantmaching ", 63456);이 코드는 스레드 바로 다음에 있습니다. 이론에 따르면 서버 스레드를 설정하고 클라이언트가 그 소켓과 연결을 설정해야합니다. 작은 조각, 맞죠? 작동하지 않는 것 같아요 . – hephestos

+0

windows windows : 문제 없습니다. Windows-Linux에서 서버가 연결을 받아 들일 수 없습니다. – hephestos

답변

1

이 코드를 기반으로 HELLO1은 한 번만 표시됩니다. 그러나이 코드의 호출자가 루프에있을 가능성이 높습니다. 그렇지 않으면 servsock의 이전 값을 확인하지 않습니다.

이것은 무엇을 할 것입니까?

servsock = null; 
} 
sock = servsock.accept(); 

예외가 발생하면 계속 발생하지 않습니다.

코드가 무엇을하는지 알고 싶으면 디버거를 사용하여 코드를 단계별로 실행하는 것이 좋습니다.

+0

이 동작을보고 디버그를 시도한 후 수표가 들어 왔습니다. 디버거와 루프에 대한 요점은 있지만 루프가 없습니다. 전체 실행 클래스는 run()에 넣어지고이 스레드와 같은 스레드에서 호출됩니다. t = new Thread (Runnable); t.start(); HELLO1 ... 2 ... 3 ... 완벽한 .... 1mg. 루프에 대해 다시 확인하겠습니다. – hephestos