本文實例講述了Python簡單實現socket信息發送與監聽功能。分享給大家供大家參考,具體如下:
最近在研究boost C++庫,用于工作中處理大規模高并發TCP連接數據響應,想測試,也可以用boost::asio庫來寫,但不利于測試代碼的靈活修改。
于是就研究了一下python怎么做。學習過程中看到網上給出的代碼示例雖然很基礎易懂,對于python零基礎的人來說,完全可以稍微復雜些,配上一些注釋,就能更多掌握一些socket和python的基本語法知識。
于是根據我的使用需要,修改python的socket server和client的范例代碼如下:
server端(單線程)
# -*- coding: cp936 -*-'''''建立一個python server,監聽指定端口,如果該端口被遠程連接訪問,則獲取遠程連接,然后接收數據,并且做出相應反饋。'''if __name__=="__main__": import socket print "Server is starting" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('localhost', 8001)) #配置soket,綁定IP地址和端口號 sock.listen(5) #設置最大允許連接數,各連接和server的通信遵循FIFO原則 print "Server is listenting port 8001, with max connection 5" while True: #循環輪詢socket狀態,等待訪問 connection,address = sock.accept() try: connection.settimeout(50) #獲得一個連接,然后開始循環處理這個連接發送的信息 ''''' 如果server要同時處理多個連接,則下面的語句塊應該用多線程來處理, 否則server就始終在下面這個while語句塊里被第一個連接所占用, 無法去掃描其他新連接了,但多線程會影響代碼結構,所以記得在連接數大于1時 下面的語句要改為多線程即可。 ''' while True: buf = connection.recv(1024) print "Get value " +buf if buf == '1': print "send welcome" connection.send('welcome to server!') elif buf!='0': connection.send('please go out!') print "send refuse" else: print "close" break #退出連接監聽循環 except socket.timeout: #如果建立連接后,該連接在設定的時間內無數據發來,則time out print 'time out' print "closing one connection" #當一個連接監聽循環退出后,連接可以關掉 connection.close()client端,每隔3秒輪番發送不同的數據給server:
if __name__=="__main__": import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost', 8001)) import time flag = '1' while True: time.sleep(3) print 'send to server with value: '+ flag sock.send(flag) print sock.recv(1024) flag = (flag=='1') and '2' or '1' #change to another type of value each time sock.close()
新聞熱點
疑難解答