网络通讯中,Socket是应用层与运输层中间的软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
下文出现的一些套接字属性:
s.bind() 绑定地址到套接字
s.listen() 开始TCP监听
s.accept() 被动接受TCP客户的连接
c.connect() 客户端主动初始化TCP服务器连接
s.recv() 接收TCP数据
s.send() 发送TCP数据
s.recvfrom() 接收UDP数据
s.sendto() 发送UDP数据
s.close() 关闭套接字
TCP 协议的服务器:
import socket
server = socket.socket() #使用TCP可以直接默认
ip = '127.0.0.1' #服务器的IP地址
port = 60000 #端口0-1023是系统保留的
address = (ip,port) #ip和port组成的地址
server.bind(address) #服务器此绑定地址
server.listen(5) #开始监听,设置最大半连接数为5
while True:
c,addr = server.accept() #接受连接请求
while True:
try:
#接受数据#
data = c.recv(1024).decode("utf-8") #接收数据并解码,1024为程序最大缓冲区容量
if not data:
print("client closed!")
c.close()
break
print(data)
#回复数据并将原始数据转为大写#
c.send(data.upper().encode("utf-8")) #转换完大写后进行编码
except ConnectionResetError: #保证服务器不会因客户端异常关闭而报错
print("客户端异常关闭!!")
c.close()
break
pass
TCP 协议的客户端:
import socket
client = socket.socket()
ip = '127.0.0.1'
port = 60000
address = (ip,port)
client.connect(address) #建立客户端与服务器的连接
while True:
msg = input('<q.退出>>>:') #等待输入数据
if not msg:
continue
if msg == 'q': #输入q时退出
c.close()
break
#发送数据#
client.send(msg.encode('utf-8'))
#接受数据#
data = client.recv(1024).decode('utf-8')
print(data)
UDP协议的服务器:
import socket
# 创建socket对象,指定type参数为socket.SOCK_DGRAM 表示使用UDP协议
server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip = '127.0.0.1'
port = 8888
address = (ip,port)
server.bind(address) # 绑定ip和端口
while True:
#接收#
msg,addr = server.recvfrom(1024)
print("收到来自%s: 说:%s" % (addr[0] ,msg.decode("utf-8")))
#发送#
server.sendto(msg.upper(),addr) #发送接收消息的大写给原地址
UDP协议的客户端:
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # datagram数据报的意思
ip = '127.0.0.1'
port = 8888
address = (ip,port) #服务器地址
while True:
msg = input(">>>:") #输入信息
client.sendto(msg.encode("utf-8"),address) #sendto需要给服务器地址
data,addr = client.recvfrom(1024) #recvfrom接收数据和地址
print(data.decode("utf-8"))
UDP与TCP的区别: 不需要监听,不需要接收,type参数为 SOCK_DGRAM。 UDP 可以同时处理多个客户端,TCP有半连接池的概念。