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