twisted学习之一
来源:互联网 发布:陕师大网络portal界面 编辑:程序博客网 时间:2024/06/09 16:44
Python的学习也到了网络的学这块了,在核心编程上提到了个python的开源网络库,网上看了看相关的资料,据说很强大,这就是twisted。看书上的例子,看的有点晕乎,照着模子把代码弄出来了,确还没清晰原理。
于是在网上查找了相关的学习资料,现在开始学习第一步。一开始啥也不讲了,直接贴几个从网上弄来的服务器代码吧,同时记录一下也便于学习
PythonCode:
#Twisted聊天服务器
from twisted.internet.protocol import Factory
from twisted.protocols.basic import LineOnlyReceiver
from twisted.internet import reactor
class Chat(LineOnlyReceiver):
def lineReceived(self, data):
self.factory.sendAll("%s: %s" % (self.getId(), data))
def getId(self):
return str(self.transport.getPeer())
def connectionMade(self):
print "New connection from", self.getId()
self.transport.write("Welcome to the chat server, %s/n" % self.getId())
self.factory.addClient(self)
def connectionLost(self, reason):
self.factory.delClient(self)
class ChatFactory(Factory):
protocol = Chat
def __init__(self):
self.clients = []
def addClient(self, newclient):
self.clients.append(newclient)
def delClient(self, client):
self.clients.remove(client)
def sendAll(self, message):
for proto in self.clients:
proto.transport.write(message + "/n")
reactor.listenTCP(51423, ChatFactory())
reactor.run()
PythonCode:
#Python标准库实现的聊天服务器
#转自IBM网站上的一段代码,可以直接运行,好好学习下。
#!/usr/bin/python
import socket
import select
#debug = False
debug = True
class ChatServer:
def __init__( self, port ):
if debug: print 'start init ChatServer'
self.port = port
self.srvsock = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
self.srvsock.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
self.srvsock.bind( ("", port) )
self.srvsock.listen( 5 )
self.descriptors = [self.srvsock]
print 'ChatServer started on port %s' % port
def run( self ):
while 1:
# Await an event on a readable socket descriptor
(sread, swrite, sexc) = select.select( self.descriptors, [], [] )
# Iterate through the tagged read descriptors
for sock in sread:
# Received a connect to the server (listening) socket
if sock == self.srvsock:
self.accept_new_connection()
else:
# Received something on a client socket
str = sock.recv(100)
# Check to see if the peer socket closed
if str == '':
host,port = sock.getpeername()
str = 'Client left %s:%s/r/n' % (host, port)
self.broadcast_string( str, sock )
sock.close
self.descriptors.remove(sock)
else:
host,port = sock.getpeername()
newstr = '[%s:%s] %s' % (host, port, str)
self.broadcast_string( newstr, sock )
def accept_new_connection( self ):
if debug: print 'accept new connection...'
newsock, (remhost, remport) = self.srvsock.accept()
self.descriptors.append( newsock )
newsock.send("You're connected to the Python chatserver/r/n")
str = 'Client joined %s:%s/r/n' % (remhost, remport)
self.broadcast_string( str, newsock )
def broadcast_string( self, str, omit_sock ):
for sock in self.descriptors:
if sock != self.srvsock and sock != omit_sock:
sock.send(str)
print str
myServer = ChatServer( 2828 ).run()
另一个收集说明:
从网上找下来的Python聊天室源码, 收集了两个, 两个Python聊天室源码修正了一些错误,试验过来,都能用的, 记录下来。
两个都是可以用telnet登录的, 命令: telnet 服务器ip 8080 , windows里就在开始=>运行里输入,linux等系统就在终端输入.
好久没有玩过聊天室了,不过这些Python聊天室源码可以作为Python学习材料, 不错的.
PythonCode:#!/usr/local/python
#-*- encoding:gb2312 -*-
from twisted.internet import protocol
from twisted.protocols import basic
from twisted.python import log
from twisted.internet import reactor
import sys
class ConfigServer(basic.LineReceiver):
def __init__(self):
pass
def lineReceived(self, line):
if line == 'quit':
self.sendLine(”Goodbye.”)
self.transport.loseConnection()
else:
self.broadcast(line)
def broadcast(self, msg):
for client in self.factory.clients:
client.sendLine("%s said: %s" % (self.transport.getPeer().host,msg) );
def connectionMade(self):
self.factory.clients.append(self)
print "Connect from %s.." % self.transport.getHost()
self.sendLine("Welcome…%s"% self.transport.getHost())
def connectionLost(self, reason):
self.factory.clients.remove(self)
# self.sendLine(”Disconnect…%s” % self.transport.getHost())
pass
class ConfigServerFactory(protocol.ServerFactory):
protocol = ConfigServer
clients = []
def main():
log.startLogging(sys.stdout)
reactor.listenTCP(8080,ConfigServerFactory())
reactor.run()
if __name__ == '__main__':
main()
下一步,就要根据该代码来进行学习了。
- twisted学习之一
- twisted入门教程之一:Twisted理论基础
- python的twisted 学习
- twisted学习摘要
- Python Twisted学习总结
- twisted学习笔记
- twisted学习笔记
- Twisted 学习1
- Twisted学习记录
- Twisted 学习乱记1
- twisted的学习资料【转】
- twisted python学习笔记:一
- twisted python 学习笔记:二
- twisted python学习笔记:三
- Twisted学习(一)----------------------Deffered参考
- Twisted学习(二)--------------构造Deferreds
- Twisted学习(三)---------------Deferred介绍
- twisted
- 限制软件在一台电脑上运行
- 系统程序员成长计划-动态数组(三)
- kindeditor之上传图片不显示的问题
- SICP 2nd Done, roughly
- TreeSet,iterator()
- twisted学习之一
- 深入浅出单实例Singleton设计模式
- API入门系列之五 -一个正儿八经的SDK程序
- 在VC6中安装BOOST的正则表达式库
- hiiiiii everyone
- ASP.NET MVC Framework 系列
- 操作excel的记忆1
- 必备的 Java 参考资源列表
- 用C语言读取大文件的问题 内存映射