python套接字socket的作用_【学习笔记】python实现的套接字socket
#############2014.5.13 update##############
#更新了多進程服務(wù)端的bug:客戶端強行關(guān)閉會出錯#
#########################################
之前說要學學python,認真看看《python核心編程》這本書,因為當時手頭上的工作還沒結(jié)束,也就沒有怎么去看,這兩天剛好趕上五一,便有了幾天時間來看一下。
在了解了基本語法之后,我還是比較偏向于從網(wǎng)絡(luò)編程作為切入點來進一步學習一門語言。所以今天就寫一寫簡單的socket套結(jié)字的實現(xiàn)。
先來客戶端的代碼,因為之后服務(wù)端會有一些改進(SocketServer模塊),而客戶端基本就這樣了:)
作用:從鍵盤接收字符串并發(fā)給服務(wù)端,然后接收服務(wù)器發(fā)來的帶時間戳的回執(zhí)。
客戶端代碼
#!/usr/bin/env python
#coding=utf-8
#
# Author:xusongqi@live.com
#
# Created Time: 2014年04月30日 星期三 13時19分56秒
#
# FileName: tcp_sock_client.py
#
# Description: 單線程tcp套結(jié)字客戶端
from socket import *
HOST = 'localhost'#主機名
PORT = 21567#端口號,顯然要和客戶端的端口號保持一致
BUFSIZ = 1024#緩沖區(qū)大小設(shè)為1K
ADDR = (HOST, PORT)#地址為主機名和端口號組成的元組
tcp_sock_client = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM即選擇連接為tcp
tcp_sock_client.connect(ADDR)#使用connect函數(shù)進行連接
#循環(huán)發(fā)送與接收,從這句話看這個套結(jié)字是個長連接
while True:
data = raw_input('>')
if not data:#如果沒有寫入數(shù)據(jù),跳出循環(huán)并斷開連接
break
tcp_sock_client.send(data)#將數(shù)據(jù)發(fā)送到服務(wù)端
data = tcp_sock_client.recv(BUFSIZ)#接收從服務(wù)器發(fā)來的帶時間戳的返回信息
if not data:#如果從服務(wù)器收到的信息為空:跳出循環(huán)并斷開連接
break
print data#打印服務(wù)器發(fā)來的信息
tcp_sock_client.close()#斷開連接
阻塞式單線程的服務(wù)端
然后是服務(wù)端的,嗯,這是最簡單的一個服務(wù)端,前幾天寫的。
#!/usr/bin/env python
#coding=utf-8
#
# Author:xusongqi@live.com
#
# Created Time: 2014年04月21日 星期一 11時59分44秒
#
# FileName: tcp_sock_server.py
#
# Description: 單線程tcp套結(jié)字服務(wù)端
from socket import *
from time import ctime
HOST = ''#主機名為空,表示bind()可以綁定在所有的有效地址上
PORT = 21567#端口號要和客戶端一樣
BUFSIZ = 1024#緩沖區(qū),此處設(shè)為和客戶端一樣大小
ADDR = (HOST, PORT)#地址元組
tcp_sock_server = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM:使用tcp協(xié)議
tcp_sock_server.bind(ADDR)#bind()綁定地址元組,當前為綁定端口21567,允許所有訪問該端口的主機訪問服務(wù)端
tcp_sock_server.listen(5)#listen方法的參數(shù)指定了最大連接數(shù)
while True:#開啟服務(wù)器
print 'waiting for connection...'#啟動反饋
tcp_sock_client, addr = tcp_sock_server.accept()#新的描述符接收來訪的客戶
print '...connection from:',addr#接收反饋
while True:#死循環(huán)代表了長連接
data = tcp_sock_client.recv(BUFSIZ)#接收客戶端信息
if not data:#為空則斷開
break
tcp_sock_client.send('[%s]%s' % (ctime(), data))#返回帶時間戳的回執(zhí)
tcp_sock_client.close()#關(guān)閉客戶端描述符
tcp_sock_server.close()#關(guān)閉服務(wù)端描述符
好了,現(xiàn)在我們有了比較簡單的一對套接字,但是看起來弱爆了,因為它同時只支持一個用戶的訪問,并且還是阻塞式的.....
那么我們現(xiàn)在給它加點料~改成支持多用戶同時訪問的如何?這個看起來不錯。如果要支持多個用戶的同時訪問,就需要使用系統(tǒng)函數(shù)fork(),它被包含在os包里。
先上一個簡單的調(diào)用fork的例子:
#!/usr/bin/env python
import os
from time import sleep
pid=os.fork()
if not pid:
sleep(2)
print "world"
else:
print "hello"
sleep(3)
這個程序會fork一個子進程(pid返回0),然后父進程會打印hello并睡3秒,與此同時子進程會睡2秒然后打印world,于是屏幕上出現(xiàn):"hello world"。
好了有了fork函數(shù)我們就能寫出支持多用戶的具有多進程的服務(wù)端了,now,begin~
#!/usr/bin/env python
#coding=utf-8
#
# Author:xusongqi@live.com
#
# Created Time: 2014年04月30日 星期三 14時42分03秒
#
# FileName: tcp_sock_server_multi_thread.py
#
# Description:
from socket import *
from time import ctime
import os
import sys
HOST = ''#主機名為空,表示bind()可以綁定在所有的有效地址上
PORT = 21567#端口號要和客戶端一樣
BUFSIZ = 1024#緩沖區(qū),此處設(shè)為和客戶端一樣大小
ADDR = (HOST, PORT)#地址元組
tcp_sock_server = socket(AF_INET, SOCK_STREAM)#SOCK_STREAM:使用tcp協(xié)議
tcp_sock_server.bind(ADDR)#bind()綁定地址元組,當前為綁定端口21567,允許所有訪問該端口的主機訪問服務(wù)端
tcp_sock_server.listen(5)#listen方法的參數(shù)指定了最大連接數(shù)
"""開啟服務(wù)器"""
while True:
print 'waiting for connection...'#啟動反饋
tcp_sock_client, addr = tcp_sock_server.accept()#新的描述符接收來訪的客戶
print '...connection from:',addr#接收反饋
"""fork子進程"""
pid = os.fork()
if not pid:#pid=0:子進程
while True:#死循環(huán)代表了長連接
tcp_sock_server.close()#關(guān)閉服務(wù)端描述符
data = tcp_sock_client.recv(BUFSIZ)#接收客戶端信息
if not data:#為空則斷開
break
tcp_sock_client.send('[%s]%s' % (ctime(), data))#返回帶時間戳的回執(zhí)
tcp_sock_client.close()#關(guān)閉客戶端描述符
sys.exit(0)
else
tcp_sock_client.close()#關(guān)閉客戶端描述符
參考資料:
《python核心編程》
總結(jié)
以上是生活随笔為你收集整理的python套接字socket的作用_【学习笔记】python实现的套接字socket的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql主节点数据恢复_Mysql 主
- 下一篇: ibm java_IBM i 上Java