python 編程之socket應用

? ? ? ? python中涉及到兩種套接字分別為AF_UNIX基于文件的和AF_INET基于網(wǎng)絡的,為支持ipv6還引入了AF_INET6,python2.5后引入了AF_NETLINK無連接。套接字讀端口的使用范圍是0- 5535,小于1024的端口默認為系統(tǒng)服務保留,linux、unix系統(tǒng)/etc/service文件中有對默認端口對應服務的映射表。

文件部分內(nèi)容如下:


service文件映射


socket可以分為面向連接的和無連接的,面向連接的又稱為流套接字,面向連接的套接字使用tcp協(xié)議,套接字類型為SOCK_STREAM,面向無連接的套接字,使用數(shù)據(jù)包形式進行通信,使用udp協(xié)議,套接字類型為SOCK_DGRAM。

PYTHON中實現(xiàn)網(wǎng)絡編程主要使用socket模塊,模塊中socket用來創(chuàng)建套接字,套接字使用自己的函數(shù)提供基于套接字的網(wǎng)絡通信。

socket()模塊函數(shù):

socket函數(shù)創(chuàng)建套接字語法如下:

socket(socket_family,socket_type,protocol=0)

socket_family:不是AF_VNIX就是AV_INET

socket_type:可以是SOCK_STREAM流方式,也可以是SOCK_DGRAM

PROTOCOL:一般不用填?

套接字的內(nèi)建方法較多主要分為3類服務端用的套接字函數(shù)、客戶端用的套接字函數(shù)、公共用途的套接字函數(shù)。

服務端使用的套接字函數(shù)如下:

s.bind() ? ?綁定地址(主機名、端口號)到套接字

s.listen() ?開始監(jiān)聽

s.accept() ?被動接收客戶端

客戶端套接字函數(shù)如下:

s.connect() ?主動初始化tcp服務連接

s.connect_ex() ? connect函數(shù)的擴展版本,出錯誤時返回錯誤碼,不返回異常消息

公共用途的套接字函數(shù)主要如下:

s.recv() ? 接受tcp數(shù)據(jù)

s.send() ? ?發(fā)送tcp數(shù)據(jù)

s.sendall() ? 完整發(fā)送tcp數(shù)據(jù)

s.recvfrom() ? ?接受udp數(shù)據(jù)。

s.sendto() ? ?發(fā)送udp數(shù)據(jù)

s.getpeername() ? 連接到當前套接字的遠端的地址(tcp連接)

s.getsockname() ? ?當前套接字地址

s.getsockopt() ? ?返回指定套接字的參數(shù)

s.setsockopt() ? ?設置指定套接字參數(shù)

s.close() ? ?關閉套接字

面向模塊的套接字函數(shù)如下:

s.setblocking() ? 設置套接字的阻塞與非阻塞模式

s.settimeout() ? ?設置套接字超時時間

s.gettimeout() ? ?獲取套接字超時時間

面向文件的套接字函數(shù)如下:

s.fileno() ? ?套接字文件描述

s.makefile() ? 創(chuàng)建一個與套接字關聯(lián)的文件對象


創(chuàng)建一個tcp服務器偽代碼如圖:


服務端偽代碼

服務端示例代碼如下:

''' ?#!/usr/bin/env python

from socket import *

from time import ctime

HOST=''

PORT=21567

BUFSIZE=1024

ADDR=(HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)

tcpSerSock.bind(ADDR)

tcpSerSock.listen(5)

while True:

print 'waiting for connectiong....'

tcpCliSock, addr = tcpSerSock.accept()

print '...connected from:', addr

while True:

data = tcpCliSock.recv(BUFSIZE)

if not data:

break

tcpCliSock.send('[%s] %s' %s (ctime(), data))

tcpCliSock.close()

tcpSerSock.close() ?'''


?代碼運行后開啟端口監(jiān)聽,等待客戶端連接,如下圖:


服務端代碼運行效果

創(chuàng)建一個客戶端代碼連接服務端,代碼如下:

#!/usr/bin/env python

from socket import *

HOST='127.0.0.1'

PORT=21567

BUFSIZE=1024

ADDR=(HOST, PORT)

tcpCliSock = socket(AF_INET, SOCK_STREAM)

tcpCliSock.connect(ADDR)

while True:

data = raw_input('please input >')

if not data:

break

tcpCliSock.send(data)

data = tcpCliSock.recv(BUFSIZE)

if not data:

break

print data

tcpCliSock.close()

運行效果如圖:


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • socket通信原理 socket又被叫做套接字,它就像連接到兩端的插座孔一樣,通過建立管道,將兩個不同的進程之間...
    jiodg45閱讀 1,227評論 0 1
  • 1三個相關數(shù)據(jù)結(jié)構. 關于socket的創(chuàng)建,首先需要分析socket這個結(jié)構體,這是整個的核心。 104 str...
    ice_camel閱讀 2,949評論 1 8
  • 代碼不好排版,可以到微信訂閱號(xuanhun521)查看原文。 Python黑帽編程2.8套接字編程 套接字編程...
    玄魂閱讀 696評論 1 2
  • 最近在學習Python看了一篇文章寫得不錯,是在腳本之家里的,原文如下,很有幫助: 一、網(wǎng)絡知識的一些介紹 soc...
    qtruip閱讀 2,840評論 0 6
  • RabbitMq是一個高級消息中間件,在高并發(fā)、實時性較強的消息處理中可以很好的解決性能問題,并且應用也比較成熟廣...
    Mooner_guo閱讀 1,926評論 0 2

友情鏈接更多精彩內(nèi)容