TCP
TCP :语言聊天,视频聊天,线下缓存视频,远程控制,发邮件
-
需要先建立连接,然后通信
-
占用连接、可靠(消息不会丢失)、面向连接实时性高、全双工的通信、慢
-
注意事项:
- 端口不能重名
- 必须先起服务端,在起客户段
-
建立连接 三次握手 全双工通信 SYN请求建立连接发送信息,ACK确认
-
思路:
- 客户段向服务器发送SYN请求
- 服务端向客户段回复ACK并发送SYN请求
- 客户段接受到请求之后
,在回复ACK表示建立连接 - 由socket源码中客户段的connect + 服务端的accept完成
-
-
断开连接 四次挥手
- 思路:
- 服务端向客户段发送FIN请求断开连接
- 客户段接受到请求后回复ACK确认
- 客户段向服务端发送FIN请求断开连接
- 服务端接受到请求后回复ACK并断开连接
- 由socket源码中客户端的close+服务端的clos完成的
- 思路:
-
# 服务端 import socket sk=socket.socket() sk.bind(('127.0.0.1',1321)) #申请操作系统的资源 sk.listen() #等着别人连接 #等待一个客户端连接 conn,addr=sk.accept() #conn里存储的是一个客户段和一个服务端连接的信息 conn.send(b'hello') #服务端对客户端说话用send msg=conn.recv(1024) #客户段跟服务端说话用recv print(msg) conn.close() #挥手断开连接 sk.close() #归还申请操作系统的资源 #客户段 import socket sk=socket.socket() sk.connect(('127.0.0.1',1321)) #绑定服务端方法地址,此处是元组 mag=sk.recv(1024) #接受信息 print(mag) sk.send(b'shoudao') #回信息 sk.close() #关闭对话
-
tcp server端与多个client端连接,发送多条信息,发Q断开server端与client端连接
- 服务端
import socket #调用socket对象 sk=socket.socket() # 申请操作系统的资源 sk.bind(('127.0.0.1',7899)) # 等待客户端连接 sk.listen() while True: #可以与多个客户端建立连接 # 同意建立连接 conn,addr=sk.accept() print(conn) while True: #可以接受多个客户端信息 # 接受客户端信息 msg=conn.recv(1024).decode('utf-8') if msg.upper()=='Q':break print(msg) #向客户段发送信息 msg_seng=input('向客户端发送信息:') conn.send(msg_seng.encode('utf-8')) if msg_seng.upper() == 'Q': break # 挥手断开连接 conn.close() # 归还操作系统的资源 sk.close()
- 客户端
import socket #调用socket()对象 sk=socket.socket() # 绑定服务端方法地址,建立连接 sk.connect(('127.0.0.1',7899)) while True: # 向服务端发送信息 msg_seng=input('向服务端发送信息:') sk.send(msg_seng.encode('utf-8')) if msg_seng.upper() == 'Q': break # 接受服务端的信息 msg=sk.recv(1024).decode('utf-8') if msg.upper()=='Q':break print(msg) sk.close()
-
-
为什么建立连接是三次,断开连接是四次?
- 因为不确定在断开连接的时候数据时候全部发送完成,所以要发四次