总目录:https://www.jianshu.com/p/e406a9bc93a9
Python - 子目录:https://www.jianshu.com/p/50b432cb9460
socket在某种意义上为我们封装好了tcp/udp,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。
Socket套接字
socket编程离不开的就是socket()函数。我们要使用这个函数来创建套接字对象。
语法
socket.socket([family[, type[, proto]]])
mily: 套接字家族可以使AF_UNIX或者AF_INET
type: 套接字类型可以根据是面向连接的还是非连接分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.
服务器端常用方法
服务端套接字绑定IP端口:bind()
服务端套接字监听:listen()
服务端监听套接字同意连接:accept()
客户端端常用方法
客户端套接字连接服务器:connect()
connect()的扩展版本,出错时返回出错码,而不是抛出异常:connect_ex()
公用方法
套接字发送消息:send()
套接字接受消息:recv()
套接字关闭连接:close()
完整发送TCP数据:sendall()
接收UDP数据:recvfrom()
发送UDP数据:sendto()
返回连接套接字的远程地址:getpeername()
返回套接字自己的地址:getsockname()
设置套接字操作的超时期:s.settimeout()
我们来看一个TCP实例:
server.py
# 导入 socket模块
import socket
# 创建 socket 对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port =8888
# 绑定端口号
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 建立客户端连接
clientsocket, addr = serversocket.accept()
print("连接地址: %s" %str(addr))
msg ='服务端发送的一条消息。' +"\r\n"
clientsocket.send(msg.encode('utf-8'))
msg = clientsocket.recv(1024)
print(msg.decode("utf-8"))
clientsocket.close()
client.py
# 导入 socket模块
import socket
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
# 设置端口号
port =8888
# 连接服务,指定主机和端口
s.connect((host, port))
# 接收小于 1024 字节的数据
msg = s.recv(1024)
s.send("客户端发来的消息。".encode('utf-8'))
s.close()
print (msg.decode('utf-8'))
UDP实例要简单一点
UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口:
s.bind(('127.0.0.1', 9999))
print('Bind UDP on 9999...')
while True:
# 接收数据:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
s.sendto(b'Hello, %s!' % data, addr)
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for datain [b'Michael', b'Tracy', b'Sarah']:
# 发送数据:
s.sendto(data, ('127.0.0.1', 9999))
# 接收数据:
print(s.recv(1024).decode('utf-8'))
s.close()