@
1.TCP是什么
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
2.代码实现
客户端
import socket
def main():
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host='127.0.0.1'
port=7897
addr=(host,port)
tcp_socket.bind(addr)
tcp_socket.connect(("127.0.0.1",7898))
#发送数据,接收数据
while True:
send_data = input("请输入:")
tcp_socket.send(send_data.encode("utf-8"))
recv_data = tcp_socket.recv(1024)
print("返回的数据是:%s" % recv_data.decode("utf-8"))
if send_data == "exit":
break
tcp_socket.close()
if __name__ == '__main__':
main()
接收端
import socket
def main():
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host=''
port=7898
addr=(host,port)
tcp_server_socket.bind(addr)
#相当于把手机设置为响铃模式,让默认的套接字由主动变为被动
tcp_server_socket.listen(128)
while True:
#相当于等待别人的电话到来
new_client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
#循环目的:为一个客户服务多次
while True:
# 接收客户端发过来的请求
recv_data = new_client_socket.recv(1024)
#如果recv堵塞,那么有两种办法
#1.客户端发送过来的数据
#2.客户端调用close
if recv_data:
print("客户端发过来的请求是:%s" % recv_data.decode("utf-8"))
# 回复一部分数据给客户端
new_client_socket.send("我已收到".encode("utf-8"))
else:
break
#关闭accept返回的套接字,相当于不给这个用户服务了
new_client_socket.close()
print("该用户已经服务完毕")
#关闭服务套接字,无法等待client到来
tcp_server_socket.close()
if __name__ == '__main__':
main()
注意
- 客户端必须要连接服务端
- 服务器端收到数据后可以返回部分数据给客户端
- new_client_socket,client_addr = tcp_server_socket.accept()表示,收到的东西是一个socket对象和一个ip地址
- 服务器端可以多次为客户端服务,为多个客户端服务