最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(三):socket網(wǎng)絡(luò)服務(wù)器

 更新時間:2014年06月09日 21:47:28   作者:  
服務(wù)器和客戶端程序很類似,上節(jié)學(xué)習(xí)了客戶端程序,這一節(jié)將仔細(xì)學(xué)習(xí)一下利用socket建立TCP服務(wù)器和UDP服務(wù)器

1、TCP連接的建立方法

客戶端在建立一個TCP連接時一般需要兩步,而服務(wù)器的這個過程需要四步,具體見下面的比較。

步驟 TCP客戶端 TCP服務(wù)器
第一步 建立socket對象  建立socket對象
第二步 調(diào)用connect()建立一個和服務(wù)器的連接 設(shè)置socket選項(可選)
第三步 綁定到一個端口(也可以是一個指定的網(wǎng)卡)
第四步 偵聽連接

下面具體來講這四步的建立方法:

第一步,建立socket對象:這里與客戶端一樣,依然是:

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

第二步,設(shè)置和得到socket選項

python定義了setsockopt()和getsockopt(),一個是設(shè)置選項,一個是得到設(shè)置。這里主要使用setsockopt(),具體結(jié)構(gòu)如下:

setsockopt(level,optname,value)

level定義了哪個選項將被使用。通常情況下是SOL_SOCKET,意思是正在使用的socket選項。它還可以通過設(shè)置一個特殊協(xié)議號碼來設(shè)置協(xié)議選項,然而對于一個給定的操作系統(tǒng),大多數(shù)協(xié)議選項都是明確的,所以為了簡便,它們很少用于為移動設(shè)備設(shè)計的應(yīng)用程序。

optname參數(shù)提供使用的特殊選項。關(guān)于可用選項的設(shè)置,會因為操作系統(tǒng)的不同而有少許不同。如果level選定了SOL_SOCKET,那么一些常用的選項見下表:

選項

意義

期望值

SO_BINDTODEVICE

可以使socket只在某個特殊的網(wǎng)絡(luò)接口(網(wǎng)卡)有效。也許不能是移動便攜設(shè)備

一個字符串給出設(shè)備的名稱或者一個空字符串返回默認(rèn)值

SO_BROADCAST

允許廣播地址發(fā)送和接收信息包。只對UDP有效。如何發(fā)送和接收廣播信息包

布爾型整數(shù)

SO_DONTROUTE

禁止通過路由器和網(wǎng)關(guān)往外發(fā)送信息包。這主要是為了安全而用在以太網(wǎng)上UDP通信的一種方法。不管目的地址使用什么IP地址,都可以防止數(shù)據(jù)離開本地網(wǎng)絡(luò)

布爾型整數(shù)

SO_KEEPALIVE

可以使TCP通信的信息包保持連續(xù)性。這些信息包可以在沒有信息傳輸?shù)臅r候,使通信的雙方確定連接是保持的

布爾型整數(shù)

SO_OOBINLINE

可以把收到的不正常數(shù)據(jù)看成是正常的數(shù)據(jù),也就是說會通過一個標(biāo)準(zhǔn)的對recv()的調(diào)用來接收這些數(shù)據(jù)

布爾型整數(shù)

SO_REUSEADDR

當(dāng)socket關(guān)閉后,本地端用于該socket的端口號立刻就可以被重用。通常來說,只有經(jīng)過系統(tǒng)定義一段時間后,才能被重用。

布爾型整數(shù)



本節(jié)在學(xué)習(xí)時,用到了SO_REUSEADDR選項,具體寫法是:

S.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) 這里value設(shè)置為1,表示將SO_REUSEADDR標(biāo)記為TRUE,操作系統(tǒng)會在服務(wù)器socket被關(guān)閉或服務(wù)器進(jìn)程終止后馬上釋放該服務(wù)器的端口,否則操作系統(tǒng)會保留幾分鐘該端口。

下面的方法可以幫助給出該系統(tǒng)下python所支持的socket選項列表:

復(fù)制代碼 代碼如下:

import socket
solist=[x for x in dir(socket) if x.startswith('SO_')]
solist.sort()
for x in solist:
    Print x

第三步:綁定socket

綁定即為服務(wù)器要求一個端口號。

S.bind((host,port)),其中host為服務(wù)器ip,通常為空,也可以綁定到一個特定的ip地址。Port為端口號。

第四步:偵聽連接。

利用listen()函數(shù)進(jìn)行偵聽連接。該函數(shù)只有一個參數(shù),其指明了在服務(wù)器實際處理連接的時候,允許有多少個未決(等待)的連接在隊列中等待。作為一個約定,很多人設(shè)置為5。如:s.listen(5)

2、簡單的TCP服務(wù)器實例
 
        這個建立一個簡單的TCP服務(wù)器和客戶端。

服務(wù)器端:TCP響應(yīng)服務(wù)器,當(dāng)與客戶端建立連接后,服務(wù)器顯示客戶端ip和端口,同時將接收的客戶端信息和'I get it!'傳給客戶端,此時等待輸入一個新的信息傳給客戶端。

客戶端:TCP客戶端,首先輸入服務(wù)器ip地址,然后輸入信息,回車后會得到服務(wù)器返回信息,然后等待服務(wù)器向其發(fā)送信息后退出。

具體代碼如下:
服務(wù)器端:tcpserver.py

復(fù)制代碼 代碼如下:

# -*- coding: cp936 -*-
##tcp響應(yīng)服務(wù)器,當(dāng)與客戶端建立連接后,服務(wù)器顯示客戶端ip和端口,同時將接收的客戶端信息和'I get it!'傳給客戶端,此時等待輸入一個新的信息傳給客戶端。
##@小五義
import socket,traceback
host=''
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(1)

while 1:
    try:
        clientsock,clientaddr=s.accept()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()
        continue
    try:
        print "連接來自:",clientsock.getpeername()
        while 1:
            data=clientsock.recv(4096)
            if not len(data):
                break
            print clientsock.getpeername()[0]+':'+str(data)
            clientsock.sendall(data)
            clientsock.sendall("\nI get it!\n")
            t=raw_input('input the word:')
            clientsock.sendall(t)
    except (KeyboardInterrupt,SystemExit):
        raise
    except:
        traceback.print_exc()

    try:
        clientsock.close()
    except KeyboardInterrupt:
        raise
    except:
        traceback.print_exc()

客戶端:tcpclient.py

復(fù)制代碼 代碼如下:

# -*- coding: cp936 -*-
##tcp客戶端,首先輸入服務(wù)器ip地址,然后輸入信息,回車后會得到服務(wù)器返回信息,然后等待服務(wù)器向其發(fā)送信息后退出。
##@小五義
import socket,sys
port=12345
host=raw_input('輸入服務(wù)器ip:')
data=raw_input('輸入要發(fā)送的信息:')
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
    s.connect((host,port))
except:
    print '連接錯誤!'
s.send(data)
s.shutdown(1)
print '發(fā)送完成。'
while 1:
    buf=s.recv(4096)
    if not len(buf):
        break
    sys.stdout.write(buf)

執(zhí)行結(jié)果:

客戶端輸入hello,服務(wù)器端輸入ok,具體顯示結(jié)果是:

服務(wù)器端:

連接來自:('127.0.0.1',1945)
127.0.0.1:hello
Input the world:ok
客戶端:
輸入服務(wù)器ip:127.0.0.1
輸入要發(fā)送的信息:hello
發(fā)送完成。
hello
I get it!
ok

3、UDP服務(wù)器

UDP服務(wù)器建立與TCP相類似,具體比較如下:

步驟

UDP

TCP

第一步

建立socket對象

建立socket對象

第二步

設(shè)置socket選項

設(shè)置socket選項

第三步

綁定到一個端口

綁定到一個端口

第四步

Recvfrom()

偵聽連接listen


這里利用UDP建立一個時間服務(wù)器。

代碼如下:

服務(wù)器端;serverudp.py

復(fù)制代碼 代碼如下:

# -*- coding: cp936 -*-
##UDP服務(wù)器端,客戶端連接后,向其發(fā)送當(dāng)前時間
##@小五義
import socket,traceback,time,struct
host=''
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))

while 1:
    try:
        message,address=s.recvfrom(8192)
        secs=int(time.time())
        reply=struct.pack("!I",secs)
        s.sendto(reply,address)
    except (KeyboardInterrupt,SystemExit):
        raise
    except:
        traceback.print_exc()

客戶端:clientudp.py

復(fù)制代碼 代碼如下:

# -*- coding: cp936 -*-
##udp客戶端,向服務(wù)器發(fā)送一個空字符后,得到服務(wù)器返回時間
##@小五義
import socket,sys,struct,time
host=raw_input('輸入服務(wù)器地址:')
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('',(host,port))
print "等待回復(fù)……"
buf=s.recvfrom(2048)[0]
if len(buf)!=4:
    print "回復(fù)錯誤%d:%s"%(len(buf),buf)
    sys.exit(1)
secs=struct.unpack("!I",buf)[0]
print time.ctime(int(secs))

運行結(jié)果:

首先運行服務(wù)器端,然后運行客戶端。
C:\>python clientudp.py  ##clientudp.py程序存放在在c盤下
輸入服務(wù)器地址:127.0.0.1
等待回復(fù)……
Mon Aug 06 17:09:17 2012

相關(guān)文章

  • Python?通過colorama?設(shè)置控制臺、命令行輸出彩色文字

    Python?通過colorama?設(shè)置控制臺、命令行輸出彩色文字

    這篇文章主要介紹了Python?通過colorama?設(shè)置控制臺、命令行輸出彩色文字的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Django查詢優(yōu)化及ajax編碼格式原理解析

    Django查詢優(yōu)化及ajax編碼格式原理解析

    這篇文章主要介紹了Django查詢優(yōu)化及ajax編碼格式原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • python 安裝virtualenv和virtualenvwrapper的方法

    python 安裝virtualenv和virtualenvwrapper的方法

    下面小編就為大家?guī)硪黄猵ython 安裝virtualenv和virtualenvwrapper的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 深入淺析Python傳值與傳址

    深入淺析Python傳值與傳址

    這篇文章主要介紹了Python傳值與傳址的相關(guān)知識,包括傳值與傳址的區(qū)別介紹,需要的朋友可以參考下
    2018-07-07
  • 利用Python實現(xiàn)簡易計算器的示例代碼

    利用Python實現(xiàn)簡易計算器的示例代碼

    最近學(xué)習(xí)了字符串,運算符,條件語句,循環(huán)語句,我在想可以用我最近學(xué)的東西做什么? 看到運算我就想到了可以做一個簡易的計算器,感興趣的可以了解一下
    2022-11-11
  • pandas 如何保存數(shù)據(jù)到excel,csv

    pandas 如何保存數(shù)據(jù)到excel,csv

    這篇文章主要介紹了pandas 如何保存數(shù)據(jù)到excel,csv的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python高階函數(shù)與裝飾器函數(shù)的深入講解

    Python高階函數(shù)與裝飾器函數(shù)的深入講解

    這篇文章主要給大家介紹了關(guān)于Python高階函數(shù)與裝飾器函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Python開發(fā)之pip安裝及使用方法詳解

    Python開發(fā)之pip安裝及使用方法詳解

    這篇文章主要介紹了Python開發(fā)之pip安裝及使用方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python+Selenium定位不到元素常見原因及解決辦法(報:NoSuchElementException)

    Python+Selenium定位不到元素常見原因及解決辦法(報:NoSuchElementException)

    這篇文章主要介紹了Python+Selenium定位不到元素常見原因及解決辦法(報:NoSuchElementException),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • pytorch 求網(wǎng)絡(luò)模型參數(shù)實例

    pytorch 求網(wǎng)絡(luò)模型參數(shù)實例

    今天小編就為大家分享一篇pytorch 求網(wǎng)絡(luò)模型參數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

镇江市| 班玛县| 望江县| 辽源市| 寿光市| 株洲市| 珠海市| 平顶山市| 芦山县| 正安县| 湛江市| 宜城市| 松阳县| 新邵县| 龙江县| 肥乡县| 香格里拉县| 佳木斯市| 深州市| 贡觉县| 商南县| 湘潭县| 闻喜县| 泽普县| 高要市| 通辽市| 宜兰市| 饶平县| 宁武县| 从化市| 科技| 平昌县| 灵寿县| 洛阳市| 镇坪县| 确山县| 墨竹工卡县| 扶沟县| 开阳县| 佳木斯市| 绥阳县|