Python网络编程

1、socket()模块函数

要创建套接字,必须使用socket.socket()函数,它的语法如下:

1
socket(socket_family, socket_type, protocol = 0)

其中,socket_family是AF_UNIX(基于文件)或AF_INET(基于网络),socket_type是SCOKET_STREAM(TCP)或SOCKET_DGRAM(UDP)。

1
tcpSock = socket(AF_INET, SOCK_STREAM/SOCKET_DGRAM)

2、套接字对象方法

1、服务器套接字方法

tRd1X9.png

2、客户端套接字方法

tRdBXd.png

3、普通的套接字方法

名称                    描述
s.recv()            接受TCP消息
s.recv_into()        接受TCP消息到指定的缓冲区
s.send()            发送TCP消息
s.sendall()            完整的发送TCP消息
s.recvfrom()        接受UDP消息
s.recvfrom_into()    接受UDP消息到指定缓冲区
s.sendto()          发送UDP消息
s.getpeername()        连接到套接字(TCP)的远程地址
s.getsockname()        当前套接字地址
s.getsockopt()        返回给定套接字选项的值
s.setsockopt()        设置给定套接字选项的值
s.shutdown()        关闭连接
s.close()           关闭套接字
s.detach()            在未关闭文件描述符的情况下关闭套接字,返回文件描述符
s.ioctl()           控制套接字的模式(仅window)

4、面向阻塞的套接字方法

tRwoxe.png

5、面向文件的套接字方法

tR0Gi6.png

3、TCP

1、tcp服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from socket import *
from time import ctime

HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM) #创建TCP套接字
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept() #被动接受TCP客户端连接
print('...connected from:', addr)

while True:
data = tcpCliSock.recv(BUFSIZ).decode() #接受TCP消息
if not data:
break
#tcpCliSock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), data))
tcpCliSock.send(bytes(('[%s] %s' % (ctime(), data)).encode()))

tcpCliSock.close()
tcpSerSock.close()

tR0qlF.png

2、tcp客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from socket import *

HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR) #主动发起TCP服务器连接

while True:
data = input('> ')
if not data:
break
tcpCliSock.send(data.encode()) #发送TCP消息
data = tcpCliSock.recv(BUFSIZ).decode() #接受TCP消息
if not data:
break
print(data)

tcpCliSock.close()

tR0Ly4.png

4、UDP

1、udp服务端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from socket import *
from time import ctime

HOST = ''
PORT = 21568
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()
print('...connected from:', addr)

while True:
data = tcpCliSock.recv(BUFSIZ).decode()
if not data:
break
#tcpCliSock.send('[%s] %s' % (bytes(ctime(), 'utf-8'), data))
tcpCliSock.send(bytes(('[%s] %s' % (ctime(), data)).encode()))

tcpCliSock.close()
tcpSerSock.close()

tRsBjS.png

2、udp客户端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from socket import *

HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

udpCliSock = socket(AF_INET, SOCK_DGRAM)

while True:
data = input('> ')
if not data:
break
udpCliSock.sendto(data.encode(), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print (data.decode())

udpCliSock.close()

tRscAs.png