Tornado实现简单的Socket TCP服务器

python3

  • 服务端
from collections import namedtuple

from tornado.tcpserver import TCPServer
from tornado.iostream import StreamClosedError
from tornado.ioloop import IOLoop

Client = namedtuple('Client', ['stream', 'address'])


class ChatServer(TCPServer):
    clients = set()

    async def handle_stream(self, stream, address):
        print("A new user has entered the chat room.", address)
        client = Client(stream, address)
        self.clients.add(client)
        print("connection num is:", len(self.clients))
        while True:
            try:
                data = await stream.read_until(b'\n')
                print("User said:", data[:-1], client.address)
                for conn in self.clients:
                    await conn.stream.write(data)
            except StreamClosedError:
                print("A user has left the chat room.", client.address)
                self.clients.remove(client)
                break


if __name__ == '__main__':
    print("Server start ......")
    server = ChatServer()
    server.listen(8000)
    IOLoop.instance().start()
  • 客户端
HOST = '127.0.0.1'  # The remote host
PORT = 8000  # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

s.sendall(b'Hello, \nw')
time.sleep(5)
s.sendall(b'ord! \n')
data = s.recv(1024)
print('Received', repr(data))

time.sleep(60)
s.close()

python2

  • 服务端
#!/usr/bin/env python
# -*- coding:utf-8 -*-


from tornado.tcpserver import TCPServer
from tornado.ioloop import IOLoop


class Connection(object):
    clients = set()

    def __init__(self, stream, address):
        Connection.clients.add(self)
        self._stream = stream
        self._address = address
        self._stream.set_close_callback(self.on_close)
        self.read_message()
        print("A new user has entered the chat room.", address)

    def read_message(self):
        self._stream.read_until(b'\n', self.broadcast_messages)

    def broadcast_messages(self, data):
        print("User said:", data[:-1], self._address)
        for conn in Connection.clients:
            conn.send_message(data)
        self.read_message()

    def send_message(self, data):
        self._stream.write(data)

    def on_close(self):
        print("A user has left the chat room.", self._address)
        Connection.clients.remove(self)


class ChatServer(TCPServer):
    def handle_stream(self, stream, address):
        print("New connection :", address, stream)
        Connection(stream, address)
        print("connection num is:", len(Connection.clients))


if __name__ == '__main__':
    print("Server start ......")
    server = ChatServer()
    server.listen(8000)
    IOLoop.instance().start()
  • 客户端
HOST = '127.0.0.1'  # The remote host
PORT = 8000  # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

s.sendall('Hello, \nw')
time.sleep(5)
s.sendall('ord! \n')

data = s.recv(1024)

print('Received', repr(data))

time.sleep(60)
s.close()

参考:https://blog.csdn.net/JunChow520/article/details/103031041

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值