Python3.x:Socket网络编程

关于Socket网络编程,我们用到了库socket
socket可以在两台网络互通的电脑之间构建一个传输通道,实现两端的数据传输

建立一个socket必须有两个端,一个服务器端,一个客户端,一个等待请求,一个发送请求,至于其中的传输过程,可以自己定义

先来说下服务器端


Python3.x:Socket网络编程_第1张图片

然后是客户端


Python3.x:Socket网络编程_第2张图片

大致流程我们了解之后我们就可以尝试着建立一个链接了

服务器端(socket_server.py):

import socket

# 生成socket对象
server = socket.socket()

# 绑定ip和端口
server.bind(('localhost', 6666))

# 监听绑定的端口
server.listen()

# 方便识别打印一个我在等待
print("I'm waiting...")

# 这里用两个值接受,因为链接上之后使用的是客户端发来请求的这个实例
# 所以下面的传输要使用conn实例操作
conn, addr = server.accept()

# 接受数据并赋给data
data = conn.recv(1024)

# 打印收到数据
print('收到:', data)

# 发送我收到数据了
conn.send(b'I accpeted it')

# 关闭socket链接
server.close()

客户端(socket_client.py):

import socket

# 生成socket对象
client = socket.socket()

# 链接要链接的ip和port(端口)
client.connect(('localhost', 6666))

# 发送数据
client.send(b'hello world!')

# 接收数据
data = client.recv(1024)

# 打印接收到的数据
print('I accpeted it', data)

# 关闭socket链接
client.close()

运行一下试一试


Python3.x:Socket网络编程_第3张图片

Python3.x:Socket网络编程_第4张图片

这里需要注意的是

bind跟connect后的的地址格式取决于地址簇,这里在AF_INET下,所以以元组(host, port)的格式给出

python3传送的数据必须是bytes类型的,python2支持其他个别的数据类型

服务器端等待时要使用两个参数来接收返回值,因为服务器端链接客户端时使用的是客户端发来连接请求的这条线路

下面介绍一下socket库的主要方法:

socket.bind(address)
实例化生成的对象绑定到地址,address格式取决于地址簇,在AF_INET下,以元组(host, port)的形式表示地址

socket.listen(backlog)
开始监听传入链接,backlog指定在拒绝链接之前,可以挂起的最大链接数量

socket.setblocking(bool)
是否阻塞(默认True),如果设置False,那么accept和recv一旦无数据时就会报错

socket.accept()
接受连接并返回(conn,address),其中conn是新的连接对象,可以用来接收和发送数据。address是连接客户端的地址

接收TCP 客户的连接(阻塞式)等待连接的到来

socket.connect(address)
连接到address处,一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误

socket.connect_ex(address)
同上,只不过会有返回值,连接成功时返回 0 ,连接失败时候返回编码,例如:10061

socket.close()
关闭socket链接

socket.recv(bufsize[,flag])
接受传输的数据,数据以字符串形式返回,bufsize指定最多可以接收的数量,flag提供有关消息的其他信息,通常可以忽略

socket.recvfrom(bufsize[.flag])
与recv()类似,但返回值多一个address,也是使用两个参数接收,address是发送数据的对象的地址

socket.send(string[,flag])
将string中的数据发送到连接的对象。返回值是要发送的字节数量,该数量可能小于string的字节大小:可能未将指定内容全部发送

socket.sendall(string[,flag])
将string中的数据发送到连接的对象,但在返回之前会尝试发送所有数据,成功返回None,失败则抛出异常。

内部通过递归调用send,将所有内容发送出去

socket.sendto(string[,flag],address)
将数据发送到接收端,address是形式为(ipaddr,port)的元组,指定远程地址,返回值是发送的字节数,该函数主要用于UDP协议

socket.settimeout(timeout)
设置链接对象操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期,一般,超时期应该在刚创建socket对象时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

socket.getpeername()
返回连接远程对象的地址,通常是一个元组(ipaddr,port)

socket.getsockname()
返回自己的地址,通常是一个元组(ipaddr,port)

socket.fileno()
套接字的文件描述符

socket.sendfile(file, offset=0, count=None)
发送文件 ,不常用

转载请注明出处

python自学技术互助扣扣群:670402334

你可能感兴趣的:(Python3.x:Socket网络编程)