網(wǎng)絡(luò)
今天閱讀第二章的時(shí)候發(fā)現(xiàn)有一些網(wǎng)絡(luò)模塊很不熟悉缎谷,返回第一章好好閱讀了下socket模塊的簡(jiǎn)單應(yīng)用酒奶,然后百度了一些socket庫(kù)的使用說(shuō)明关摇,現(xiàn)在就記錄在這里
socket起源于Unix,而Unix/Linux基本哲學(xué)之一就是“一切皆文件”肆汹,對(duì)于文件用【打開(kāi)】【讀寫(xiě)】【關(guān)閉】模式來(lái)操作怕吴。socket就是該模式的一個(gè)實(shí)現(xiàn),socket即是一種特殊的文件县踢,一些socket函數(shù)就是對(duì)其進(jìn)行的操作(讀/寫(xiě)IO转绷、打開(kāi)、關(guān)閉)
基本上硼啤,Socket 是任何一種計(jì)算機(jī)網(wǎng)絡(luò)通訊中最基礎(chǔ)的內(nèi)容议经。例如當(dāng)你在瀏覽器地址欄中輸入 http://www.cnblogs.com/ 時(shí),你會(huì)打開(kāi)一個(gè)套接字,然后連接到 http://www.cnblogs.com/ 并讀取響應(yīng)的頁(yè)面然后然后顯示出來(lái)煞肾。而其他一些聊天客戶端如 gtalk 和 skype 也是類(lèi)似咧织。任何網(wǎng)絡(luò)通訊都是通過(guò) Socket 來(lái)完成的。
socket和file的區(qū)別:
1籍救、file模塊是針對(duì)某個(gè)指定文件進(jìn)行【打開(kāi)】【讀寫(xiě)】【關(guān)閉】
2习绢、socket模塊是針對(duì) 服務(wù)器端 和 客戶端Socket 進(jìn)行【打開(kāi)】【讀寫(xiě)】【關(guān)閉】
sk.bind(address)
s.bind(address) 將套接字綁定到地址。address地址的格式取決于地址族蝙昙。在AF_INET下闪萄,以元組(host,port)的形式表示地址。
sk.listen(backlog)
開(kāi)始監(jiān)聽(tīng)傳入連接奇颠。backlog指定在拒絕連接之前败去,可以掛起的最大連接數(shù)量。
backlog等于5烈拒,表示內(nèi)核已經(jīng)接到了連接請(qǐng)求圆裕,但服務(wù)器還沒(méi)有調(diào)用accept進(jìn)行處理的連接個(gè)數(shù)最大為5
這個(gè)值不能無(wú)限大,因?yàn)橐趦?nèi)核中維護(hù)連接隊(duì)列
sk.setblocking(bool)
是否阻塞(默認(rèn)True)荆几,如果設(shè)置False吓妆,那么accept和recv時(shí)一旦無(wú)數(shù)據(jù),則報(bào)錯(cuò)吨铸。
sk.accept()
接受連接并返回(conn,address),其中conn是新的套接字對(duì)象耿战,可以用來(lái)接收和發(fā)送數(shù)據(jù)。address是連接客戶端的地址焊傅。
接收TCP 客戶的連接(阻塞式)等待連接的到來(lái)
sk.connect(address)
連接到address處的套接字。一般狈涮,address的格式為元組(hostname,port),如果連接出錯(cuò)狐胎,返回socket.error錯(cuò)誤。
sk.connect_ex(address)
同上歌馍,只不過(guò)會(huì)有返回值握巢,連接成功時(shí)返回 0 ,連接失敗時(shí)候返回編碼松却,例如:10061
sk.close()
關(guān)閉套接字
sk.recv(bufsize[,flag])
接受套接字的數(shù)據(jù)暴浦。數(shù)據(jù)以字符串形式返回,bufsize指定最多可以接收的數(shù)量晓锻。flag提供有關(guān)消息的其他信息歌焦,通常可以忽略砚哆。
sk.recvfrom(bufsize[.flag])
與recv()類(lèi)似独撇,但返回值是(data,address)。其中data是包含接收數(shù)據(jù)的字符串,address是發(fā)送數(shù)據(jù)的套接字地址纷铣。
sk.send(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字卵史。返回值是要發(fā)送的字節(jié)數(shù)量,該數(shù)量可能小于string的字節(jié)大小搜立。即:可能未將指定內(nèi)容全部發(fā)送以躯。
sk.sendall(string[,flag])
將string中的數(shù)據(jù)發(fā)送到連接的套接字,但在返回之前會(huì)嘗試發(fā)送所有數(shù)據(jù)啄踊。成功返回None忧设,失敗則拋出異常。
內(nèi)部通過(guò)遞歸調(diào)用send社痛,將所有內(nèi)容發(fā)送出去见转。
sk.sendto(string[,flag],address)
將數(shù)據(jù)發(fā)送到套接字,address是形式為(ipaddr蒜哀,port)的元組斩箫,指定遠(yuǎn)程地址。返回值是發(fā)送的字節(jié)數(shù)撵儿。該函數(shù)主要用于UDP協(xié)議乘客。
sk.settimeout(timeout)
設(shè)置套接字操作的超時(shí)期,timeout是一個(gè)浮點(diǎn)數(shù)淀歇,單位是秒易核。值為None表示沒(méi)有超時(shí)期。一般浪默,超時(shí)期應(yīng)該在剛創(chuàng)建套接字時(shí)設(shè)置牡直,因?yàn)樗鼈兛赡苡糜谶B接的操作(如 client 連接最多等待5s )
sk.getpeername()
返回連接套接字的遠(yuǎn)程地址。返回值通常是元組(ipaddr,port)纳决。
sk.getsockname()
返回套接字自己的地址碰逸。通常是一個(gè)元組(ipaddr,port)
sk.fileno()
套接字的文件描述符
connect時(shí)需要指定socket的AF_FAMILY和端口類(lèi)別:
AF_INET、AF_INET6阔加、AF_LOCAL
SOCK_STREAM(TCP)饵史、SOCK_DGRAM(UDP)、SOCK_RAW胜榔、SOCK_PACKET胳喷、SOCK_SEQPACKET
指定IP地址和TCP端口,使用socket連接夭织,獲取服務(wù)的banner
s.connect(("192.168.x.xx",21))
ans = s.recv(1024)
prnt ans```
###threading模塊的應(yīng)用
threading提供了一個(gè)比thread模塊更高層的API來(lái)提供線程的并發(fā)性吭露。這些線程并發(fā)運(yùn)行并共享內(nèi)存。
一尊惰、Thread的使用 目標(biāo)函數(shù)可以實(shí)例化一個(gè)Thread對(duì)象奴饮,每個(gè)Thread對(duì)象代表著一個(gè)線程纬向,可以通過(guò)start()方法,開(kāi)始運(yùn)行戴卜。
這里對(duì)使用多線程并發(fā)逾条,和不適用多線程并發(fā)做了一個(gè)比較:
首先是不使用多線程的操作:
代碼如下:
!/usr/bin/python
compare for multi threads
import time
def worker():
print "worker"
time.sleep(1)
return
if name == "main":
for i in xrange(5):
worker()
執(zhí)行結(jié)果如下:
![image.png](http://upload-images.jianshu.io/upload_images/2616921-93d38c367bc3fa05.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面是使用多線程并發(fā)的操作:
代碼如下:
!/usr/bin/python
import threading
import time
def worker():
print "worker"
time.sleep(1)
return
for i in xrange(5):
t = threading.Thread(target=worker)
t.start()
![image.png](http://upload-images.jianshu.io/upload_images/2616921-c66ce962cab0e377.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以明顯看出使用了多線程并發(fā)的操作,花費(fèi)時(shí)間要短的很多投剥。
更詳細(xì)threading用法請(qǐng)見(jiàn)以下鏈接:
http://blog.chinaunix.net/uid-27571599-id-3484048.html