2013-05-18 4 views
0

내가 초기화 objectoutputstreams로 플러시 한 후에 내가 내 objectinputstreams를 초기화,이 얻을 :ObjectInputStream를 차단 소켓 외부 IP 광기

클라이언트

:

로 java.net.SocketTimeoutException : 읽기 시간 초과 java.io.ObjectInputStream의 $ PeekInputStream.read에서 java.net.SocketInputStream.read (알 수없는 소스) 에서 java.net.SocketInputStream.read (알 수없는 소스) 에서 java.net.SocketInputStream.socketRead0 (기본 방법) (에서 알 수없는 출처) at java.io.ObjectInputStream $ PeekInputStream.readFully (알 수없는 소스) at java.io.ObjectInputStream $ BlockDataInputStream.readShort (알 수없는 소스) at java.io.ObjectInputStream.readStreamHeader (알 수없는 소스) at java.io.ObjectInputStream. (알 수없는 소스) start.refreshChangeLog (Start.java:87) 시작시 $ 2.windowOpened (Start.java:234) at java.awt.AWTEventMulticaster.windowOpened (알 수없는 소스) at java.awt.Window.processWindowEvent (알 수없는 소스) 에서 javax.swing.JFrame.processWindowEvent (알 수없는 소스) 에서 java.awt.Window.processEvent (알 수없는 소스) at java.awt.Component.dispatchEventImpl (알 수없는 소스) at java.awt.Container .dispat chEventImpl (알 소스)에 java.awt.EventQueue.dispatchEventImpl java.awt.Component.dispatchEvent (알 소스)에 java.awt.Window.dispatchEventImpl (알 소스) (알 소스)에있는 java.awt 에서 . EventQueue.access $ 200 (알 수없는 소스) at java.awt.EventQueue $ 3.run (알 수없는 소스) at java.awt.EventQueue $ 3.run (알 수없는 소스) at java.security.AccessController.doPrivileged (기본 메소드) java.security.ProtectionDomain $ 1.doIntersectionPrivilege (알 수없는 소스)at java.security.ProtectionDomain $ 1.doIntersectionPrivilege (알 수없는 소스) at java.awt.EventQueue $ 4.run (알 수없는 소스) at java.awt.EventQueue $ 4. 실행 (알 수없는 소스) 012 java.awt.EventDispatchThread.pumpOneEventForFilters에서 java.awt.EventQueue.dispatchEvent에서 java.security.ProtectionDomain $ 1.doIntersectionPrivilege (알 수없는 소스) 에서 java.security.AccessController.doPrivileged (기본 방법) (알 수없는 소스) 에서 3,516,(알 수없는 소스) java.awt.EventDispatchThread에서 java.awt.EventDispatchThread.pumpEventsForFilter (알 수없는 소스) java.awt.EventDispatchThread.pumpEventsForHierarchy에서 (알 수없는 소스) java.awt.EventDispatchThread.pumpEvents에서 (알 수없는 소스) 에서 . pumpEvents (알 수없는 출처) at java.awt.EventDispatchThread.run (알 수없는 출처)

,451,515,

서버 :

java.net.SocketException의 : 연결 java.net.SocketInputStream.read (알 수없는 소스) 에서 java.net.SocketInputStream.read (알 수없는 소스) 에서 을 다시는 java.io에서 ObjectInputStream $ PeekInputStream.read (알 수없는 소스) at java.io.ObjectInputStream $ PeekInputStream.readFully (알 수없는 소스) at java.io.ObjectInputStream $ BlockDataInputStream.readShort (알 수없는 소스) at java.io.ObjectInputStream.readStreamHeader (알 수없는 소스) 출처) (클라이언트는 알 수 없음) (클라이언트.자바 : 27) ThreadAccept.run (ThreadAccept.java:23에서)

그리고 내 클라이언트 코드 :

public void refreshChangeLog() { 
    Socket logSocket = null; 
    ObjectInputStream input = null; 
    ObjectOutputStream output = null; 
    try { 
     logSocket = new Socket(InetAddress.getByName(server), 21992); 
     logSocket.setSoTimeout(0); 
     output = new ObjectOutputStream(logSocket.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(logSocket.getInputStream()); 
     output.writeObject("type:changeLog"); 
     output.flush(); 
     Object o = input.readObject(); 
     while (o instanceof String && !((String) o).equals("done")) { 
      String msg = (String) o; 
      int index = msg.indexOf("|"); 
      if (index > -1) { 
       changeLogMap.put(msg.substring(0, index), msg.substring(index + 1)); 
       changeLogList.addItem(msg.substring(0, index)); 
      } 
      o = input.readObject(); 
     } 
    }catch (Exception e) { 
     e.printStackTrace(); 
     loadLocalChangeLog(); 
    } 
    if (changeLogList.getItemCount() > 0) { 
     changeLogList.setSelectedIndex(0); 
     File changelog = new File(path + "changelog"); 
     if (!changelog.exists() || !changelog.isDirectory()) { 
      changelog.mkdirs(); 
     } 
     for (String key : changeLogMap.keySet()) { 
      File changef = new File(changelog, key + ".txt"); 
      if (!changef.exists()) { 
       try { 
        changef.createNewFile(); 
       }catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
      if (changef.exists()) { 
       PrintWriter writer; 
       try { 
        writer = new PrintWriter(changef); 
        writer.write(changeLogMap.get(key)); 
       }catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
    try { 
     if (output != null) { 
      output.close(); 
      output = null; 
     } 
     if (input != null) { 
      input.close(); 
      input = null; 
     } 
     if (logSocket != null) { 
      logSocket.close(); 
      logSocket = null; 
     } 
    }catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
}` 

그리고 내 서버 코드 :

socket = new ServerSocket(21992); 
     new Client.ThreadUpdateLobby(); 
     while (Start.frame != null && socket != null && !socket.isClosed()) { 
      Socket clientSocket = socket.accept(); 
      clientSocket.setSoTimeout(0); 
      Client client = new Client(clientSocket); 
      if (client.isValid) { 
       synchronized (clients) { 
        clients.add(client); 
       } 
      } 
      Thread.sleep(50L); 
     }` 

더 많은 서버 코드 :

this.socket = socket; 
    try { 
     this.socket = socket; 
     output = new ObjectOutputStream(socket.getOutputStream()); 
     output.flush(); 
     input = new ObjectInputStream(socket.getInputStream()); 
     listener = new ThreadListen(this, input); 
     isValid = true; 
    }catch (Exception e) { 
     e.printStackTrace(); 
     try { 
      if (output != null) { 
       output.close(); 
       output = null; 
      } 
      if (input != null) { 
       input.close(); 
       input = null; 
      } 
      if (socket != null) { 
       socket.close(); 
       this.socket = null; 
      } 
     }catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     isValid = false; 
    }` 

나는 잃어 버렸고, 분명히 t 그는 헤더 플러시되지 않습니다? 그러므로 입력 스트림이 앉아서 기다립니다. 문제는 클라이언트 쪽 인 것처럼 보입니다. 또한, 내 외부 네트워크 ip (98.232.202.119)를 사용하는 경우에만 발생하지만 "127.0.0.1"또는 "192.168.2.50"을 사용하면 문제가 없습니다. 포트가 전달되고 온라인에서 테스트했습니다.

+0

코드가 읽기 어려운 상태에서 어떻게 대답합니까? :) –

+0

그것은 어떻게 든 고쳐졌습니다. – user1413725

+0

롤백. 코드를 사이트에 표시하는 것이 좋습니다. 코드 형식을 작동 시키려면 텍스트 단락을 분리하는 것처럼 빈 줄로 다른 텍스트와 코드 블록을 구분해야합니다. – Joni

답변

0

나는이 질문에 대한 답변을 알고 있지만,이를 해결하기 위해 클라이언트의 외부 IP가 서버의 IP와 일치하는지 확인하고 그렇지 않은 경우 로컬 주소를 사용하십시오. 그 원인은 무엇입니까? 너의 라우터 다. 일부 모델에서는 WAN 보안으로 인해 로컬 컴퓨터가 원격 컴퓨터처럼 작동하지 않습니다. 나는 이것에 대한 보안 문제를 보지 못했지만 분명히 라우터 회사들은 그렇게한다. 나는 회사에 전화를 걸었고 나의 wan 보안을 사용 불가능하게 만들려고 노력했다.