计算机网络的基础知识不再叙述。
Python的socket包已经把网络连接的方式包装的非常好,涉及的报文握手等,都不需要自己再设计。
部分函数及功能
socket(family,type,[,protocal])
:构造socket对象。
family参数
-
AF_UNIX
:unix本机之间进行通信 -
AF_INET
:使用IPv4 -
AF_INET6
:使用IPv6
type参数 -
SOCK_STREAM
:TCP套接字 -
SOCK_DGRAM
:UDP套接字
s.bind(address)
:将socket对象s绑定到指定地址,地址以元组(host,port)形式表示。
s.listen(backlog)
:开始监听TCP连接,backlog指定在拒绝连接之前,可以刮起的最大连接数量。
s.accept()
:接受来自客户端的TCP连接请求,并返回元组(conn,address),其中conn是socket对象,address是客户端的地址。
s.connect(address)
:客户端向服务器发起连接请求,address为服务器地址和端口组的元组(hostname,port),如果连接出错,则返回socket.error错误。
s.connect_ex(address)
:功能与connect相同,但是成功返回0,失败返回error的值。
s.recv(bufsize[,flag])
:通过TCP接受字符串形式的数据,bufsize指定要接受的最大数据量,flag指定其他设置。
s.send(string[,flag])
:通过TCP发送string中的数据,返回实际发送的数据字节大小。
s.sendall(string[,flag])
:通过TCP尝试发送所有数据,成功返回None,失败则抛出异常。
s.recvfrom(bufsize[,flag])
:通过UDP接受数据,参数与recv()类似,返回值为元组(data,address),其中,data为接收的字符串数据,address是发送数据端的地址。
s.sendto(string[,flag],address)
:通过UDP发送数据string,address为数据接收端地址元组(host,port),返回值是发送的字节数。
s.close()
:关闭连接
下面展示示例
TCP服务器端
TCP的服务器端,需要通过bind()绑定address,方法listen()来设置最大监听数,accept()方法接受来自客户端的请求,send()方法向客户端发送string中的数据。
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip=socket.gethostname()
port=9999
s.bind((ip, port))
s.listen(5)
print( 'Wait for connecting..')
(conn, addr)=s.accept()
print('conn=',conn)
print('addr =',addr)
str1=conn.recv(1024)
str2=str(str1,encoding= 'utf 8')
print('I received a string is:',str2)
str3=str2.upper( )
conn.send(str3.encode( 'utf- 8'))
conn.close()
s.close( )
TCP客户端
TCP连接由以下过程组成:套接字的绑定,客户端向服务器端发出请求连接,接受服务器回复的确认报文,向服务器发送确认报文,以及接受服务器发来的信息,关闭TCP连接。
套接字的绑定由socket.socket()来实现,客户端向服务器发送请求连接, recv()接受来自服务器的字节流数据,send()则向服务器发送string中的数据,最后由close()函数,释放连接。
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip=socket.gethostname()
port=9999
s.connect((ip,port))
print('l am connecting the server! ')
str0='hello'
s.send(str0.encode('utf-8')) #发消息
str1=s.recv(1024)
str2=str(str1, encoding= 'utf 8')
print( 'The original string is:',str0, '\tthe processed string is:',str2)
s.close()
先打开服务器,然后再打开客户端。
UDP服务器端
UDP由于面向无连接,相对于TCP,只少了accept的函数。
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=socket.gethostname()
port=9999
s.bind((ip, port))
print( 'Wait for connecting..')
data,addr=s.recvfrom(1024)
print('Received from :',addr)
print('I received a string is:',data)
s.sendto('OK!'.encode('utf-8'),addr)
s.close( )
UDP客户端
UDP为面向无连接的连接方式,只需要尽最大努力的交付自己的任务,就不需要绑定地址。过程为用方法socket()绑定套接字,用sendto()方法,向服务器发送数据,用recvform()方法来接受服务器的消息,最后用方法close()释放连接。
import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
ip=socket.gethostname()
port=9999
print('l am connecting the server! ')
str0='hello'
s.sendto(str0.encode('utf-8'),(ip,port)) #发消息
data,addr=s.recvfrom(1024)
print('I received a string is:',data)
s.close()