0

我制作了一个程序来保持与服务器的连接。它总是有许多来自接收和发送的数据包,从不断开连接(就像游戏一样)。它一直运行完美,但是当服务器失去与客户端的连接时,会发生以下情况之一:

  1. channel.read返回 -1。它断开连接,没有错误。

  2. channel.write抛出异常。它调用 to closeServer()channel.read返回 -1 并毫无问题地断开连接。

  3. channel.read 永远不会回来channel.write被调用太多次,它总是抛出一个异常,但channel.read永远不会返回。

  4. channel.read永远不会回来。channel.write永远不要抛出异常。过了一会儿,channel.write就再也回不来了。它堆叠起来没有错误。有时它永远不会被堆叠,它总是写入字节,但连接结束了。

  5. channel.read从不返回,channel.write从不抛出异常。我closeServer()用手打电话,但它被堆积起来,channel.close();永远不会回来。

我对此越来越疯狂。这是源代码:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class Client {
    Boolean close = false;
    SocketChannel channel = null;
    JFrame window;

    public Client(JFrame window){
        this.window = window;
    }
    public void send (String s){
        try {
            channel.write(StringToByteBuffer(s));
        } catch (IOException ex) {
            window.error("Error writing data\n");
            closeServer();
        }
    }

    public void Connect (){

        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
        InetSocketAddress socketAddress = new InetSocketAddress("xx.xx.xx.xx", 800);
        try {
            channel = SocketChannel.open();
            channel.connect(socketAddress);
        } catch (IOException ex) {
            window.error("Unable to connect to server\n");
        }

        send("Login String");

        try {
            while ((channel.read(buffer)) != -1) {
                buffer.flip();
                proccessBuffer(buffer);
                buffer.clear();
                if (close){
                    channel.close();
                    break;
                }
            }
        } catch (IOException ex) {
            window.error("Error reading data\n");
            closeServer();
        }
        window.setServerOffline();
    }

    public void closeServer(){
        try {
            channel.close();
        } catch (IOException ex) {
            window.error("Error closeing socket");
        }
        close = true;
    }
}

我从主 JFrame 为此类创建了一个线程,例如:

new Thread() {
                @Override
                public void run() {

                client = new Client(window);
                client.Connect();


            }}.start();

window是一个 JFrame 并且client是 Client 类。

4

0 回答 0