网络编程 06.26
1.TCP协议的三次握手和四次挥手
三次握手建立连接
在连接之前客户端和服务端都是处于关闭状态的。
- 客户端会向服务端发起一个请求,会有一个SYN报头,
- 服务端接收到客户端的请求后,给出响应,并且把SYN报头改装好后又返回给客户端,会带有ACK报头,
- 客户端开始进入建立连接状态,再发一条请求,请求带上ACK给服务端,让服务端也进入连接状态
四次挥手关闭连接
-
客户端会发送请求带上FIN报头给服务端说我够了,要断开连接
-
服务端接收到客户端的请求后,返回一个带有ACK报头的请求说确认了
FIN报头并没有返回
服务端此时可能在传输数据
3.服务端数据传输结束之后,服务端又会发送一次带有FIN的请求,告诉客 户端所有数据接收完毕,结束吧。
如果只有三次连接,客户端可能在第二次连接时死掉了,客户端压根没有收到没有收到第2,3次的数据传输,但是服务端是发送给你请求了
4.客户端像服务器一样进行一次确认,我收到了你中途发的数据。
2.基于TCP协议的套接字编程
#服务端.py
import socket
import time
#1.符合TCP协议的手机
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print(server)
#2.绑定手机号
server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
server.bind(('127.0.0.1',8000))
server.listen(5) #半连接池
#3.等待客户端连接
print('start...')
conn,client_addr = server.accept()
print(conn)
print(client_addr)
#4.收到消息
data = conn.recv(1024)
print(data)
#5.回消息
conn.send(data.upper())
#6挂断连接
time.sleep(500)
conn.close()
#7关机
server.close()
#客户端.py
import socket
import time
#1.创建符合TCP协议的手机
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#2.拨号
client.connect(('127.0.0.1',8000))
#3.收/发信息
client.send('hello',encode('utf8'))
data = client.recv(1024)
print(data)
#4.关闭
time.sleep(500)
client.close()
#服务端.py
import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
print('start...')
while True:
conn,client_addr = phone.accept()
print('连接建立成功',client_addr)
while True:
try:
data = conn.recv(1024)
print(data)
conn.send(data.upper())
except ConnectionAbortedError:
continue
except ConnectionResetError:
break
#客户端1.py
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
while True:
msg = input('please your msg')
client.send(msg.encode('utf8'))
data = client.recv(1024)
print(data)
#客户端2.py
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8000))
while True:
msg = input('please your msg')
client.send(msg.encode('utf8'))
data = client.recv(1024)
print(data)

浙公网安备 33010602011771号