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