python写tcp服务器_Python TCP服务器,写入客户端?

这是我之前写的一些东西,用来学习如何用一个线程处理多个连接。它绝不是完美的,但它说明了你想做什么。client对象管理连接的读写流,并确保服务器在右select()列表中有客户机套接字。这实现了一个简单的协议,其中消息由新行终止。pumpxxx()函数只阻塞读/写流并管理读/写缓冲区。只有在缓冲区中找到新行时,才会处理完整的消息。在import socket

import select

class Client(object):

'''This object is created for each client connection. It tracks

what has been read, what has been written, and processes complete

messages terminated by newlines. It responds by returning the

original message wrapped in square brackets and terminated by a

newline. '''

def __init__(self,who,sock,server):

'''who - client address

sock - client socket

server - server object for this client

'''

self.who = who

self.readbuf = ''

self.writbuf = ''

self.server = server

self.sock = sock

def close(self):

'''Removes client from server's reader/writer queues and

closes the connection.'''

self.sock.close()

if self.sock in self.server.readers:

self.server.readers.remove(self.sock)

if self.sock in self.server.writers:

self.server.writers.remove(self.sock)

self.server.data.pop(self.sock)

def pumprecv(self):

'''Server calls pumprecv() when something is readable from the

client socket. The data is appended to the client's read

buffer.mro Complete messages (if any) are then removed from

the buffer and processed.'''

try:

tmp = self.sock.recv(1000)

except socket.error,e:

print 'recv',e

self.close()

else:

if tmp:

self.readbuf += tmp

# Complete messages are processed

while '\n' in self.readbuf:

msg,self.readbuf = self.readbuf.split('\n',1)

print self.who,msg

self.writbuf += '[' + msg + ']\n'

# New data to send. Make sure client is in the

# server's writer queue.

if self.sock not in self.server.writers:

self.server.writers.append(self.sock)

else:

self.close()

def pumpsend(self):

try:

# send some data. tmp is #chars sent (may not be all in writbuf).

tmp = self.sock.send(self.writbuf)

except socket.error,e:

print 'send:',e

self.close()

else:

# Removed sent characters from writbuf.

self.writbuf = self.writbuf[tmp:]

# If writbuf is empty, remove socket from server's write queue.

if not self.writbuf:

self.server.writers.remove(self.sock)

class Server(object):

def __init__(self,ip='127.0.0.1',port=9999):

self.ssock = socket.socket()

self.ssock.bind((ip,port))

self.ssock.listen(5)

self.readers = [self.ssock]

self.data = {}

self.writers = []

self.quit = False

def pumpaccept(self):

'''Called when server socket is readable to accept a

connection and create a Client object.'''

csock,who = self.ssock.accept()

print 'Connected %s:%d' % who

self.readers.append(csock)

self.data[csock] = Client(who,csock,self)

def serve(self):

while not self.quit or self.writers:

readable,writable,other = select.select(self.readers,self.writers,[],1.0)

# Operate on copies of the queues since the pumpXXX() commands can modify the lists.

if self.ssock in readable[:]:

self.pumpaccept()

readable.remove(self.ssock)

for reader in readable[:]:

self.data[reader].pumprecv()

for writer in writable[:]:

self.data[writer].pumpsend()

if not readable and not writable and not other:

print '.',

if __name__ == '__main__':

srv = Server()

srv.serve()

我通过在一个控制台中启动服务器并在其他控制台中运行以下代码来测试多个连接来测试这一点。建立多个连接,从不同的窗口交替发送,并发送部分消息以查看服务器如何响应。在

^{pr2}$

输出应该类似于:. . . . . . . . . . . . . . . . . . . Connected 127.0.0.1:1514

. . . . . . . . . ('127.0.0.1', 1514) one

. . . . . . . ('127.0.0.1', 1514) two

. . . ('127.0.0.1', 1514) three

('127.0.0.1', 1514) four

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值