网络通信是计算机之间的进程之间的通信。
Socket又称"套接字"是网络编程的一个抽象概念。应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
TCP编程:TCP连接创建是双向通道,客户端与服务端都可以给对方发送数据。
创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务端。
创建一个TCP的Socket连接:
用socket(family,type)创建套接字获得socket对象。
family一般有两种AF_INET(默认)与AF_INET6 。type:SOCK_STREAM(默认)面向连接。SOCK_DGRAM面向非连接
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
建立连接
s.connect((IP地址,端口号))
其中,AF_INET表示的是指定使用IPv4协议,IPv6为AF_INET6。SOCK_STREAM指定使用面向刘的TCP协议。
当客户端发起连接时,除了IP地址外,还需要端口号。某一些服务的端口号有一些标准。如,80分配给Web服务作为标准端口(HTTP的端口),21分配给FTP服务作为标准端口,25分配给SMTP服务作为标准端口(简单邮件传输协议)。端口号从0到1023,这些端口号一般固定分配给一些服务。端口号从1024到65535,这些端口号一般不固定分配给某个服务,许多服务都可以使用这些端口。
socket对象的一些方法:
服务端套接字:
bind() 将套接字绑定到地址。 在AF_INET下,以元组(IP,port)的形式表示地址
listen([backlog]) 开始TCP监听。backlog指定最多可以监听的链接数量。值至少为1。
accept() 函数用于面向连接的套接字类型。accept()将从连接请求队列中获得连接信息(客户端地址),创建新的套接字,并返回该套接字的描述符。accept返回的是一个新套接字描述符,客户端可以通过这个描述符和服务器通信,而最初通过socket创建的套接字描述符依然用于监听客户端请求。
客户端套接字:
connect(address) 将套接字连接到远程地址。地址形式为(IP,port)。如果连接出错,返回socket.error错误。
connect_ex( ) 类似于connect() 出错时返回出错码,而不是抛出异常
客户端服务端共有的方法:
recv([buffersize],[flag]) 从套接字接收TCP数据。buffersize指定要接收的最大数据量。当没有数据可用,阻塞,直到至少有一个字节是可用的或者远程端被关闭。当远程端被关闭并且所有数据被读取完毕时,返回空字符串。
recv_into(buffer,[nbytes,[flags]]) 将数据存储到缓冲区中,而不是创建一个新的字符串。从套接字接收缓冲区字节。如果没有指定buffersize或buffersize为0,则接收缓冲区最大可容字节数。
send(data,[flags]) 向套接字发送TCP数据。将String中的数据发送到连接的套接字。返回要发送的字节数量(可能小于len(data))。
sendall(data,[flags]) 向套接字发送TCP数据。会重复调用send(),直到发送完所有数据。如果发生错误,无法判断已经发送了多少数据。发送成功返回None。
recvform(buffersize,[flags]) 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
recvfrom_into(buffer,[nbytes],[flags]) 类似于recv_into(),但也返回发送端的地址信息。
sendto(data,[flag],address) 向套接字发送UDP数据,类似于send(),但该方法允许指定目的地址(形式为(IP,port))。返回值是发送的字节数。
close() 关闭套接字。
getpeername() 返回连接套接字的远程地址。返回值为通常为元组形式(IP,port)
getsockname() 返回套接字本地地址。返回值为通常为元组形式(IP,port)
setsockopt(level,optname,value) 设置套接字选项的值。value可以是整数或字符串
getsockopt(level,optname[buffersize]) 返回套接字选项的值。如果给定了非零的buffersize参数,返回值是该长度的字符串。否则为整数。
settimeout([timeout]) 设置套接字操作的超时,timeout是一个浮点数,单位是秒。值为None表示禁用超时等效于setblocking(1)。timeout为0等效于setblock(0)。一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如connect())
gettimeout() 返回当前超时值,单位是秒,如果没有设置超时,则返回None。
fileno() 返回套接字的文件描述符。
setblocking([flags]) 如果flag为0/False,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值True/None)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常。
makefile() 创建一个与该套接字相关连的文件
shutdown(flag) 关闭套接字的读取端(flag==SHUT_RD)、套接字的写入端(flag==SHUT_WR)或者两端(flag==SHUT_RDWR)
share() 与另一个进程共享套接字。必须提供目标进程的id,并且将生成的字节对象传递给目标进程。这里的共享套接字实例可以通过调用socket.fromshare()获得。
detach() 关闭套接字对象但不关闭底层文件描述符。该方法被调用后无法使用套接字对象,但文件描述符可以用于其它用途。返回文件描述符。
服务器端工作流程:
(1)使用socket()创建socket
(2)使用bind()把创建的socket绑定到指定TCP端口
(3)调用listen()使socket处于监听状态。(监听其它客户端的连接)
(4)客户端发送请求后,调用accept()接受客户端请求,建立连接
(5)与客户端发送或接收数据
(6)通信完毕,关闭socket
客户端工作流程:
(1)使用socket()创建socket
(2)调用connect()向服务器端socket发起连接
(3)建立连接后,进行数据读写
(4)通信完毕,关闭socket