python的socket模块_python模块:socket模块
1.Socket類型
socket(family,type[,protocal])???? 使用給定的地址族,套接字類型,協(xié)議編號(默認(rèn)是0)來創(chuàng)建套接字
socket類型
描述
socket.AF_UNIX
只能夠用于單一的Unix系統(tǒng)進(jìn)程間通信
socket.AF_INET
服務(wù)器之間網(wǎng)絡(luò)通信
socket.AF_INET6
IPv6
socket.SOCK_STREAM
流式socket , for TCP
socket.SOCK_DGRAM
數(shù)據(jù)報式socket , for UDP
socket.SOCK_RAW
原始套接字,普通的套接字無法處理ICMP、IGMP等網(wǎng)絡(luò)報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構(gòu)造IP頭.
socket.SOCK_SEQPACKET
可靠的連續(xù)數(shù)據(jù)包服務(wù)
創(chuàng)建UDP Socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.Socket函數(shù)
socket函數(shù)(服務(wù)器)
描述
s.bind(address)
將套接字綁定到地址,?在AF_INET下,以元組(host,port)的形式表示地址.
s.listen(backlog)
開始監(jiān)聽TCP傳入連接.backlog指定在拒絕連接之前,操作系統(tǒng)可以掛起的最大連接數(shù)量.該值至少為1,大部分應(yīng)用程序設(shè)為5就可以了.
s.accept()
接受TCP連接并返回(conn,address),其中conn是新的套接字對象,可以用來接收和發(fā)送數(shù)據(jù).address是連接客戶端的地址.
socket函數(shù)(客戶端)
s.connect(address)
連接到address處的套接字.一般address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤.
s.connect_ex(adddress)
功能與connect(address)相同,但是成功返回0,失敗返回errno的值.
公共socket函數(shù)
s.recv(bufsize[,flag])
接受TCP套接字的數(shù)據(jù).數(shù)據(jù)以字符串形式返回,bufsize指定要接收的最大數(shù)據(jù)量.flag提供有關(guān)消息的其他信息,通常可以忽略.
s.send(string[,flag])
發(fā)送TCP數(shù)據(jù).將string中的數(shù)據(jù)發(fā)送到連接的套接字.返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小.
s.sendall(string[,flag])
完整發(fā)送TCP數(shù)據(jù).將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會嘗試發(fā)送所有數(shù)據(jù).成功返回None,失敗則拋出異常.
s.close()
關(guān)閉套接字.
s.gettimeout()
返回當(dāng)前超時期的值,單位是秒,如果沒有設(shè)置超時期,則返回None.
s.fileno()
返回套接字的文件描述符.
s.makefile()
創(chuàng)建一個與該套接字相關(guān)連的文件
3.socket原理
TCP服務(wù)端:
(1).創(chuàng)建套接字,綁定套接字到本地IP與端口(socket.socket(socket.AF_INET,socket.SOCK_STREAM)?, s.bind())
(2).開始監(jiān)聽連接(s.listen())
(3).進(jìn)入循環(huán),不斷接受客戶端的連接請求(s.accept())
(4).然后接收傳來的數(shù)據(jù),并發(fā)送給對方數(shù)據(jù)(s.recv() , s.sendall())
(5).傳輸完畢后,關(guān)閉套接字(s.close())
TCP客戶端:
(1).創(chuàng)建套接字,連接遠(yuǎn)端地址(socket.socket(socket.AF_INET,socket.SOCK_STREAM)?, s.connect())
(2).連接后發(fā)送數(shù)據(jù)和接收數(shù)據(jù)(s.sendall(), s.recv())
(3).傳輸完畢后,關(guān)閉套接字(s.close())
4.例1:簡單實現(xiàn)socket通信
服務(wù)端:
[root@node1 python]# vim socket12.py
#!/bin/env python
#!-*- coding:UTF-8 -*-
import socket
s=socket.socket()
host=socket.gethostname()
port=1234
s.bind((host,port))
s.listen(5)
while True:
c,addr=s.accept()
print "Got connection from,addr"
c.send("Thank you for connection")
c.close()
[root@node1 python]# chmod? 755 socket12.py
[root@node1 python]# ./socket12.py
[root@node1 python]# netstat -antulp | grep 1234
tcp??????? 0????? 0 ? 0.0.0.0:1234?????????? 0.0.0.0:*?????????????????? LISTEN????? 31580/python
客戶端:
[root@node2 ~]# vim socket12.py
#!/bin/env python
#!-*- coding:UTF-8 -*-
import socket
s=socket.socket()
host='0.0.0.0'??????????? --服務(wù)端的IP地址
port=1234
s.connect((host,port))
print s.recv(1024)
[root@node2 ~]# chmod? 755 socket12.py
[root@node2 ~]# ./socket12.py
Thank you for connection
[root@node2 ~]#
此時服務(wù)端就會有數(shù)據(jù):
5.例2:利用socket協(xié)議在客戶端操作服務(wù)器
服務(wù)器端:
[root@node1 python]# cat socket2.py
#!/bin/env python
#!-*- coding:UTF-8 -*-
import socket
import commands
host=socket.gethostname()???? --服務(wù)器的主機(jī)名
port=1245??????????????????????????????? --啟動python腳本的端口
s=socket.socket()????????????????????? --實例一個socket對像
s.bind((host,port))???????????????????? --端口綁定到主機(jī)的IP地址
s.listen(5)????????????????????????????????? --允許多少個客戶端連接
while True:
conn,addr=s.accept()?????????? --接收客戶端的信息
print "Connect by",addr?????? --在服務(wù)端輸出客戶端的IP地址
while True:
data=conn.recv(1024)
cmd_status,cmd_result=commands.getstatusoutput(data)?? --獲取客戶端的命令
if len(cmd_result.strip()) == 0:
conn.sendall('Done.')
else:
conn.sendall(cmd_result)
conn.close()
[root@node1 python]# ./socket2.py
[root@node1 python]# netstat -antulp | grep python
tcp??????? 0????? 0? 0.0.0.0:1245?????????? 0.0.0.0:*?????????????????? LISTEN????? 2550/python
[root@node1 python]#
客戶端:
[root@node2 ~]# cat socket2.py
#!/bin/env python
#!-*- coding:UTF-8 -*-
import socket,commands
host='0.0.0.0'???????? --服務(wù)端的IP地址
port=1245
s=socket.socket()
s.connect((host,port))
while True:
cmd=raw_input("Please input cmd:")
s.sendall(cmd)
data=s.recv(1024)
print data
s.close()
[root@node2 ~]#?
總結(jié)
以上是生活随笔為你收集整理的python的socket模块_python模块:socket模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.7安装完密码是多少_关于
- 下一篇: php strpo函数,php strp