【问题标题】:Scala equivalent of python echo server/client example?Scala相当于python echo服务器/客户端示例?
【发布时间】:2011-09-18 21:16:52
【问题描述】:

scala 中的所有“服务器”示例都使用演员、反应器等...

谁能告诉我如何编写一个死的简单的回显服务器和客户端,就像下面的ServerClient的python示例:

# A simple echo server 
import socket 

host = '' 
port = 50000 
backlog = 5 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1: 
    client, address = s.accept() 
    data = client.recv(size) 
    if data: 
        client.send(data) 
    client.close()

# A simple echo client 
import socket 

host = 'localhost' 
port = 50000 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 
s.send('Hello, world') 
data = s.recv(size) 
s.close() 
print 'Received:', data

【问题讨论】:

    标签: python scala echo


    【解决方案1】:

    您可以在标准库中执行以下操作:

    // Simple server
    import java.net._
    import java.io._
    import scala.io._
    
    val server = new ServerSocket(9999)
    while (true) {
        val s = server.accept()
        val in = new BufferedSource(s.getInputStream()).getLines()
        val out = new PrintStream(s.getOutputStream())
    
        out.println(in.next())
        out.flush()
        s.close()
    }
    

    // Simple client
    import java.net._
    import java.io._
    import scala.io._
    
    val s = new Socket(InetAddress.getByName("localhost"), 9999)
    lazy val in = new BufferedSource(s.getInputStream()).getLines()
    val out = new PrintStream(s.getOutputStream())
    
    out.println("Hello, world")
    out.flush()
    println("Received: " + in.next())
    
    s.close()
    

    如果您不介意使用额外的库,您可能会喜欢Finagle

    【讨论】:

    • 它不会越过客户端中的“val (in, out) =...”这一行。
    • 尝试将示例保存到单独的文件中并使用 scala 命令运行它们。由于某些未知原因,它在直接粘贴到 REPL 时挂起(甚至通过 :load 命令加载)。
    • 我知道为什么它在文件中起作用,而不是在 REPL 中。有趣的事情 :) 当你执行: val in = new BufferedSource(s.getInputStream()).getLines() REPL 将尝试向你显示表达式的值。但是,在 echo-server 回复之前这是不可能的,并且服务器当前正在等待请求。如果您关闭服务器,客户端将恢复。
    • 如果你想在 REPL 中运行客户端,内联 "in" val - 删除带有 "val in" 声明的行,然后将 "in" 引用替换为 "new BufferedSource(s.getInputStream() ).getLines()"
    • 谢谢,我明天试试!
    【解决方案2】:

    我刚刚写了一篇关于使用 Akka IO 和 Iteratees 创建一个简单的基于命令的套接字服务器的博文。

    也许你会感兴趣。

    http://leon.radley.se/2012/08/akka-command-based-socket-server/

    【讨论】:

      【解决方案3】:

      您必须使用 Java 套接字。我在 http://www.scala-lang.org/node/55

      找到了一个很好的 Scala Socket 服务器/客户端示例

      【讨论】:

      • 我认为问题是关于最大程度的简单性,而在 Scala 中您实际上可以变得更简单(请参阅我的回答)。人们看重 Python 的低形式高收益方法,而 Scala 通常更简洁。
      • @Przemek 是的,我知道。我只是链接到一个示例,以便@drozzy 产生想法并自己实现 Echo 服务器和客户端,在此过程中了解有关 Scala 的更多信息。
      • Ok :) 最近我对“Python vs Scala”主题进行了一些讨论,这让我完全相信,选择最好的示例对于推广一门语言至关重要。虽然这让我忘记了,有些人(比如你)可能只是想帮忙:)(而不是推广)
      • @Przemek 我自己是一名 Java 程序员,不介意被说服选择 Scala 而不是 Java,有什么资源可以帮助我吗?
      • 有些书:scala-lang.org/node/959 - 有些是免费版:readwriteweb.com/hack/2011/04/… 祝你好运!
      【解决方案4】:

      您可以使用netty java 库。以下是 Scala 中的示例用法:

      https://github.com/mcroydon/scala-echo-server

      一般你需要使用Java Socket API。在this example 中使用了Java Socket API,但整个服务器被包裹在Actor 中,以便在单独的线程中处理客户端而不阻塞接收器线程(您通常在Java 中会做同样的事情,但您将直接使用线程) .

      【讨论】:

        【解决方案5】:

        Josh Suereth 最近发布了example of an NIO echo server using scalaz Iteratees。需要scalaz

        【讨论】:

          猜你喜欢
          • 2019-04-27
          • 2018-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          • 2023-03-10
          • 1970-01-01
          相关资源
          最近更新 更多