2011-06-20 9 views
17

सभी "सर्वर" स्केला उपयोग अभिनेताओं, रिएक्टरों आदि में उदाहरण ...स्केल पाइथन इको सर्वर/क्लाइंट उदाहरण के बराबर है?

कोई मुझे बताएंगे कि कैसे सिर्फ Server और Client के निम्नलिखित अजगर उदाहरण की तरह, एक मृत सरल गूंज सर्वर और ग्राहक लिखने के लिए कर सकते हैं:

# 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 

उत्तर

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 पसंद कर सकते हैं।

+0

यह क्लाइंट में "वैल (इन, आउट) = ..." पंक्ति से पहले नहीं चला है। – drozzy

+0

उदाहरणों को अलग करने के लिए उदाहरणों को सहेजने का प्रयास करें और स्कैला कमांड का उपयोग करके उन्हें चलाएं। किसी अज्ञात कारण के लिए जब यह सीधे आरईपीएल में चिपकाया जाता है (या लोड लोड कमांड के माध्यम से भी लोड किया जाता है)। –

+1

मुझे पता है कि यह फाइलों से क्यों काम करता है और आरईपीएल में नहीं।मजेदार बात :) जब आप निष्पादित करते हैं: वैल इन = न्यू बुफर्डसोर्स (एस .getInputStream())। GetLines() आरपीएल आपको अभिव्यक्ति का मूल्य दिखाने की कोशिश करेगा। हालांकि यह इको-सर्वर उत्तर तक संभव नहीं है, और सर्वर वर्तमान में अनुरोध के लिए इंतजार कर रहा है। यदि आप सर्वर को बंद करते हैं, तो ग्राहक फिर से शुरू हो जाएगा। –

2

आप जावा सॉकेट का उपयोग करना होगा। मुझे स्कैला सॉकेट सर्वर/क्लाइंट का एक अच्छा उदाहरण मिला: http://www.scala-lang.org/node/55

+0

मुझे लगता है कि सवाल अधिकतम सादगी के बारे में है, और स्काला में आप वास्तव में सरल प्राप्त कर सकते हैं (मेरा उत्तर देखें)। लोगों को कम समारोह-उच्च लाभ दृष्टिकोण के लिए पायथन का महत्व है और स्कैला अक्सर अधिक संक्षिप्त होता है। –

+0

@Przemek हाँ, मुझे पता है। मैंने अभी एक उदाहरण से जुड़ा हुआ है ताकि स्कैला के बारे में और अधिक सीखने की प्रक्रिया में @ डोज़ज़ी को एक विचार मिले और इको सर्वर और क्लाइंट को कार्यान्वित किया जा सके। – Marcelo

+0

ठीक है :) हाल ही में मैंने "पायथन बनाम स्कैला" विषय पर कुछ चर्चा की है, जिसने मुझे पूरी तरह से आश्वस्त किया है कि एक भाषा को बढ़ावा देने के लिए सर्वोत्तम उदाहरण चुनना महत्वपूर्ण है। हालांकि इससे मुझे भूल गया, कि कुछ लोग (जैसे आप) मदद करना चाहते हैं :) (प्रचार के विरोध में) –

0

आप netty जावा लाइब्रेरी का उपयोग कर सकते हैं।

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

आम तौर पर आप जावा सॉकेट API का उपयोग करने की आवश्यकता है: यहाँ स्काला में एक उदाहरण उपयोग है। this example जावा सॉकेट एपीआई का उपयोग किया जाता है, लेकिन संपूर्ण सर्वर अलग-अलग थ्रेड में ग्राहकों को संसाधित करने के लिए और स्वीकार्य थ्रेड को अवरुद्ध न करने के लिए अभिनेता में लपेटा जाता है (वही बात जो आप सामान्य रूप से जावा में करेंगे, लेकिन आप सीधे थ्रेड का उपयोग करेंगे)।

+0

उदाहरण लिंक 404 – harschware

2

मैंने एक सरल कमांड आधारित सॉकेट सर्वर बनाने के लिए अक्का आईओ और इटरेट्स का उपयोग करने के बारे में एक ब्लॉग पोस्ट लिखा है।

शायद यह ब्याज का हो सकता है।

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

संबंधित मुद्दे