我制作了一个程序来保持与服务器的连接。它总是有许多来自接收和发送的数据包,从不断开连接(就像游戏一样)。它一直运行完美,但是当服务器失去与客户端的连接时,会发生以下情况之一:
channel.read
返回 -1。它断开连接,没有错误。channel.write
抛出异常。它调用 tocloseServer()
,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 类。