2010-06-29 12 views
5

मैं आईआरसी सर्वर/ग्राहकों के लिए मुड़ पुस्तकालयों के साथ थोड़ा प्रयोग करने की प्रक्रिया में हूं। मुझे आईआरसी क्लाइंट को कार्यान्वित करने के कुछ अच्छे उदाहरण मिल गए हैं लेकिन चीजों के सर्वर पक्ष पर कुछ भी अच्छा लगता है। क्या कोई मोड़ में एक बुनियादी आईआरसी सर्वर बनाने के बारे में कुछ अंतर्दृष्टि प्रदान कर सकता है?ट्विस्ट आईआरसी सर्वर का अच्छा उदाहरण?

संपादित करें: इस से निर्माण के बारे में क्या? क्या मैं यहां सही दिशा में जा रहा हूं?

from twisted.internet.protocol import ServerFactory 
from twisted.internet import reactor 
from twisted.words.protocols.irc import IRC 


class IRCServer(IRC): 
    def connectionMade(self): 
     print "client connected" 

    def handleCommand(self, command, prefix, params): 
     print "handle comm" 
     IRC.handleCommand(self, command, prefix, params) 

    def dataReceived(self, data): 
     print "data: %s" % data 
     IRC.dataReceived(self, data) 

    def irc_unknown(self, prefix, command, params): 
     print "%s, %s, %s, IRC UNKNOWN" % (prefix, command, params) 

    def irc_USER(self, prefix, params): 
     print "USER: %s, %s" % (prefix, params) 

    def irc_NICK(self, prefix, params): 
     print "NICK: %s, %s" % (prefix, params) 



class IRCServerFactory(ServerFactory): 
    protocol = IRCServer 

factory = IRCServerFactory() 
reactor.listenTCP(8002, factory) 
reactor.run() 

जब मैं चैनल में शामिल होने का प्रयास करता हूं तो मैं कभी भी सक्षम नहीं हूं। मुझे कमांड के लिए हैंडलर नहीं होने से संबंधित एक त्रुटि मिल रही थी, इसलिए मैंने irc_USER और irc_NICK विधियों को लिखा लेकिन यह केवल त्रुटि से छुटकारा पा लिया, इसने कनेक्टिंग/काम नहीं करने की समस्या को हल नहीं किया।

उत्तर

8

शायद ऐसा कुछ?

[email protected]:/tmp/irc-server$ cat > passwd 
alice:secret 
bob:19820522 
[email protected]:/tmp/irc-server$ twistd -n words --irc-port 6667 --auth file:passwd 
2010-06-29 11:51:26-0400 [-] Log opened. 
2010-06-29 11:51:26-0400 [-] twistd 10.0.0+r29436 (/usr/bin/python 2.6.4) starting up. 
2010-06-29 11:51:26-0400 [-] reactor class: twisted.internet.selectreactor.SelectReactor. 
2010-06-29 11:51:26-0400 [-] twisted.words.service.IRCFactory starting on 6667 
2010-06-29 11:51:26-0400 [-] Starting factory <twisted.words.service.IRCFactory instance at 0x9ddbf8c> 

आप परिणाम जानने के लिए लागू किया गया है, twisted/words/tap.py

twisted.words.protocols.irc.IRC देखना चाहते हैं, तो एक आईआरसी सर्वर सिर्फ पार्स भागों में से एक बहुत ही बुनियादी कार्यान्वयन है। यह चैनल, मोड, संदेश इत्यादि जैसे वास्तविक सर्वर तर्क लागू नहीं करता है। आप इस पर एक सर्वर बना सकते हैं, लेकिन आपको लगभग पूरी चीज बनाना है। twistd words द्वारा कोड को लागू किया गया यह ठीक है। आप अपने कार्यान्वयन को संदर्भित करना चाहते हैं कि आपके प्रश्न का कोड किस दिशा में लक्षित हो रहा है इसका एक सफल उदाहरण देखें।

+0

तो क्या आप कह रहे हैं कि मैं सही दिशा में जा रहा हूं, लेकिन मुझे पूर्ण प्रोटोकॉल का समर्थन करने के लिए सुविधाओं/विधियों को जोड़ना जारी रखना होगा? या स्क्रैच से शुरू करना बेहतर होगा और word.protocols.irc.IRC का उपयोग न करें और केवल शब्दों का उपयोग करें। सेवा? मैं कुछ हद तक उलझन में हूं कि twisted.service क्यों है और फिर twisted.irc तो? काम करने के लिए कौन सा उचित है? – themaestro

+0

twisted.words.service का इरादा यह है कि आप उस पर एक आईआरसी सर्वर का आधार बना सकते हैं। इरादे और वास्तविकता के बीच एक अंतर हो सकता है; यह ट्विस्ट का एक हिस्सा है जिसका व्यापक रूप से उपयोग नहीं किया जाता है। इसका मतलब यह नहीं है कि twisted.words.service आपके लिए काम नहीं करेगा हालांकि, यह आपके लक्ष्य के आधार पर निर्भर करता है। क्यों दोनों twisted.words.protocols.irc.IRC और twisted.words.service दोनों हैं, यह आसान है - पूर्व को बाद के कार्यान्वयन के आधार के रूप में उपयोग किया जाता है। –

0

मैं इस पुस्तक में आया हूं जिसमें निम्न कोड है जो ट्विस्टेड शब्द सर्वर पर पूर्ण होगा और आपको चैनल बनाने की इजाजत देगा। यहां पुस्तक से कोड है।

from twisted.cred import checkers, portal 
from twisted.internet import reactor 
from twisted.words import service 

wordsRealm = service.InMemoryWordsRealm("example.com") 
wordsRealm.createGroupOnRequest = True 

checker = checkers.FilePasswordDB("authfile.txt") 
portal = portal.Portal(wordsRealm, [checker]) 

reactor.listenTCP(6667, service.IRCFactory(wordsRealm, portal)) 
reactor.run() 

पुस्तक: पेज 119 को http://books.google.com/books?id=_g5UNxWUKsMC&printsec=frontcover#v=onepage जाओ और आप इसे वर्णन दिया गया है मिल जाएगा। किताब खरीदें, यह एक अच्छा है।

from twisted.application import internet, service 
from twisted.cred import checkers, portal, credentials 
from twisted.cred.checkers import ICredentialsChecker 
from twisted.internet import defer 
from twisted.words import service as wordsservice 
from zope.interface import implements 

wordsRealm = wordsservice.InMemoryWordsRealm("example.com") 
wordsRealm.createGroupOnRequest = True 
wordsRealm.createUserOnRequest = True 

class UserAnon: 
    implements(ICredentialsChecker) 
    credentialInterfaces = (credentials.IUsernamePassword, credentials.IUsernameHashedPassword) 

    def __init__(self): 
    pass 

    def addUser(self, username, password): 
    pass 

    def _cbPasswordMatch(self, matched, username): 
    return username 

    def requestAvatarId(self, credentials): 
    return defer.succeed(credentials.username) 

class IRCAnonymous(wordsservice.IRCUser): 
    def irc_NICK(self, prefix, params): 
    self.password = 'doesntmatter' 
    wordsservice.IRCUser.irc_NICK(self, prefix, params) 


checker = UserAnon() 
portal = portal.Portal(wordsRealm, [checker]) 

servicefactory = wordsservice.IRCFactory(wordsRealm, portal) 
servicefactory.protocol=IRCAnonymous 

application = service.Application("ircserver") 
ircservice = internet.TCPServer(6667, servicefactory) 
ircservice.setServiceParent(application) 

फिर आप twistd -nol- -y irc_server.py साथ twistd से इस पर अमल कर सकते हैं:

0

आप एक सरल गुमनाम मुड़ आईआरसी सर्वर चाहते हैं, यह मूल रूप से इसके बारे में जाने के लिए सबसे आसान तरीका है।

अन्य उत्तरों में उल्लिखित मुश्किल बिट यह है कि मुड़ गए प्रोटोकॉल ऑब्जेक्ट पर विभिन्न संदेश संदेशों में उनके इनपुट/रिटर्न पर अपेक्षाएं होती हैं, इसलिए आपको मॉड्यूल दस्तावेज़ों पर जाना होगा, और कभी-कभी स्रोत कोड को समझना होगा वहां क्या जरूरत है।

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