objectinputstreams を初期化すると、objectoutputstreams によって初期化およびフラッシュされた後、次のようになります。
クライアント:
java.net.SocketTimeoutException: java.net.SocketInputStream.socketRead0 (ネイティブ メソッド) で読み取りがタイムアウトしました。 java.io.ObjectInputStream$PeekInputStream.readFully(不明なソース) の ObjectInputStream$PeekInputStream.read(不明なソース) java.io.ObjectInputStream$BlockDataInputStream.readShort(不明なソース) で java.io.ObjectInputStream.readStreamHeader(不明なソース) java.io.ObjectInputStream.(不明なソース) で Start.refreshChangeLog(Start.java:87) で Start$2.windowOpened(Start.java:234) で java.awt.AWTEventMulticaster.windowOpened(不明なソース) で java.awt. javax.swing.JFrame の Window.processWindowEvent(不明なソース)。java.awt.Window.processEvent(不明なソース) で java.awt.Component.dispatchEventImpl(不明なソース) で java.awt.Container.dispatchEventImpl(不明なソース) で java.awt.Window.dispatchEventImpl( java.awt.EventQueue.dispatchEventImpl の java.awt.Component.dispatchEvent(不明なソース) java.awt.EventQueue.access$200 の(不明なソース) java.awt.EventQueue$3.run( 不明なソース)ソース不明) java.awt.EventQueue$3.run (ソース不明) java.security.AccessController.doPrivileged (ネイティブ メソッド) java.security.ProtectionDomain$1.doIntersectionPrivilege (ソース不明) java.security.ProtectionDomain$1.doIntersectionPrivilege (未知のソース) java.awt.EventQueue$4.run (未知のソース) で java.awt.java.security.AccessController.doPrivileged(Native Method) で EventQueue$4.run(不明なソース) java.security.ProtectionDomain$1.doIntersectionPrivilege(不明なソース) で java.awt.EventQueue.dispatchEvent(不明なソース) で java.awt. java.awt.EventDispatchThread.pumpEventsForFilter(不明なソース) の java.awt.EventDispatchThread.pumpEventsForHierarchy(不明なソース) の EventDispatchThread.pumpOneEventForFilters(不明なソース) java.awt.EventDispatchThread の java.awt.EventDispatchThread.pumpEvents(不明なソース)。 java.awt.EventDispatchThread.run(不明なソース) での pumpEvents(不明なソース)java.awt.EventDispatchThread.pumpOneEventForFilters の EventQueue.dispatchEvent (不明なソース) java.awt.EventDispatchThread.pumpEventsForFilter (不明なソース) で java.awt.EventDispatchThread.pumpEventsForHierarchy (不明なソース) java.awt.EventDispatchThread で。 java.awt.EventDispatchThread.pumpEvents(不明なソース) のpumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)java.awt.EventDispatchThread.pumpOneEventForFilters の EventQueue.dispatchEvent (不明なソース) java.awt.EventDispatchThread.pumpEventsForFilter (不明なソース) で java.awt.EventDispatchThread.pumpEventsForHierarchy (不明なソース) java.awt.EventDispatchThread で。 java.awt.EventDispatchThread.pumpEvents(不明なソース) のpumpEvents(不明なソース) java.awt.EventDispatchThread.run(不明なソース)awt.EventDispatchThread.run (不明なソース)awt.EventDispatchThread.run (不明なソース)
サーバ:
java.net.SocketException: java.io.ObjectInputStream$PeekInputStream.read(不明なソース) で java.net.SocketInputStream.read(不明なソース) で java.net.SocketInputStream.read(不明なソース) で接続がリセットされました。 .ObjectInputStream$PeekInputStream.readFully(不明なソース) で java.io.ObjectInputStream$BlockDataInputStream.readShort(不明なソース) で java.io.ObjectInputStream.readStreamHeader(不明なソース) で java.io.ObjectInputStream.(不明なソース) クライアントで。 (Client.java: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;
}`
途方に暮れていましたが、どうやらヘッダーがフラッシュしていませんか? したがって、入力ストリームはそのまま待機します。問題はクライアント側にあるようです。また、これは外部ネットワーク IP (98.232.202.119) を使用した場合にのみ発生しますが、「127.0.0.1」または「192.168.2.50」を使用しても問題はありません。私のポートは転送され、オンラインでテストしました。