Python 学习笔记19

Socket 编程:

面向链接:TCP/IP 传输控制协议套接字类型为 SOCK_STREAM

无连接:UDP/IP用户数据报协议套接字类型为 SOCK_DGRAM

套接字指定了机器的地址和端口号。

Python目前在用套接字类型:

AF_UNIX 基于文件的 (其他系统可能是AF_LOCAL)

AF_INET 基于网络的

AF_NETLINK 用户代码与内核代码之间的 IPC 可以使用标准 BSD 套接字接口。

socket模块中提供了socket编程接口。

创建套接字 socket(socket_family,socket_type, protocol=0)

创建一个TCP/IP 的套接字,你要这样调用 socket.socket():

tcpSock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建一个UDP/IP 的套接字,你要这样:  

udpSock =socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

套接字对象的常用函数

函数                    描述

服务器端套接字函数

s.bind()            绑定地址(主机,端口号对)到套接字

s.listen()         开始 TCP 监听

s.accept()         被动接受 TCP 客户的连接,(阻塞式)等待连接的到来

客户端套接字函数

s.connect()        主动初始化 TCP 服务器连接

s.connect_ex()     connect()函数的扩展版本,出错时返回出错码,而不是抛异常

公共用途的套接字函数

s.recv()           接收 TCP 数据

s.send()          发送 TCP 数据

s.sendall()      完整发送 TCP 数据

s.recvfrom()   接收 UDP 数据

s.sendto()       发送 UDP 数据

s.getpeername() 连接到当前套接字的远端的地址

s.getsockname() 当前套接字的地址

s.getsockopt() 返回指定套接字的参数

s.setsockopt() 设置指定套接字的参数

s.close()      关闭套接字

Blocking-Oriented Socket Methods

s.setblocking()  设置套接字的阻塞与非阻塞模式

s.settimeout()      设置阻塞套接字操作的超时时间

s.gettimeout()      得到阻塞套接字操作的超时时间

面向文件的套接字的函数

s.fileno()       套接字的文件描述符

s.makefile()   创建一个与该套接字关连的文件

socket 模块属性  

属性名字                         描述

数据属性

AF_UNIX, AF_INET, AF_INET6  Python 支持的套接字家族

SO_STREAM, SO_DGRAM           套接字类型 (TCP = 流, UDP = 数据报)

has_ipv6                    表示是否支持 IPv6 的标志变量

异常

error                        套接字相关错误

herror                        主机和地址相关的错误

gaierror                      地址相关的错误

timeout                         超时

函数

socket()          用指定的地址家族,套接字类型和协议类型(可选)创建一个套接字对象

socketpair()     用指定的地址家族,套接字类型和协议类型(可选)创建一对套接字对象

fromfd()           用一个已经打开的文件描述符创建一个套接字对象

数据属性

ssl()                        在套接字初始化一个安全套接字层(SSL)。不做证书验证。

getaddrinfo()                 得到地址信息

getfqdn()                    返回完整的域的名字

gethostname()                得到当前主机名

TCP/IP Socket编程的简单例子:客户端向服务器端输入一个数学表达式,服务器计算该表达式并把结果返回给客户端。

服务器端代码:

from socket import *

from time import ctime

from sys import *

host='127.0.0.1'

port=21567

bufsiz=1024

addr=(host, port)

tcpSrvSock = socket(AF_INET,SOCK_STREAM)

tcpSrvSock.bind(addr)

tcpSrvSock.listen(5)

while True:

              print'wating for connection...'

              tcpHdlSock,addr=tcpSrvSock.accept()

              whileTrue:

                              data= tcpHdlSock.recv(bufsiz)

                             

                              ifnot data:

                                              sys.exit()

                              rslt=eval(data)

                              print('%s=%s' % (data ,rslt))

                              tcpHdlSock.send('[%s]:%s'%(ctime(),rslt))

              tcpHdlSock.close()

tcpSrvSock.close()        

客户端代码:

from socket import *

from time import ctime

import sys

host='127.0.0.1'

port=21567

bufsiz=1024

addr=(host, port)

cliSock = socket(AF_INET,SOCK_STREAM)

cliSock.connect(addr)

while True:

              data=raw_input('inputa mathmatic expression>')

              ifnot data:

                              break

              cliSock.send(data)

              rslt= cliSock.recv(bufsiz)

              ifnot rslt:

                              break

              print('%s=%s' % (data ,rslt))

cliSock.close()                 

UDP socket 编程的简单例子:服务器端接收客户端发来的文件并显示。

服务器端代码:

from socket import *

from sys import *

from time import *

host='127.0.0.1'

port=21567

addr=(host,port)

bufsiz=1024

srvSock=socket(AF_INET,SOCK_DGRAM)

srvSock.bind(addr)

while True:

              clntData,clntAddr=srvSock.recvfrom(bufsiz)

              if(not clntData):

                              break

              elifclntData == 'EOF':

                              srvSock.sendto('End',clntAddr)

                              break

              printclntData

              srvSock.sendto('Receivedat %s!' % (ctime()),clntAddr)

             

srvSock.close()

客户端代码:

from socket import *

from sys import *

host='127.0.0.1'

port=21567

addr=(host,port)

bufsiz=1024

clntSock=socket(AF_INET, SOCK_DGRAM)

srcFile=file('c:\\tst.txt','r')

fileTxt = ''

lines=srcFile.readlines()

while True:

              forfileTxt in lines:

                              clntSock.sendto(fileTxt,addr)

                              srvEcho,srvAddr = clntSock.recvfrom(bufsiz)

                  #if not srvEcho:

                              #             break

                              printsrvEcho

              break

clntSock.close()

猜你喜欢

转载自blog.csdn.net/z54572/article/details/69525338