TCP:传输控制协议
tcp的特点:面向连接(打电话模型),可靠传输
tcp通信的三个步骤:
1.通信双方建立连接
2.收发收据
3.关闭连接
tcp客户端实现流程
"""TCP客户端实现流程 1. 创建一个tcp 客户端对象 2. 与服务端建立连接 3. 通过tcp socket 收发数据 4. 关闭连接 关闭udp """ import socket def main(): #1. 创建一个tcp 客户端对象 tcp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 2. 与服务端建立连接 # the address is a pair (host, port) # 元组 第一个元素是tcp服务端ip ,第二个元素是服务端的端口 server_addr=('192.168.44.79',8080) tcp_client_socket.connect(server_addr) #连接服务器connect # 3. 通过tcp socket 收发数据 #3.1 发送数据到服务端 send_data=input("请输入您要发送的数据:") tcp_client_socket.send(send_data.encode()) # 在linux中默认是utf-8编码 # 3.2 等待接收从服务端回传的消息 # (b'xc4xe3xd2xb2xbaxc3', None) # recv_data=tcp_client_socket.recvfrom(1024) # 每次最多接收1024字节 # b'good' recv_data=tcp_client_socket.recv(1024) # 每次最多接收1024字节 # 把字节串转为字符串 解码 data=recv_data.decode('gbk') print("接收到的数据:",data) # 4. 关闭连接 tcp_client_socket.close() if __name__ == '__main__': main() # alt+enter 快速修复
tcp服务端流程
"""tcp服务端创建流程 1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求 2. 绑定端口 3. server_socket开启监听,由主动连接模式变为被动接受模式 4. 等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信 5. 使用新创建的socket与客户端通信 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信 7. server_socket关闭,则不再接收新的客户端请求 """ import socket def main(): #1. 创建服务端的tcp socket : server_socket 用于监听客户端的请求 server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 复用同一个端口而不会提示端口被占用 ,解决当关闭的socket当处于time_out状态时, 也可立即使用端口 """ socket.setsockopt(level,option,value) :配置socket level:等级,对哪个等级操作(ip,tcp,udp,socket等级) option:设置哪个选项 socket.SO_REUSEADDR: 复用地址 value: True:表示复用,False,表示不复用 """ server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) # 提示:socket.setsockopt()方法要在 socket.bind()之前设置 #2.绑定端口 server_socket.bind(('',9999)) #3. server_socket开启监听,由主动连接模式变为被动接受模式 server_socket.listen(5) # backlog 积压未办之事,好比排队队列,用于设置排队队列排队人数的最大值 #4.等待接收客户端的请求, 一有连接,则立即响应,且创建一个与客户端对接的socket,用该socket与客户端通信 # new_sock: 新创建的socket,用该socket与客户端通信 # client_addr :客户端的地址 # 为多个客户端提供服务 while True: new_sock, client_addr=server_socket.accept() print("有新的客户端请求,来自-->",client_addr) # 5.使用新创建的socket与客户端通信 # 为同一客户端提供多次服务 while True: # 5.1 接收客户端的请求数据 # 当客户端的socket调用了close后,则会向服务端发送0长度的信息,且服务端解阻塞 recv_data=new_sock.recv(1024) if recv_data: print("接收到的数据:",recv_data.decode('gbk')) #5.2 回复数据给客户端 new_sock.send("欢迎光临".encode()) else: print("客户端已经下线...") break # 6. 关闭新创建的socket, 该socket关闭,则与当前客户端结束通信 new_sock.close() # 7.server_socket关闭,则不再接收新的客户端请求 server_socket.close() if __name__ == '__main__': main()
小结:TCP与UDP的不同点:
1.面向连接
2.有序数据传输
3.重发丢失的数据包
4.舍弃重复的数据包
5.无差错的数据传输
6.阻塞/流量控制
TCP的三次握手与四次挥手