标签:ipa protoc 操作系统 eal cti 套接字 时间 大数 loop
1.Socket类型
套接字格式为:socket(family,type[,protocal]]),使用给定的地址族,套接字类型、协议编号来创建套接字
socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
socket.AF_INET 服务器之间网络通信
socket.AF_INNET6 IPv6
socket.SOCKET_STREAM 流式socket,用于TCP
socket.SOCK_RAW 原始套接字,普通的套接字无法理解ICMP,IGMP等网络报文,而SOCK_RAW可以,其次,SOCK_RAW也可以理解特殊的
Ipv4报文,利用原始套接字可以通过IP_HDRINCL套接字选项由用户构造IP头
创建TCP Socket s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP Socket s=socket.socket(socket.AF_INET,socket.SOck_DGRAM)
常用变成函数
服务端Socket函数 s.bind(address) 将套接字绑定到地址,在AF_INET下,以元组(host,port)的形式表示地址
s.listen(backlog) 开始监听TCP传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设置为5
s.accept() 接受TCP连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送消息,address是连接客户端的地址
客户端Socket函数
s.connect(address) 连接到address处的套接字。一般address的格式为元组(hostname,port) ,如果连接出错,返回socket.error错误
s.connect_ext(address) 功能与connect(address)相同,但成功返回0,失败返回error的值
公共Socket函数
s.recv(buflen,flage) :接受TCP套接字的数据,数据以字符形式返回,buflen指定要接收的最大数据量,flage提供有关消息的其他信息
s.send(string,flage) 发送TCP数据,将string中的数据发送到连接的套接字,返回值是要发送的字节数,该数量可能小于string的字节大小
s.sendall(string,flage) 完整发送TCP数据,将string中的数据发送到连接的套接字,但在返回之前会尝试发送所有数据,成功返回None,失败抛出一哦下行
s.recvfrom(buflen,flage) 接受UDP套接字的数据,与recv()类似,但返回值是(data,address).其中data 是包含接受数据的字符串,address是发送数据的套接字地址
s.sendto(string,flage,address) 发送UDP数据。将数据发送到套接字,address是形式为(ipadder,port)的元组,指定远程地址,返回值是发送的字节数
s.close() 关闭套接字
s.getpeername() 返回连接套接字的远程地址 。返回值通常是元组(ipadder,port)
s.getsockname() 返回套接字自己的地址,通常是一个元组(ipadder,port)
s.setsockopt(level,optname,value) 设置给定套接字选项的值
s.getsockopt() 返回套接字选项的值
s.settimeout(timeout) 设置套接字操作的超时时间,timeout是一个浮点数,单位是秒。值为None表示没有超时,一般超时应该在创建链接字
时设置,因为热他们可能会用于连接操作
s,setblocking(flage) 如果flage值为0,则将套接字设置为非阻塞模式,否则将设置为阻塞模式,默认是阻塞模式,在非阻塞模式下,如果调用方
recv()没有发现任何数据,或send()调用无法立即发送数据,将引起socket.error异常
TCP编程:面向连接的编程方式 消息可靠
服务端程序编写
1)创建Socket,绑定Socket到本地IP与端口
2)开始监听连接
3)进入循环,不断接收客户端的连接请求
4)接收传来的数据,并发送给对方数据
5)传输完成关闭Socket
import socket import threading import time # 第四步:接收传来的数据,并发送给对方数据 def dealClient(sock, addr): print(‘Accept new connection from %s:%s.....‘ % addr) sock.send(b‘Hello, I am server!‘) while True: data = sock.recv(1024) time.sleep(1) if not data or data.decode(‘utf-8‘) == ‘exit‘: break print(‘----->>%s!‘ % data.decode(‘utf-8‘)) sock.send(b‘Loop Msg: %s!‘ % data.decode(‘utf-8‘).encode(‘utf-8‘)) # 只能传送bytes # 第五部关闭Socket sock.close() print(‘Connection from %s:%s closed.‘ % addr) if __name__ == ‘__main__‘: # 第一步:创建一个基于IPv4和TCP协议的Socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind((‘127.0.0.1‘, 9999)) # 第二步:监听 s.listen(5) print(‘Waiting for connection......‘) while True: print(‘-----------------‘) # 第三步:接收一个新连接: sock, addr = s.accept() # 等待一个链接的到来,会一直等待 # 创建新线程来处理TCP连接 t = threading.Thread(target=dealClient, args=(sock, addr)) t.start()
客户端程序编写
1)创建Socket,连接远端地址
2)连接后发送数据和接收数据
3)传输完毕后,关闭Socket
import socket import time import random #初始化Socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #连接目标IP和端口 s.connect((‘127.0.0.1‘,9999)) time.sleep(random.random()) #接收消息 print(‘---->>‘,s.recv(1024).decode(‘utf-8‘))#没有消息就会一直等待,或者知道进程结束 #发送消息 s.send(b‘Hello,I am a client1‘) print(‘--->>‘,s.recv(1024).decode(‘utf-8‘)) s.send(b‘exit‘) #关闭Socket s.close()
UDP编程
服务器端
1)创建Socket, 绑定指定的IP和端口
2)直接发送数据和接收数据
3)关闭Socket
import socket # UDp服务进程 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((‘127.0.0.1‘, 9999)) print(‘Bind UDP om 9999....‘) while True: data, addr = s.recvfrom(1024) print(‘Message is %s‘ % data.decode(‘utf-8‘)) print(‘ Received from %s:%s‘ % addr) s.sendto(b‘Hello,%s!‘ % data, addr)
客户端
直接创建Socket 然后与服务器进行数据交换
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for data in [b‘Hello‘, b‘World‘]: s.sendto(data, (‘127.0.0.1‘, 9999)) print(s.recv(1024).decode(‘utf-8‘)) s.close()
标签:ipa protoc 操作系统 eal cti 套接字 时间 大数 loop
原文地址:http://www.cnblogs.com/09120912zhang/p/7601928.html