2015-08-08 44 views
1

我試圖做一個非常簡單的scala套接字程序,它可以「回顯」它從多個客戶端收到的任何輸入信息。簡單的scala套接字程序 - 只與一個客戶端通信?

此程序可以工作,但僅適用於單個客戶端。我想這是因爲執行總是在while(true)

import java.net._ 
import java.io._ 
import scala.io._ 


//println(util.Properties.versionString) 

val server = new ServerSocket(9999) 
println("initialized server") 
val client = server.accept 

while(true){ 

val in = new BufferedReader(new InputStreamReader(client.getInputStream)).readLine 
val out = new PrintStream(client.getOutputStream) 

println("Server received:" + in) // print out the input message 
out.println("Message received") 
out.flush 


} 

我已經試過

使這一修改

while(true){ 

    val client = server.accept 

    val in = new BufferedReader(new InputStreamReader(client.getInputStream)).readLine 
    val out = new PrintStream(client.getOutputStream) 
    println("Server received:" + in) 

    } 

但是,除了「回聲」荷蘭國際集團出單這一點兒也不工作消息

我想多個客戶端連接到套接字,並不斷接收他們所輸入的任何輸出

+2

我認爲你應該使用第二個選項,但要accept'後'代碼是未來「代碼塊的一部分與其他循環。 –

+0

@GáborBakos你可以請添加一個代碼片段。這將幫助我以及..謝謝:) – wolfgang

回答

-1

在這裏你可以找到Scala語言的例子:

[http://www.scala-lang.org/old/node/55][1] 

,這也是從階Twitter的學校,與Java庫工作一個很好的例子:

進口java.net {插座,ServerSocket的} 進口的java.util.concurrent。{執行人的ExecutorService} 進口java.util.Date

class NetworkService(port: Int, poolSize: Int) extends Runnable { 
    val serverSocket = new ServerSocket(port) 

    def run() { 
    while (true) { 
     // This will block until a connection comes in. 
     val socket = serverSocket.accept() 
     (new Handler(socket)).run() 
    } 
    } 
} 

class Handler(socket: Socket) extends Runnable { 
    def message = (Thread.currentThread.getName() + "\n").getBytes 

    def run() { 
    socket.getOutputStream.write(message) 
    socket.getOutputStream.close() 
    } 
} 

(new NetworkService(2020, 2)).run 
+0

在這裏http://pastebin.com/XQYeUXuv,我把一個'while(true)'循環裏面'Handler.run',這並不真正與多個客戶端談話時'telnet'(ed)來自多個終端 – wolfgang

+1

您的代碼看起來應該是多線程的,而不是。也許你想解決這個問題,或者至少消除這種欺騙? (並添加導入代碼塊) –

1

基本上你應該接受CON併爲每個客戶創建一個新的Future。請注意,隱式全局變量ExecutionContext可能會受到限制,您可能需要找到一個更適合您的用例的變體。

如果你需要更復雜的任務與期貨,你可以使用Scala異步,但我認爲這可能是好的。

聲明,我沒有試過,但是類似的事情可能工作(根據您的代碼和the docs):

import scala.concurrent._ 
import ExecutionContext.Implicits.global 
... 

while(true){ 
    val client = server.accept 
    Future { 
     val inReader = new BufferedReader(new InputStreamReader(client.getInputStream)) 
     val out = new PrintStream(client.getOutputStream) 
     do { 
      val in = inReader.readLine 
      println("Server received:" + in) 
     } while (true/*or a better condition to close the connection */) 
     client.close 
    } 
} 
+0

這個工程!謝謝:) – wolfgang

+0

@wolfgang我已經更新了一下代碼。我更喜歡這種方式。也許'in'可能是內部循環之外的'var',所以它的值可以用在'do' -'while'的條件中。 –

相關問題