2011-06-01 38 views
0

這是我還沒有在一段時間與我的TCP服務器腳本混亂和決定,我希望它繼續開放,並繼續使用它即使不是隻有好的傾聽的方式爲什麼此示例TCP Server在未關閉時會拋出異常?

Groovy寫一次使用。但是,當我這樣做時,它會引發異常,然後關閉腳本。

我的示例腳本如下:

TCP服務器

def server = new ServerSocket(2000) 

println("Waiting for connection") 


    server.accept() { socket -> 
     socket.withStreams { input, output -> 

     w = new BufferedWriter(new OutputStreamWriter(output)) 
     String message = "Connection was successful" 

      r = new BufferedReader(new InputStreamReader(input)) 

     while(true) { 
     if(message !=null) { 
      sendMessage(message) 
      message = null 
     } 

     String a = r.readLine() 

     if(a.equals("name")) 
      message = "Bob" 
     else if(a.equals("date")) 
      message = new Date() 
     else if(a.equals("ip")) 
      message = InetAddress.getLocalHost().getHostAddress() 
     else if(a.equals("quit")) { 
      server.close() 
      return 
     } else 
      message = "$a command unknown" 
     } 
     } 
    } 

def sendMessage(String msg) { 
    println("Sending: >" + msg + "<") 
    w.writeLine(msg) 
    w.flush(); 
} 

問題來自於客戶端。如果我使用quit命令,則一旦其他命令完成,它將關閉服務器。但是,如果我從命令中刪除quit,則服務器將嘗試保持打開狀態,引發異常,然後關閉服務器。

TCP客戶端

def commands 
def answers 
def requestSocket 
def r 
def w 

String host = "filipekdt7" 
commands = ["name", 
     "date", 
     "ip", 
     "quit"] //If I take out "quit" then the exceptions get thrown, but I want to leave my server script running 

answers = [commands.size] 

requestSocket = new Socket(host, 2000) 

r = new BufferedReader(new InputStreamReader(requestSocket.getInputStream())) 
w = new BufferedWriter(new OutputStreamWriter(requestSocket.getOutputStream())) 

String message = r.readLine() 
println "Server >" + message 

for(int n = 0; n < commands.size; n++) { 
    sendMessage(commands[n],w) 
    answers[n] = r.readLine() 
} 

w.flush() 
w.close() 


public String sendMessage(def msg, def w) { 
    w.write(msg+"\r\n") 
    w.flush() 
    println "Client>" + msg 
} 

有誰知道一種方法來保持服​​務器的腳本來運行?我覺得我只是看起來很簡單。

回答

2

嘗試修改服務器代碼:

def server = new ServerSocket(2000) 
println("Waiting for connection") 

while (true) { 
    server.accept() { socket -> 
     socket.withStreams { input, output -> 
      def w = new BufferedWriter(new OutputStreamWriter(output)) 
      String message = "Connection was successful" 
      def r = new BufferedReader(new InputStreamReader(input)) 

      while (true) { 
       if (message !=null) { 
        sendMessage(message, w) 
        message = null 
       } 

       String a = r.readLine() 
       if (a == null) { 
        socket.close() 
        println "Client disconnected" 
        return 
       } else if (a.equals("name")) { 
        message = "Bob" 
       } else if (a.equals("date")) { 
        message = new Date() 
       } else if (a.equals("ip")) { 
        message = InetAddress.getLocalHost().getHostAddress() 
       } else if (a.equals("quit")) { 
        server.close() 
        return 
       } else { 
        message = "$a command unknown" 
       } 
      } 
     } 
    } 
} 

def sendMessage(msg, writer) { 
    println("Sending: >" + msg + "<") 
    writer.writeLine(msg.toString()) 
    writer.flush(); 
} 

注意如何ServerSocket反覆accept S IN一while環路連接。這使服務器腳本保持運行。

您之前得到異常是因爲您試圖向與服務器斷開連接的客戶端發送消息。要解決此問題,您應該驗證從客戶端讀取的命令是否有效(即a != null),然後再嘗試發回響應。

+0

啊,謝謝@Binil Thomas!你絕對正確。我感謝你解釋爲什麼它拋出異常。 – StartingGroovy 2011-06-03 18:43:01

相關問題