サーバーへの接続を維持するプログラムを作成しました。常に受信と送信から多くのパケットがあり、切断されることはありません (ゲームのように)。常に完璧に機能しますが、サーバーがクライアントとの接続を失った場合、次のいずれかが発生します。
channel.read
-1 を返します。エラーなく切断されます。channel.write
例外をスローします。を呼び出しcloseServer()
、channel.read
-1 を返し、問題なく切断します。channel.read
決して戻りません。channel.write
が何度も呼び出されると、常に例外がスローされますが、channel.read
返されることはありません。channel.read
二度と戻りません。channel.write
決して例外をスローしません。しばらくするとchannel.write
戻ってこない。エラーなしでスタックされます。スタックされないこともあり、常にバイトを書き込みますが、接続は終了しています。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 クラスです。