套接字断开时出错

时间:2012-06-22 17:12:26

标签: java sockets

我制作了一个程序来保持与服务器的连接。它有很多来自recv和send的数据包,永远不会断开连接(比如游戏)。它始终完美无缺,但当服务器与客户端失去连接时,会发生以下情况之一:

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

  2. channel.write抛出异常。它调用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();永远不会返回。

  6. 我对此感到疯狂。这是源代码:

    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是客户端类。

0 个答案:

没有答案