基于TCP协议的套接字编程(简单)
- TCP又被称为流式协议,UDP被称为数据报协议(SOCK_DGRAM)
- 以打电话为例
服务端
import socket
# 1.买一个手机 代表符合TCP/UDP协议 代表使用TCP协议
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.绑定手机号, 也就是ip地址以及端口号,MAC地址会由ip地址解析
phone.bind(('127.0.0.1', 8080)) # 127.0.0.1就是本机ip地址
# 3.开机,半连接池,里面的参数是限制同时接受多少个半连接数
phone.listen(5)
# 4.等待电话打过来
print('wait...')
# 三次握手建立的双向连接,客户端的ip,端口号
conn, client_addr = phone.accept()
print(conn)
print(client_addr)
# 5.通信:收到信息
data = conn.recv(1024)
print(data)
# 6.回复信息
conn.send(data.upper())
# 7.挂电话
conn.close()
# 8.关机
phone.close()
客户端
import socket
# 1. 买手机
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.拨电话
phone.connect(('127.0.0.1', 8080))
# 3.通信,发信息
phone.send('hello'.encode('utf-8'))
# 4.通信,收信息
data = phone.recv(1024)
print(data)
# 5.关机
phone.close()
基于TCP协议的套接字编程(循环)
服务端
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.bind(('127.0.0.1', 8080))
phone.listen(5)
print('wait...')
while True: # 连接循环
conn, client_addr = phone.accept()
print(client_addr)
while True: # 通信循环
try:
data = conn.recv(1024)
if len(data) == 0: # 客户端单方断开连接,服务端就会接收到空数据
break
print(data)
conn.send(data.upper())
except ConnectionResetError:
break
客户端1
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8080))
while True:
msg = input('输入要发送的信息:>>>').strip()
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)
phone.close()
客户端2
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8080))
while True:
msg = input('输入要发送的信息:>>>').strip()
phone.send(msg.encode('utf-8'))
data = phone.recv(1024)
print(data)
phone.close()
补充:
listen(半连接数)
listen 是最大半连接数而不是连接数,半连接就是三次握手没有完成。
产生半连接的情况:
- 握了一次,服务器没来得及回复
- SYN攻击,客户端故意不进行第三次握手
在windows上,如果客户端异常断开,服务端报错,客户端正常退出,服务端一直接受空
如果是linux全是发空消息