python使用socket模块进行网络编程

python标准库提供了socket 模块用于建立服务器与客户端,并且可以相互通信。

  1. 服务器端建立起一个socket对象,并等待客户端连接。

  2. 客户端使用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()

先运行服务器程序,再运行客户端程序,运行效果如下:
(左边是服务器收到的数据,右边是客户端发送和接收的数据)

posted @ 2020-08-22 16:16  aJream  阅读(48)  评论(0编辑  收藏  举报