接上一篇,发现了只能收到回复后才能发送消息的问题,于是加入了多线程。并且将代码进行了优化。
服务端
- 调用模块
比之前多了多线程的模块
import socket
import threading
- 创建连接
和之前一样的,不多解释了
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen(5)
- 发消息
写成函数形式了
def send_msg():
while True:
try:
data_input = input('发送内容:').strip()
server.sendall(data_input.encode('utf-8'))
except ConnectionResetError:
return
- 收消息
def recv_msg():
while True:
try:
data = server.recv(1024).decode('utf-8')
except ConnectionResetError:
return
print(data)
- 主函数
if __name__ == '__main__':
while True:
server, addr = sock.accept()
t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()
t1.join()
t2.join()
- 完整代码
import socket
import threading
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', 8000))
sock.listen(5)
def send_msg():
while True:
try:
data_input = input('发送内容:').strip()
server.sendall(data_input.encode('utf-8'))
except ConnectionResetError:
return
def recv_msg():
while True:
try:
data = server.recv(1024).decode('utf-8')
except ConnectionResetError:
return
print(data)
if __name__ == '__main__':
while True:
server, addr = sock.accept()
t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()
t1.join()
t2.join()
客户端
- 调用模块
注意这里调用了msvcrt模块,也就是捕获键入
import socket
import threading
import msvcrt
- 创建连接
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
- 发消息
msvcrt 中的 getch() 方法 能够帮助在 Windows 下实现,其作用是获取一个按键响应并返回对应的字符。它并不在命令行中回显。这里利用 ord 将获得的字符转换为 ASCII 数值,这里捕获按键“esc”将得到数值27。注意linux要复杂一些。
def send_msg():
while True:
data_input = input('发送内容:').strip()
if ord(msvcrt.getch()) in [27]:
break
client.sendall(data_input.encode('utf-8'))
client.close()
- 收消息
def recv_msg():
while True:
data = client.recv(1024).decode()
print(data)
- 主函数
if __name__ == '__main__':
while True:
t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()
t1.join()
t2.join()
- 完整代码
import socket
import threading
import msvcrt
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
def send_msg():
while True:
data_input = input('发送内容:').strip()
if ord(msvcrt.getch()) in [27]:
break
client.sendall(data_input.encode('utf-8'))
client.close()
def recv_msg():
while True:
data = client.recv(1024).decode()
print(data)
if __name__ == '__main__':
while True:
t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()
t1.join()
t2.join()
- 这里发现了添加多线程后服务端收消息有延迟,有时候还会丢包,如果有大佬能指点一二感激不尽。
上一篇链接如下:
基础版聊天器