zoukankan      html  css  js  c++  java
  • Python3 socket模块

    目录

    socket函数

    函数原型:socket.socket([family[, type[, proto]]])

    参数

    例子

    Socket对象方法

    客户端和服务端实例

    服务端代码

    客户端代码

    recv方法接收完整数据


    socket函数

    函数原型:socket.socket([family[, type[, proto]]])

    参数

    • family

    socket.AF_INET

     

    IPv4(默认)
    socket.AF_INET6 IPv6
    socket.AF_UNIX 同一台机器进程间通信
    • type
    socket.SOCK_STREAM 流式socket,TCP (默认)
    socket.SOCK_DGRAM 数据报式socket,UDP
    socket.SOCK_RAW 原始套接字,支持ICMP、IGMP等网络报文,可以处理特殊的IPv4报文,可以构造IP头
    socket.SOCK_RDM 是一种可靠的UDP形式,保证交付数据报但不保证顺序
    socket.SOCK_SEQPACKET 可靠的连续数据包服务
    • protocol

    一般不填,默认为0

    例子

    实例化一个socket对象:s=socket.socket()

    Socket对象方法

    服务端
    s.bind((host,port)) 绑定地址(host,port)到套接字, 在AF_INET下,以元组(host,port)的形式表示地址,如s.bind(('',8888))。
    s.listen(backlog) 开启TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了
    s.accept() 被动接受TCP客户端连接,(阻塞式)等待连接的到来,返回(socket,address),address为元组
    客户端
    s.connect((host,port)) 主动连接到(host,port),如s.connect(('127.0.0.1',8888)),连接出错会抛出异常
    s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛出异常
    通用方法
    socket.gethostname() 获取主机名称
    s.send(string) 发送TCP数据,将string(byte类型)中的数据发送到连接的套接字,如s.send(b'Hello')
    s.sendall(string) 完整发送TCP数据,将string(byte类型)中的数据发送到连接的套接字,成功返回None,失败则抛出异常
    s.sendto(string,(host,port)) 发送UDP数据,将数据string(byte类型)发送到(host,port)
    s.recv(bufsize,flag) 接收TCP数据,返回byte字符串,bufsize指定要接收的最大数据量,flag=0x40时使用非阻塞模式
    s.recvfrom(bufsize) 接收UDP数据,与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址
    s.getpeername() 返回连接套接字的远程地址,返回值通常是元组(ipaddr,port)
    s.getsockname() 返回套接字自己的地址,通常是一个元组(ipaddr,port)
    s.setsockopt(level,optname,value) 设置给定套接字选项的值。
    s.getsockopt(level,optname[.buflen]) 返回套接字选项的值
    s.settimeout(timeout) 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。
    s.gettimeout() 返回当前超时期的值,单位是秒,如果没有设置超时期,则返回None
    s.fileno() 返回套接字的文件描述符
    s.setblocking(flag) 如果flag为0,则将套接字设为非阻塞模式,否则将套接字设为阻塞模式(默认值)。非阻塞模式下,如果调用recv()没有发现任何数据,或send()调用无法立即发送数据,那么将引起socket.error异常
    s.makefile() 创建一个与该套接字相关连的文件
    s.close() 关闭套接字

    客户端和服务端实例

    服务端代码

    import socket
    
    #实例化server对象
    server=socket.socket()
    
    #绑定本地8888端口
    server.bind(('',8888))
    
    #开启监听
    server.listen()
    print("Listening on 0.0.0.0:"+str(lport))
    
    while 1:
    	#阻塞,等待客户端连接
    	client,addr=server.accept()
    	print("Connected from",addr[0]+":"+str(addr[1]))
            #发送数据
    	client.send(b"Welcome PyServer!
    ")
    	#接收每次的输入,直到输入exit
    	while 1:
            #接收数据
    		rc=recv(2048)
    		print(rc.decode())
    		if rc==b'exit
    ':
    			client.close()
    			print("close",addr)
    			break
    		cmd=input()+'
    '
    		client.send(cmd.encode())
    		if cmd=='exit
    ':
    				break

    客户端代码

    import socket
    
    #实例化client对象
    client=socket.socket()
    
    #连接127.0.0.1:8888
    client.connect(('127.0.0.1',8888))
    
    #发送接收数据
    while 1:
    	print(recv(2048).decode())
    	cmd=input()+'
    '
    	client.send(cmd.encode())
    	if cmd=='exit
    ':
    		break
    client.close()

    recv方法接收完整数据

    • 基础数据法

    该方法发送一次数据关闭一次socket连接,再次发送需要重新建立连接,因此系统开销较大,效率较低。

    • 尾标识法

    该方法通过在数据结尾添加自定义标识符,当接收到该标识符后停止接收后面的数据,效率较高,但不能接收标识符之后的数据。

    • 负载长度法

    该方法在发送数据前先将数据长度发送到接收方,接收方接收指定长度的数据,效率较高,但有时候不能接收到完整数据。

    • 超时接收法

    该方法在接收数据超过指定时间后停止接受数据,效率较高,但网络差的情况接收数据不全。

    def recv_all(sock):
    	#接收一次输入的所有字符串
    	msg=b''
    	while 1:
            #设置超时时间
    		sock.settimeout(0.2)
    		try:
    			tmp=sock.recv(10240)
    			msg+=tmp
    			#print("recving:",tmp)
    		except:
    			break
    	return msg
  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302349.html
Copyright © 2011-2022 走看看