日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python套接字socket的作用_【学习笔记】python实现的套接字socket

發(fā)布時間:2025/5/22 python 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python套接字socket的作用_【学习笔记】python实现的套接字socket 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

#############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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。