2014-12-07 128 views
0

我写了一些scala代码,用于洗牌。ServerSocket关闭原因不明

代码如下,但serverSocket关闭意外,serverSocket将启动(我观察使用netsta),但过了一段时间,它将被关闭。

private val conManagerThread = new Thread("connection-manager-thread") { 
override def run() = ConnectionManager.this.run() 
} 
conManagerThread.setDaemon(true) 
conManagerThread.start() 

def run() { 
    val serverSocket = new ServerSocket(port, 0, InetAddress.getByName(Utils.localHostName)) 
    try{ 
     //while(!conManagerThread.isInterrupted) { 
     while(true) { 
      try { 
       logInfo("start listening client ") 
       val clientSocket = serverSocket.accept() 
       logInfo("accept a client") 
       serverPool.execute(new ServerConnection(clientSocket, id, onReceiveCallback)) //TODO: the conId maybe a remote id, so we should get it from the msg 
      } 
      catch { 
       case e: Exception => logError("Error in serverSocket accept", e) 
       logError("Error in serverSocket accept") 
      } 
     } 
    } 
    catch { 
     case e: Exception => logError("Error in serverPool execute", e) 
      logError("Error in serverPool execute") 
    } 
    finally{ 
     logInfo("=====\nserver closed\n=========") 
    } 

和一个ServerConnection就像是以下几点:

class ServerConnection(client : Socket, conId: ConnectionManagerId, 
    onReceiveCallback: (BufferMessage, ConnectionManagerId) => Option[Message]) 
    extends Runnable with Logging{ 
    def run(){ 
     //some other code 
    } 
} 

回答

0

我认为你有问题,因为你有积压设置为0,在ServerSocket的构造函数,或者因为你没有设置ReusableAddress为true(最有可能的)。据我所知,通常先创建ServerSocket,然后将其绑定到端口并执行其他操作。 我建议你创建可选的SereverSocket的方法。

import scala.util.{Try, Success, Failure} 

def socket(port: Int) = Try { 
    val socket = new ServerSocket() 
    socket.setReusableAddress(true) 
    socket.bind(new InternetSocketAddress("localhost", port)) 
    socket 
} match { 
    case Success(s) => Some(s) 
    case Failure(ex) => 
    logError("Error during ServerSocket creation", ex) 
    None 
} 
+0

感谢您的回答。我按照你的建议稍后尝试,但问题仍然存在。 – Djvu 2014-12-08 06:26:51