0

サーバーへの接続を維持するプログラムを作成しました。常に受信と送信から多くのパケットがあり、切断されることはありません (ゲームのように)。常に完璧に機能しますが、サーバーがクライアントとの接続を失った場合、次のいずれかが発生します。

  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();決して返されません。

私はこれに夢中になっています。これはソースコードです:

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