python tcp聊天室
用tcp做聊天室
1.创建tcp服务
import socket
# 引入线程模块
import threading
# 创建
class TCPServer(threading.Thread):
"""tcp服务器"""
def __init__(self, port):
super().__init__()
# 1创建socket对象
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2设置端口地址复用
self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3绑定地址端口
self.tcp_server.bind(('192.168.52.1', port))
# 4设置被动
self.tcp_server.listen(128)
def run(self):
while True:
# 获取客户端发来的连接请求 得到客户端对象和地址
client, addr = self.tcp_server.accept()
# 开启一个线程 处理当前收到的客户端对象
HandleClient(client, addr).start()
def __del__(self):
print('服务器结束')
self.tcp_server.close()
```javascript
// An highlighted block
var foo = 'bar';
难点
这里解释一下为什么要开循环(while True) : tcp是一对一连接 , 当第一个用户(小A)向这个服务端发数据 , 那此时服务端会和这个小A建立一对一的连接 , 把这个小A扔到线程里(HandleClient)执行,此时就会立即进入第二次循环 服务器继续等待新用户 ……
2.处理客户端发来的数据(HandleClient) :
我们把每个客户的连接放到了线程 里,就可以同时1连接处多个客户 .
# 创建类
class HandleClient(threading.Thread):
def __init__(self, client, addr):
super().__init__()
self.client = client
self.addr = addr
def run(self):
while True:
# 1接收信息
data1 = self.client.recv(1024)
# 2解码
data2 = data1.decode('gbk')
print('收到来自%s的信息%s' % (self.addr, data2))
if not data2:
break
# 自动回复 把原数据返回
self.client.send(data1)
def __del__(self):
print('客户服务结束')
self.client.close()
1
这里只是案例,只把接收到的内容复制了回去.而且只做了tcp服务器 , 可以使用 网络调试助手测试 或者直接写一个 tcp客户端 进行测试
上面代码的完整版 ↓
# 引入socket模块
import socket
# 引入线程模块
import threading
# 创建
class TCPServer(threading.Thread):
"""tcp服务器"""
def __init__(self, port):
super().__init__()
# 1创建socket对象
self.tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2设置端口地址复用
self.tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 3绑定地址端口
self.tcp_server.bind(('192.168.52.1', port))
# 4设置被动
self.tcp_server.listen(128)
def run(self):
while True:
# 获取客户端发来的连接请求 得到客户端对象和地址
client, addr = self.tcp_server.accept()
# 开启一个线程 处理当前收到的客户端对象
HandleClient(client, addr).start()
def __del__(self):
print('服务器结束')
self.tcp_server.close()
class HandleClient(threading.Thread):
def __init__(self, client, addr):
super().__init__()
self.client = client
self.addr = addr
def run(self):
while True:
# 1接收信息
data1 = self.client.recv(1024)
# 2解码
data2 = data1.decode('gbk')
print('收到来自%s的信息%s' % (self.addr, data2))
if not data2:
break
# 自动回复 把原数据返回
self.client.send(data1)
def __del__(self):
print('客户服务结束')
self.client.close()
if __name__ == '__main__':
tcp_server = TCPServer(11000)
tcp_server.start()
线程不是同时执行,是同步执行线程-同步 ↩︎