http://lib.csdn.net/article/computernetworks/21289 1、TCP連接的建立方法
客戶端在建立一個TCP連接時一般需要兩步,而服務(wù)器的這個過程需要四步,具體見下面的比較。
下面具體來講這四步的建立方法: 第一步,建立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,那么一些常用的選項見下表:
本節(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ù)器進程終止后馬上釋放該服務(wù)器的端口,否則操作系統(tǒng)會保留幾分鐘該端口。 下面的方法可以幫助給出該系統(tǒng)下python所支持的socket選項列表: 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ù)進行偵聽連接。該函數(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 # -*- coding: cp936 -*- ##tcp響應(yīng)服務(wù)器,當(dāng)與客戶端建立連接后,服務(wù)器顯示客戶端ip和端口,同時將接收的客戶端信息和'I get it!'傳給客戶端,此時等待輸入一個新的信息傳給客戶端。 ##@小五義 http://www.cnblogs.com/xiaowuyi 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 # -*- coding: cp936 -*- ##tcp客戶端,首先輸入服務(wù)器ip地址,然后輸入信息,回車后會得到服務(wù)器返回信息,然后等待服務(wù)器向其發(fā)送信息后退出。 ##@小五義 http://www.cnblogs.com/xiaowuyi 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建立一個時間服務(wù)器。
代碼如下: 服務(wù)器端;serverudp.py # -*- coding: cp936 -*- ##UDP服務(wù)器端,客戶端連接后,向其發(fā)送當(dāng)前時間 ##@小五義 http://www.cnblogs.com/xiaowuyi 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 # -*- coding: cp936 -*- ##udp客戶端,向服務(wù)器發(fā)送一個空字符后,得到服務(wù)器返回時間 ##@小五義 http://www.cnblogs.com/xiaowuyi 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
本文轉(zhuǎn)載自: http://www.cnblogs.com/xiaowuyi,謝謝五義哥!! |
|