python的socket模块_python模块:socket模块
1.Socket類型
socket(family,type[,protocal])???? 使用給定的地址族,套接字類型,協議編號(默認是0)來創建套接字
socket類型
描述
socket.AF_UNIX
只能夠用于單一的Unix系統進程間通信
socket.AF_INET
服務器之間網絡通信
socket.AF_INET6
IPv6
socket.SOCK_STREAM
流式socket , for TCP
socket.SOCK_DGRAM
數據報式socket , for UDP
socket.SOCK_RAW
原始套接字,普通的套接字無法處理ICMP、IGMP等網絡報文,而SOCK_RAW可以;其次,SOCK_RAW也可以處理特殊的IPv4報文;此外,利用原始套接字,可以通過IP_HDRINCL套接字選項由用戶構造IP頭.
socket.SOCK_SEQPACKET
可靠的連續數據包服務
創建UDP Socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2.Socket函數
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_ex(adddress)
功能與connect(address)相同,但是成功返回0,失敗返回errno的值.
公共socket函數
s.recv(bufsize[,flag])
接受TCP套接字的數據.數據以字符串形式返回,bufsize指定要接收的最大數據量.flag提供有關消息的其他信息,通常可以忽略.
s.send(string[,flag])
發送TCP數據.將string中的數據發送到連接的套接字.返回值是要發送的字節數量,該數量可能小于string的字節大小.
s.sendall(string[,flag])
完整發送TCP數據.將string中的數據發送到連接的套接字,但在返回之前會嘗試發送所有數據.成功返回None,失敗則拋出異常.
s.close()
關閉套接字.
s.gettimeout()
返回當前超時期的值,單位是秒,如果沒有設置超時期,則返回None.
s.fileno()
返回套接字的文件描述符.
s.makefile()
創建一個與該套接字相關連的文件
3.socket原理
TCP服務端:
(1).創建套接字,綁定套接字到本地IP與端口(socket.socket(socket.AF_INET,socket.SOCK_STREAM)?, s.bind())
(2).開始監聽連接(s.listen())
(3).進入循環,不斷接受客戶端的連接請求(s.accept())
(4).然后接收傳來的數據,并發送給對方數據(s.recv() , s.sendall())
(5).傳輸完畢后,關閉套接字(s.close())
TCP客戶端:
(1).創建套接字,連接遠端地址(socket.socket(socket.AF_INET,socket.SOCK_STREAM)?, s.connect())
(2).連接后發送數據和接收數據(s.sendall(), s.recv())
(3).傳輸完畢后,關閉套接字(s.close())
4.例1:簡單實現socket通信
服務端:
[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'??????????? --服務端的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 ~]#
此時服務端就會有數據:
5.例2:利用socket協議在客戶端操作服務器
服務器端:
[root@node1 python]# cat socket2.py
#!/bin/env python
#!-*- coding:UTF-8 -*-
import socket
import commands
host=socket.gethostname()???? --服務器的主機名
port=1245??????????????????????????????? --啟動python腳本的端口
s=socket.socket()????????????????????? --實例一個socket對像
s.bind((host,port))???????????????????? --端口綁定到主機的IP地址
s.listen(5)????????????????????????????????? --允許多少個客戶端連接
while True:
conn,addr=s.accept()?????????? --接收客戶端的信息
print "Connect by",addr?????? --在服務端輸出客戶端的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'???????? --服務端的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 ~]#?
總結
以上是生活随笔為你收集整理的python的socket模块_python模块:socket模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.7安装完密码是多少_关于
- 下一篇: python登录豆瓣_python登录豆