Java服务器套接字在一段时间后断开
我已经编写了一个创建线程并打开套接字的服务器。客户端是用Flash编写的。一段时间后,服务器不再响应客户端 服务器:Java服务器套接字在一段时间后断开,java,sockets,disconnect,Java,Sockets,Disconnect,我已经编写了一个创建线程并打开套接字的服务器。客户端是用Flash编写的。一段时间后,服务器不再响应客户端 服务器: 我无法从您的代码中判断此建议是否适用,但从套接字读取或写入的线程不应执行其他操作。读线程应该将其数据排队,而写线程应该从数据队列馈送。读和写应该在不同的线程中完成 否则,缓冲和实际数据传输的不可预测性将保证出现意外的失速情况。您所说的“无响应”是什么意思?客户端或服务器端是否存在某种错误?可能是耗尽了资源(线程仍处于活动状态,或者套接字未关闭?)主服务器线程工作,他正在其中一个计
我无法从您的代码中判断此建议是否适用,但从套接字读取或写入的线程不应执行其他操作。读线程应该将其数据排队,而写线程应该从数据队列馈送。读和写应该在不同的线程中完成
否则,缓冲和实际数据传输的不可预测性将保证出现意外的失速情况。您所说的“无响应”是什么意思?客户端或服务器端是否存在某种错误?可能是耗尽了资源(线程仍处于活动状态,或者套接字未关闭?)主服务器线程工作,他正在其中一个计时器中完成一个作业,但连接不工作。没有资源问题,正如我在Debugger中看到的,线程正在正确关闭。你们看到我的密码有错吗?等等。你所说的“主服务器线程工作,他正在其中一个计时器中完成一项工作”是什么意思?主服务器线程必须只侦听连接,并创建线程子线程并为其分配连接。没有其他的,否则服务器会显得很忙(它会这样做)。那是什么?这是一个问题吗?编辑你的问题是不合适的。我们不会因为你得到答案就删除内容。谢谢,我会改变的。我不知道。
public appGameServer(String Ip){
try{
_SS = new ServerSocket(appMain.CONFIG_GAME_PORT);
_SS.setSoTimeout(0);
_startTime = System.currentTimeMillis();
_gameServerThread = new Thread(this);
_gameServerThread.start();
try{
_startFunctions();
}
catch (Exception e) {
e.printStackTrace();
Debug.err.println(e.getMessage());
}
} catch (IOException e) {
Debug.err.println("Could not listen on port " + appMain.CONFIG_GAME_PORT);
e.printStackTrace();
System.exit(0);
}
}
public void _startFunctions(){
actiuniGlobale.schedule(new TimerTask(){
public void run(){
}
}, 0,500);
}
@Override
public void run(){
while(appMain.isRunning) {
try {
_clients.add(new appMainSystem(_SS.accept()));
_jucatoriOnline = _clients.size();
}catch(IOException e){
e.printStackTrace();
Debug.err.println(e.getMessage());
}
}
}
public static void delClient(appMainSystem serverPrincipal) {
try{
synchronized (_clients){
_clients.remove(serverPrincipal);
_jucatoriOnline = _clients.size();
}
}catch(Exception e){
e.printStackTrace();
Debug.err.println(e.getMessage());
}
}
public static void kickAll()
{
try {
_SS.close();
} catch (IOException e) {}
List<appMainSystem> c = Collections.synchronizedList(new ArrayList<appMainSystem>());
c.addAll(_clients);
for(appMainSystem GT : c) {
try {
GT.closeSocket();
} catch(Exception e) {
e.printStackTrace();
Debug.err.println(e.getMessage());};
}
}
public appMainSystem(Socket sock) {
try{
_s = sock;
_s.setSoTimeout(0);
_in = new BufferedReader(new InputStreamReader(_s.getInputStream()));
_out = new PrintWriter(_s.getOutputStream(),true);
try{
_t = new Thread(this);
_t.setDaemon(true);
_t.start();
}
catch (Exception e) {
Debug.err.println(e.getMessage());
e.printStackTrace();
}
}
catch (IOException e) {
Debug.err.println(e.getMessage());
e.printStackTrace();
if(!_s.isClosed()){
try{
_s.close();
} catch (IOException e1) {Debug.err.println(e1.getMessage());e1.printStackTrace();}
}
}
}
public void run(){
try{
String packet = "";
char charCur[] = new char[1];
while(_in.read(charCur)!=-1 && appMain.isRunning) {
if (charCur[0] != '\u0000' && charCur[0] != '\n' && charCur[0] != '\r') {
packet += charCur[0];
} else if(!packet.isEmpty()) {
packet = new String(packet.getBytes(),"UTF8");
try {
verificaPacket(packet);
} catch(Exception e) {
Debug.err.println(e.getMessage());
e.printStackTrace();
}
packet = "";
}
}
}catch(Exception e) {
kick();
}
finally
{
if(!lastPacketRecv.isEmpty()) kick();
}
}
public void kick()
{
try{
appGameServer.delClient(this);
closeSockets();
} catch(Exception e){
Debug.err.println(e.getMessage());
e.printStackTrace();
}
}
public void closeSockets() throws IOException {
_in.close();
_out.close();
if(!_s.isClosed()) closeSocket();
_t.interrupt();
}
public void closeSocket()
{
try {
_s.close();
} catch (IOException e) {
Debug.err.println(e.getMessage());
e.printStackTrace();
}
}