大家好,今天来为大家分享什么是socket编程的一些知识点,和一文带你了解Python的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP地址,协议,端口号来标识一个进程。端口号的范围为0~65535(用户端口号一般大于1024),协议有很多种,一般我们经常用到的就是TCP,IP,UDP。下面我们来详细了解下Socket吧。
因为要操作套接字,所以需要用到套接字模块,系统中自带的就很不错,下面我们来导入:
importsocket二、Socket基本用法1.建立一个简单的Socket连接
#创建Tcp/Ip套接字\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#流式Socket\n#创建Udp/Ip套接字\ns=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#数据报式Socket\nsocket.AF_UNIX#只能够用于单一的Unix系统进程间通信\nsocket.AF_INET6#只能够用于IPv6通信\nsocket.SOCK_RAW#原始套接字,可以处理ICMP、ARP等网络报文,其它的不行\nsocket.SOCK_SEQPACKET#可靠的连续数据包服务2.协议对应端口
应用程序FTPTFTPTELNETSMTPDNSHTTPSSHMYSQLPOP3MONGO\n端口21,20692325538022330611027017\n协议TCPUDPTCPTCPUDPTCPTCPTCPTCPTCP3.Socket函数
#创建Socket连接,比Connect更高级,可以自动解析不是数字的host地址,兼容IPv4和IPv6\nsocket.create_connection(address=('localhost',4320),timeout=4,source_address=('localhost',4320))#前后两个端口号一定要是一致,不然会报错\n\n#构建一对已连接的套接字对象,新创建的套接字都是不可继承的\nsocket.socketpair(family=socket.AF_INET,type=socket.SOCK_STREAM,proto=0)\n\n#从文件描述符获取到socket连接对象\nsocket.fromfd(fd=ab.fileno(),family=socket.AF_INET,type=socket.SOCK_STREAM,proto=0)\n\n#套接字对象的类型\nsocket.SocketType\n\n#返回套接字的5元组列表地址,支持IPV4/IPV6解析\nsocket.getaddrinfo(host='localhost',port=3453,family=socket.AF_INET,type=socket.SOCK_STREAM,proto=socket.IPPROTO_TCP,flags=0)\noutput:\n[(<AddressFamily.AF_INET:2>,<SocketKind.SOCK_STREAM:1>,6,'',('127.0.0.1',3453))]\n\n#获取主机名\nsocket.gethostname()\nsocket.getfqdn()\nsocket.getfqdn(socket.gethostname())\n\n#将主机名转化为IP地址\nsocket.gethostbyname('www.baidu.com')#不支持IPV6解析\nsocket.gethostbyname_ex('www.baidu.com')#返回三元组,(主机名,相同地址的其它可用主机名的列表,IPv4地址列表)\n\n#网络ip地址\nsocket.gethostbyname(socket.getfqdn(socket.gethostname()))\n\n#将ip地址转化为主机名,返回三元组(主机名,相同地址的其它可用主机名的列表,IPv4地址列表),支持IPV4/IPV6\nsocket.gethostbyaddr('192.168.1.4')\n\n#解析主机名或者IP地址\nsocket.getnameinfo(('192.168.1.4',5434),0)\n\n#判断是否支持IPV6\nsocket.has_ipv6\n\n#返回服务所使用的端口号\nsocket.getservbyname('https','tcp')#第一个参数为服务协议:Https,Http;第二个为传输协议:TcpUdp\n\n#返回端口所对应的服务\nsocket.getservbyport(443,'tcp')\n\n#设置主机名(仅限于Unix)\nsocket.sethostname(name)\n\n#返回网卡信息的列表(仅限于Unix)\nsocket.if_nameindex()\n\n#32位字节存储Ip地址(序列化)\nsocket.inet_aton('127.0.0.1')\n\n#将32位字节转化为Ip地址(反序列化)\nsocket.inet_ntoa(b'\\x7f\\x00\\x00\\x01')4.套接字函数1).服务器端函数
s.bind((host,port))#将地址绑定到套接字,以(host,port)的元祖形式\ns.listen(num)#建立最多num个连接,最好别太大\ns.accept()#等待并接受客户端的连接,返回新的套接字对象和(host,port)元祖2).客户端函数
s.connect((host,port))#建立与服务器的连接,以(host,port)的元祖形式\ns.connect_ex((host,port))#和上面的功能差不多,只是出错了不抛异常,只是返回出错码3).通用函数
\ns.recv(size,flag)#接收最多size个大小的数据,flag可以忽略,返回值为数据是字符串形式\ns.send(str,flag)#发送str数据,返回值是要发送的字节数量,可能数据未全部发送\ns.sendall(str,flag)#发送全部str数据,成功返回None,失败则抛出异常\ns.recv(size,flag)#接受最多size个数据,并以字符串形式返回\ns.recvfrom(str,flag)#与recv相同,但是返回值是(接收数据的字符串,发送数据的套接字地址)的元祖形式\ns.sendto(str,flag,address)#连接到当前套接字的远程地址。返回值是发送的字节数,主要用于UDP\ns.getpeername()#返回连接套接字的远程地址。返回值通常是元组(host,port)\ns.getsockname()#返回套接字自己的地址。通常是一个元组(host,port)\ns.setsockopt(level,optname,value)#设置给定套接字选项的值。\n#假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过TIME_WAIT的过程之后才能使用;为了实现端口的马上复用,可以选择setsocket()函数来达到目的。\n#level:选项定义的层次。支持SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。\n#optname:需设置的选项。SO_REUSEADDRSO_REUSEPORT\n#value:设置选项的值。\ns.getsockopt(level,optname,buflen)#返回套接字选项的值。buflen:缓存长度\ns.settimeout(time)#设置socket连接超时时间,单位为秒,超时一般在刚创建套接字时设置\ns.gettimeout()#返回当前超时的时间,单位是秒,如果没有设置超时,则返回None。\ns.close()#关闭套接字\ns.fileno()#套接字的文件描述符\ns.shutdown(how)#关闭连接一边或两边\ns.setblocking(bool)#是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。\ns.makefile()#创建一个与该套接字相关联的文件5.一个简单的客户端与服务端交互Server.py
importsocket\ns=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#创建socket对象\ns.bind(('127.0.0.1',4323))#绑定地址\ns.listen(5)#建立5个监听\nwhileTrue:\nconn,addr=s.accept()#等待客户端连接\nprint('欢迎{}'.format(addr))#打印访问的用户信息\nwhileTrue:\ndata=conn.recv(1024)\ndt=data.decode('utf-8')#接收一个1024字节的数据\nprint('收到:',dt)\naa=input('服务器发出:')\nifaa=='quit':\nconn.close()#关闭来自客户端的连接\ns.close()#关闭服务器端连接\nelse:\nconn.send(aa.encode('utf-8'))Client.py
\nimportsocket\nimportsys\nc=socket.socket()#创建socket对象\nc.connect(('127.0.0.1',4323))#建立连接\nwhileTrue:\nab=input('客户端发出:')\nifab=='quit':\nc.close()#关闭客户端连接\nsys.exit(0)\nelse:\nc.send(ab.encode('utf-8'))#发送数据\ndata=c.recv(1024)#接收一个1024字节的数据\nprint('收到:',data.decode('utf-8'))
可以看到我们实现了一个全双工的Tcp/Ip聊天工具,对于服务器和客户端来说,均可收发文件。
Python中的socket编程难度不大,不过你要想写好的Socket也不容易,希望本文能让大家受益匪浅,毕竟小编可是把绝大多数经常用到的Api的功能都展示了。
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。
关于什么是socket编程的内容到此结束,希望对大家有所帮助。