hello,大家好,上一篇文章刚和大家讲解过UDP的多线程聊天器.今天再带童鞋们学习一下TCP的多线程聊天器.
TCP,是一种面向有连接的数据传输协议.它具有可靠传输的优点:
1.应答机制:TCP发送的每个报文段都必须得到接收方得应答才认为这个TCP报文段传输成功
2.超时重发:发送端发出一个报文段之后,就启动定时器,如果在定时时间内没有收到应答就重新发送这个报文段
3.错误校验:TCP会用一个校验的函数来检查数据是否有错误,在发送和接收的时候都会有校验
4.流量管控和防阻塞管理:流量控制用来避免主机因为消息发送过快而来不及完全接受
前几篇文章有TCP服务器的代码,今天咱们就加以修改,让这个程序变得更加完善
*******
提醒:咱们的代码都是在Linux系统下完成的,当你复制粘贴到windows系统下的时候可能会报错.
*******
# 1.导入模块
import socket
import threading
# 7.发送信息,和接收信息
# 需要注意点:send_msg(传入两个参数,一个是套接字,一个是IP和端口的元组)
def send_msg(tcp_client_socket, tcp_ip_port):
# 设置循环接收多条信息
while True:
# 8.接收消息(接收一个二进制内容)
tcp_data_socket = tcp_client_socket.recv(1024)
# 根据接收到的消息进行判断(当客户端断开连接时,会发送几次空白信息)
# 判断是否为空,如果不为空则往里执行,否则执行else
if tcp_data_socket:
try:
tcp_text = tcp_data_socket.decode()
except:
tcp_text = tcp_data_socket.decode("gbk")
print("接收到新消息 : ", tcp_ip_port, ":", tcp_text)
else:
print("接收到新消息 : ", tcp_ip_port, ":", tcp_text)
# 14.发送信息
# 使用套接字.send() 发送信息,需要编码哟
tcp_client_socket.send("test...测试TCP服务器反馈信息...test".encode())
else:
break
# 9.关闭套接字
tcp_client_socket.close()
def main():
# 2.创建TCP套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 3.设置端口重用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 4.绑定端口
tcp_server_socket.bind(("", 8080))
# 5.进行监听
tcp_server_socket.listen(128)
# 10.设置循环,可以连接多个客户端
while True:
# 6.accept()等待客户端连接
# accept() 返回两个元素,一个是套接字,一个是元组,元组内有(IP,端口)
tcp_client_socket, tcp_ip_port = tcp_server_socket.accept()
print("客户端已连接 : ", tcp_ip_port)
# 11.创建子线程
# 传递套接字和(IP,端口)到方法send_msg()中
t1 = threading.Thread(target=send_msg, args=(tcp_client_socket, tcp_ip_port))
# 12.设置线程守护
t1.setDaemon(True)
# 13.开始线程
t1.start()
if __name__ == '__main__':
main()
代码已经写好了,接下来运行咱们的代码,然后开启网络调试助手.
网络调试助手,将服务器的IP 和 端口都写好之后就可以开始测试了,
先提前运行服务器然后,服务器会进入阻塞状态,等待客户端的连接
客户端连接成功后,就可以开始互相发送信息,进行测试了
****************************
到这里咱们的代码包括测试以及完成了.
现在咱们的服务器,可以接受多个客户端的连接,同时能接收多个客户端的信息
非常感谢各位看官的支持.谢谢~~~❤
****************************
后续还会给大家更新更多的技术博客.