2011-06-20 45 views
17

Tất cả các "máy chủ" ví dụ trong các diễn viên sử dụng scala, lò phản ứng vv ...Scala tương đương với python echo server/client example?

Ai đó có thể chỉ cho tôi làm thế nào để viết một máy chủ vang đơn giản chết và khách hàng, giống như ví dụ python sau ServerClient:

# 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 

Trả lời

26

Bạn có thể làm như sau trong thư viện tiêu chuẩn:

// 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() 

Nếu bạn không nhớ sử dụng thư viện thêm, bạn có thể muốn Finagle.

+0

Nó không chạy qua dòng "val (in, out) = ..." trong ứng dụng khách. – drozzy

+0

Cố gắng lưu các ví dụ để tách các tệp và chạy chúng bằng lệnh scala. Đối với một số lý do không rõ nó treo khi dán trực tiếp trong REPL (hoặc thậm chí nạp thông qua: tải lệnh). –

+1

Tôi biết lý do tại sao nó hoạt động từ các tệp và không phải trong REPL.Điều buồn cười :) Khi bạn thực hiện: val in = new BufferedSource (s.getInputStream()). GetLines() REPL sẽ cố gắng hiển thị cho bạn giá trị của biểu thức. Tuy nhiên điều này là không thể cho đến khi echo-server trả lời, và máy chủ chờ yêu cầu hiện tại. Nếu bạn tắt máy chủ, máy khách sẽ tiếp tục. –

2

Bạn sẽ phải sử dụng Java Sockets. Tôi đã tìm thấy một ví dụ điển hình về Máy chủ/Máy khách Scala Socket tại: http://www.scala-lang.org/node/55

+0

Tôi nghĩ câu hỏi là về sự đơn giản tối đa, và trong Scala bạn có thể nhận đơn giản thực sự (xem câu trả lời của tôi). Con người coi trọng Python đối với phương pháp tiếp cận có thu nhập thấp-cao và Scala thường ngắn gọn hơn. –

+0

@Przemek Vâng, tôi biết. Tôi chỉ liên kết với một ví dụ để @drozzy sẽ có được một ý tưởng và thực hiện Echo Server và Client, trong quá trình tìm hiểu thêm về Scala. – Marcelo

+0

Ok :) Gần đây tôi đã có một số cuộc thảo luận về chủ đề "Python vs Scala", điều này hoàn toàn thuyết phục tôi, rằng việc chọn các ví dụ tốt nhất là rất quan trọng trong việc quảng bá một ngôn ngữ. Mặc dù điều đó làm tôi quên đi, rằng một số người (như bạn) có thể chỉ muốn giúp :) (như trái ngược với việc quảng bá) –

0

Bạn có thể sử dụng thư viện java netty. Đây là một cách sử dụng ví dụ trong Scala:

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

Nói chung, bạn cần phải sử dụng Java Socket API. Trong this example Java Socket API được sử dụng, nhưng toàn bộ máy chủ được bao bọc trong Actor để xử lý các client trong thread riêng biệt và không chặn thread acceptor (điều tương tự bạn thường làm trong Java, nhưng bạn sẽ sử dụng các luồng trực tiếp).

+0

liên kết mẫu là 404 – harschware

Các vấn đề liên quan