2.5.3.1Python-TCP编程/UDP编程/socket套接字

总目录: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'))

server运行结构


client运行结果

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()


你可能感兴趣的:(2.5.3.1Python-TCP编程/UDP编程/socket套接字)