내가 초기화 objectoutputstreams로 플러시 한 후에 내가 내 objectinputstreams를 초기화,이 얻을 :ObjectInputStream를 차단 소켓 외부 IP 광기
클라이언트:
,451,515,로 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 (알 수없는 출처)
서버 :
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"을 사용하면 문제가 없습니다. 포트가 전달되고 온라인에서 테스트했습니다.
코드가 읽기 어려운 상태에서 어떻게 대답합니까? :) –
그것은 어떻게 든 고쳐졌습니다. – user1413725
롤백. 코드를 사이트에 표시하는 것이 좋습니다. 코드 형식을 작동 시키려면 텍스트 단락을 분리하는 것처럼 빈 줄로 다른 텍스트와 코드 블록을 구분해야합니다. – Joni