Scala эквивалент python echo server / client example?

18

Весь пример «сервера» в scala использует актеров, реакторов и т. д.

Может кто-нибудь покажет мне, как написать мертвый простой сервер эха и клиент, как и следующий пример 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
    
задан drozzy 20.06.2011 в 19:15
источник

5 ответов

26

Вы можете сделать следующее в стандартной библиотеке:

// 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 .     

ответ дан Przemek Pokrywka 20.06.2011 в 22:02
  • Он не проходит мимо строки «val (in, out) = ...» на клиенте. –  drozzy 24.06.2011 в 15:31
  • Попробуйте сохранить примеры для разделения файлов и запуска их с помощью команды scala. По какой-то неизвестной причине он зависает, когда вставлен непосредственно в REPL (или даже загружен через команду load). –  Przemek Pokrywka 24.06.2011 в 19:47
  • Я знаю, почему это работает из файлов, а не в REPL. Смешная вещь :) Когда вы выполняете: val in = new BufferedSource (s.getInputStream ()). GetLines () REPL попытается показать вам значение выражения. Однако это невозможно до тех пор, пока эхо-сервер не ответит, и сервер ждет запроса в настоящее время. Если вы выключите сервер, клиент возобновится. –  Przemek Pokrywka 24.06.2011 в 20:04
  • Если вы хотите запустить клиент в REPL, inline «in» val - удалить строку с объявлением «val in», затем заменить ссылку «in» ссылкой на «new BufferedSource (s.getInputStream ()). getLines () " –  Przemek Pokrywka 24.06.2011 в 22:34
  • Спасибо, я собираюсь попробовать это завтра! –  drozzy 25.06.2011 в 03:46
Показать остальные комментарии
3

Я просто написал сообщение в блоге об использовании Akka IO и Iteratees для создания простого сервера сокетов на основе команд.

Возможно, это может быть интересно.

Ссылка

    
ответ дан Leon Radley 13.08.2012 в 10:00
2

Вам нужно будет использовать Java-сокеты. Я нашел хороший пример сервера / клиента Scala Socket: Ссылка

    
ответ дан Marcelo 20.06.2011 в 19:43
  • Я думаю, что речь идет о максимальной простоте, и в Scala вы можете упроститься фактически (см. мой ответ). Люди ценят Python для подхода с низкой оценкой и высокой степенью усиления и Scala часто более кратки. –  Przemek Pokrywka 20.06.2011 в 23:25
  • @Przemek Да, я знаю. Я просто связался с примером, чтобы @drozzy получил идею и сам реализовал сам Echo Server и Client, в процессе обучения больше о Scala. –  Marcelo 20.06.2011 в 23:48
  • ОК :) Недавно у меня было некоторое обсуждение темы «Python vs Scala», которая полностью убедила меня, что выбор лучших примеров имеет решающее значение для продвижения языка. Хотя это заставило меня забыть, что некоторые люди (например, вы) могут просто захотеть помочь :) (в отличие от продвижения) –  Przemek Pokrywka 21.06.2011 в 00:14
  • @Przemek Я сам программист на Java и не хотел бы быть уверенным в выборе Scala над Java, каких-либо ресурсов, чтобы помочь мне в этом? –  Marcelo 21.06.2011 в 00:34
  • Есть книги: scala-lang.org/node/959 - некоторые входят в бесплатные издания: readwriteweb.com/hack/2011/04/... Удачи! –  Przemek Pokrywka 21.06.2011 в 07:28
0

Вы можете использовать netty java-библиотеку. Вот пример использования в Scala:

Ссылка

Как правило, вам необходимо использовать Java Socket API. В этом примере используется Java Socket API, но весь сервер завернутый в Actor, чтобы обрабатывать клиентов в отдельном потоке и не блокировать поток-акцептор (то же самое, что вы обычно делаете на Java, но вы будете использовать потоки напрямую).

    
ответ дан tenshi 20.06.2011 в 19:56
  • пример ссылки 404 –  harschware 13.02.2015 в 05:51
0

Недавно Джош Суэрет опубликовал пример эхо-сервера NIO, использующего скатаз Iteratees . Требуется библиотека scalaz

    
ответ дан oxbow_lakes 20.06.2011 в 20:53
  • scalaz ссылка 404 –  harschware 13.02.2015 в 05:29