python使用socket模块进行网络编程
python标准库提供了socket
模块用于建立服务器与客户端,并且可以相互通信。
-
服务器端建立起一个socket对象,并等待客户端连接。
-
客户端使用socket对象与服务器连接,连接成功就可以进行相互通信(即传输数据)
socket模块的
socket
对象是socket网络编程的基础对象,其原型为:
socket(family, type, proto)
参数说明:
- family: 地址族,可选参数,默认为 AF_INET(IPv4), 也可以是AF_INET6或AF_UNIX;
- type: socket类型,可选参数,默认为 SOCK_STREAM(TCP协议),也可用 SOCKET_DGRAM(UDP协议)
- proto: 协议类型,可选参数,默认为0
socket对象主要有以下几个方法:
bind(address)
: 参数address是由IP地址和端口号构成的元组
,如果IP为空,则表示本机。该方法的作用,使socket与服务器地址相关联listen(backlog)
: 参数backlog指定在拒绝连接之前,操作系统允许它的最大挂起连接对象。最小值为0,大部分程序最多设置为5就够了。该方法的作用:将socket设置为服务器模式,之后就可以使用 accept 来等待客户端连接了accept()
: 等待客户端连接,并返回一个由 socket连接 和 客户端地址 组成的元组
close()
: 关闭socket, 停止本程序与服务器或客户端的连接recv(buffersize[,flag])
: 用于接收远程连接传来的信息,buffersize可以设定缓冲区的大小send(data[,flag])
: 向远程的连接发送信息,data应该是bytes类型的数据,其返回值为已传送的字节数
socket创建服务器流程
如下用TCP连接方式创建了一个服务器端程序
#创建服务器端程序
import socket
HOST = ''
PORT = 10888
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
conn, addr = s.accept()
print('客户端地址: ', addr)
while True:
data = conn.recv(1024)
if not data:
break
print('服务器收到的数据: ', data.decode('utf-8'))
conn.send(data)
conn.close()
由于还没有创建客户端,运行该程序会使得服务端一直处于等待客户端连接的状态,看不出效果
socket创建客户端程序
创建客户端程序比服务端简单,流程如下:
connect(address)
: 参数address是一个由主机名/IP和端口构成的元组
如下创建一个客户端程序:
#创建客户端程序
import socket
HOST = 'localhost'
PORT = 10888
s = socket.socket(socket.AF_INET, type= socket.SOCK_STREAM)
s.connect((HOST, PORT))
data = '你好'
while data:
s.sendall(data.encode('utf-8'))
data = s.recv(512)
print(f'服务器返回的数据: {data.decode("utf-8")}')
data = input('向服务器发送数据: ')
s.close()
先运行服务器程序,再运行客户端程序,运行效果如下:
(左边是服务器收到的数据,右边是客户端发送和接收的数据)
本文来自博客园,作者:aJream,转载请记得标明出处:https://www.cnblogs.com/ajream/p/15383555.html