0

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」を使用しても問題はありません。私のポートは転送され、オンラインでテストしました。

4

1 に答える 1

0

この質問が死んだことは知っていますが、Google のために、これを修正するには、クライアントの外部 IP がサーバーの IP と一致するかどうかを確認し、一致する場合はローカル アドレスを使用します。何が原因ですか?それはあなたのルーターです。一部のモデルでは、WAN セキュリティにより、ローカル コンピューターがリモート コンピューターのように動作することが防止されます。私はこれにセキュリティ上の問題があるとは思いませんが、どうやらルーター会社には問題があるようです。会社に電話して WAN セキュリティを無効にしようとしましたが、それが不可能であることがわかりました。

于 2013-06-01T21:55:17.773 に答える