當前位置:首頁 » 編程語言 » python中socket

python中socket

發布時間: 2022-04-19 01:39:32

1. python 如何建立socket長連接

#coding=gbk
'''''
socket 給網路發送http請求

連接成功後,發送http的get請求,所搜索功能

'''
import socket
import sys
import time
if __name__=='__main__':
#創建套接字
try :
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.eorror,e:
print 'socket false:%s'%e
print 'socket ...'

#連接網路ip
try :
sock.connect(('220.181.111.148',80))
except socket.error,e:
print 'connect false %s'%e
sock.close()
print 'connect ...'

#發送網路首頁面請求並且保持連接
try :
print 'send start...'
str='GET / HTTP/1.1\r\nHost:www..com\r\nConnection:keep-alive\r\n\r\n'
sock.send(str)
except socket.eorror,e:
print 'send false'
sock.close()

data=''
data = sock.recv(1024)
while (1): '''''如何判斷數據接收完畢,在發送http 最前端,
包含發送數據文件大小屬性Content-Length,
用字元匹配方式取得文件大小,
同過大小判斷是否接收完畢。
'''
print data
beg = data.find('Content-Length:',0,len(data))
end = data.find('Content-Type:',0,len(data))
print beg
print end
if(beg == end):
print 'connecting closed'
break
num = long(data[beg+16:end-2])
print num
nums = 0
while (1):
data=sock.recv(1024)
print data
nums +=len(data)
if(nums >= num):
break
word = raw_input('please input your word----->')
str='''''GET /s?wd=''' + word + ''''' HTTP/1.1
Host:www..com
Connection: Keep-Alive

'''
print str
sock.send(str)
data = ''
data = sock.recv(1024)
sock.close()
print data

2. python獲取當前socket連接狀態,是連接還是斷開。

socket建立連接後,你可以在上面加一個超時,如果超時異常出現就是斷開了。
另外可以用select(inlist,writelist,errorlist,timeout)的辦法,去輪詢它。超過比如60秒,就認為它超時。
在操作系統層面,你可以用netstat
找到這個socket連接,看它的TCP狀態。如果到了CLOSE_WAIT,
TIME_WAIT,就是對方或者是自己關閉了。
如果是FIN2.。。。SEN。。或者是SYN_XXX就是還是連接或者是發送狀態中。
通常這些狀態在操作系統的TCP協議里都設置有超時。如果超時過了,它自己會關閉。然後變成WAIT狀態。

3. Python socket 如何實現廣播單播切換

#三個線程:#線程1:產生遞增的數字,轉成字元串放到隊列中#線程2:監聽埠,將產生的連接放到列表中#線程3:從隊列中取出數字,遍歷連接列表,發送到所有客戶端#線程1:產生遞增的數字,轉成字元串放到隊列中classProcer(threading.Thread):

def__init__(self,work_queue):
super().__init__()#必須調用
self.work_queue=work_queue

defrun(self):
#print("Beginproce...")
num=1
whileTrue:
self.work_queue.put(str(num))
num=num+1
time.sleep(1)#暫停1秒#線程2:監聽埠,將產生的連接放到列表中classSocketServer(threading.Thread):

def__init__(self,socket_list):
super().__init__()
self.socket_list=socket_list

defrun(self):
sock=socket.socket()
sock.bind(('',9090))
sock.listen(5)
print("Startlisten...")
whileTrue:
conn,addr=sock.accept()
print("Connectby",addr)
self.socket_list.append((conn,addr))#線程3:從隊列中取出數字,遍歷連接列表,發送到所有客戶端classPrinter(threading.Thread):

def__init__(self,work_queue,socket_list):
super().__init__()#必須調用
self.work_queue=work_queue
self.socket_list=socket_list

defrun(self):
whileTrue:
num=self.work_queue.get()#當隊列為空時,會阻塞,直到有數據
forsock,addrinself.socket_list:#遍歷保存連接的列表
print("Send",num,"To",addr)
try:
sock.sendall(bytes(num+' ','utf-8'))#把字元串轉換成位元組數組發送
except:
print("Disconnectby",addr)#如果連接斷開,發送會失敗
self.socket_list.remove((sock,addr))#從列表中刪除斷開的連接defmain():
work_queue=queue.Queue()
socket_list=[]#為了更安全可靠,從多線程訪問列表時應該加鎖,
#這里做了簡化,因為列表的增加刪除操作基本上可以認為是線程安全的

socket_server=SocketServer(socket_list)
socket_server.daemon=True
socket_server.start()

printer=Printer(work_queue,socket_list)
printer.daemon=True#當主線程退出時子線程也退出
printer.start()

procer=Procer(work_queue)
procer.daemon=True#當主線程退出時子線程也退出
procer.start()

time.sleep(1)#這里要暫停一下,否則執行下一條語句時,會因隊列為空而直接返回
work_queue.join()#主線程會停在這里,直到所有數字被get(),並且task_done(),因為沒有調用task_done(),所在這里會一直阻塞,直到用戶按^Cif__name__=='__main__':
main()

4. python如何使用socket來傳輸對象

importsocket
importstruct

sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect(('localhost',10000))

values=(1,'ab',2.7)
packer=struct.Struct('I2sf')
packed_data=packer.pack(*values)

try:
sock.sendall(packed_data)
finally:
sock.close()

有個模塊叫struct,可以自定義結構體,可以這樣發送代碼。

try:
importcPickleaspickle
except:
importpickle

classAA():
defa(self):
print"123"

ddd=AA()
data=pickle.mps(ddd)

還有個模塊叫pickle,可以打包任何python對象,打包的結果也可以拿到套接字里發。

5. python怎麼建立socket服務端

socket伺服器再細分可分為多種了,tcp,udp,websocket,都是調用socket模塊,但是具體實現起來有一點細微的差別

先給出一個tcp和udp通過socket協議實現的聊天室的例子

python聊天室(python2.7版本):

都是分別運行server.py和client.py,就可以進行通訊了。

TCP版本:

socket-tcp-server.py(服務端):

#-*-encoding:utf-8-*-
#socket.getaddrinfo(host,port,family=0,socktype=0,proto=0,flags=0)
#根據給定的參數host/port,相應的轉換成一個包含用於創建socket對象的五元組,
#參數host為域名,以字元串形式給出代表一個IPV4/IPV6地址或者None.
#參數port如果字元串形式就代表一個服務名,比如「http」"ftp""email"等,或者為數字,或者為None
#參數family為地主族,可以為AF_INET,AF_INET6,AF_UNIX.
#參數socktype可以為SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)
#參數proto通常為0可以直接忽略
#參數flags為AI_*的組合,比如AI_NUMERICHOST,它會影響函數的返回值
#附註:給參數host,port傳遞None時建立在C基礎,通過傳遞NULL。
#該函數返回一個五元組(family,socktype,proto,canonname,sockaddr),同時第五個參數sockaddr也是一個二元組(address,port)
#更多的方法及鏈接請訪問
#Echoserverprogram
fromsocketimport*
importsys
importthreading
fromtimeimportctime
fromtimeimportlocaltime
importtraceback
importtime
importsubprocess
reload(sys)
sys.setdefaultencoding("utf8")


HOST='127.0.0.1'
PORT=8555#設置偵聽埠
BUFSIZ=1024

classTcpServer():
def__init__(self):
self.ADDR=(HOST,PORT)
try:
self.sock=socket(AF_INET,SOCK_STREAM)
print'%disopen'%PORT

self.sock.bind(self.ADDR)
self.sock.listen(5)
#設置退出條件
self.STOP_CHAT=False

#所有監聽的客戶端
self.clients={}
self.thrs={}
self.stops=[]

exceptException,e:
print"%disdown"%PORT
returnFalse

defIsOpen(ip,port):

s=socket(AF_INET,SOCK_STREAM)
try:
s.connect((ip,int(port)))
#s.shutdown(2)
#利用shutdown()函數使socket雙向數據傳輸變為單向數據傳輸。shutdown()需要一個單獨的參數,
#該參數表示s了如何關閉socket。具體為:0表示禁止將來讀;1表示禁止將來寫;2表示禁止將來讀和寫。
print'%disopen'%port
returnTrue
except:
print'%disdown'%port
returnFalse

deflisten_client(self):
whilenotself.STOP_CHAT:
print(u'等待接入,偵聽埠:%d'%(PORT))
self.tcpClientSock,self.addr=self.sock.accept()
print(u'接受連接,客戶端地址:',self.addr)
address=self.addr
#將建立的clientsocket鏈接放到列表self.clients中
self.clients[address]=self.tcpClientSock
#分別將每個建立的鏈接放入進程中,接收且分發消息
self.thrs[address]=threading.Thread(target=self.readmsg,args=[address])
self.thrs[address].start()
time.sleep(0.5)defreadmsg(self,address):
#如果地址不存在,則返回False
ifaddressnotinself.clients:
returnFalse
#得到發送消息的clientsocket
client=self.clients[address]
whileTrue:
try:
#獲取到消息內容data
data=client.recv(BUFSIZ)
except:
print(e)
self.close_client(address)
break
ifnotdata:
break
#python3使用bytes,所以要進行編碼
#s='%s發送給我的信息是:[%s]%s'%(addr[0],ctime(),data.decode('utf8'))
#對日期進行一下格式化
ISOTIMEFORMAT='%Y-%m-%d%X'
stime=time.strftime(ISOTIMEFORMAT,localtime())
s=u'%s發送給我的信息是:%s'%(str(address),data.decode('utf8'))
#將獲得的消息分發給鏈接中的clientsocket
forkinself.clients:
self.clients[k].send(s.encode('utf8'))
self.clients[k].sendall('sendall:'+s.encode('utf8'))
printstr(k)
print([stime],':',data.decode('utf8'))
#如果輸入quit(忽略大小寫),則程序退出
STOP_CHAT=(data.decode('utf8').upper()=="QUIT")
ifSTOP_CHAT:
print"quit"
self.close_client(address)
print"alreadyquit"
break

defclose_client(self,address):
try:
client=self.clients.pop(address)
self.stops.append(address)
client.close()
forkinself.clients:
self.clients[k].send(str(address)+u"已經離開了")
except:
pass
print(str(address)+u'已經退出')


if__name__=='__main__':
tserver=TcpServer()
tserver.listen_client()

——————————華麗的分割線——————————

socket-tcp-client.py(客戶端):

#-*-encoding:utf-8-*-
fromsocketimport*
importsys
importthreading
importtime
reload(sys)
sys.setdefaultencoding("utf8")


#測試,連接本機
HOST='127.0.0.1'
#設置偵聽埠
PORT=8555
BUFSIZ=1024

classTcpClient:

ADDR=(HOST,PORT)
def__init__(self):
self.HOST=HOST
self.PORT=PORT
self.BUFSIZ=BUFSIZ
#創建socket連接
self.client=socket(AF_INET,SOCK_STREAM)
self.client.connect(self.ADDR)
#起一個線程,監聽接收的信息
self.trecv=threading.Thread(target=self.recvmsg)
self.trecv.start()

defsendmsg(self):
#循環發送聊天消息,如果socket連接存在則一直循環,發送quit時關閉鏈接
whileself.client.connect_ex(self.ADDR):
data=raw_input('>:')
ifnotdata:
break
self.client.send(data.encode('utf8'))
print(u'發送信息到%s:%s'%(self.HOST,data))
ifdata.upper()=="QUIT":
self.client.close()
printu"已關閉"
break
defrecvmsg(self):
#接收消息,如果鏈接一直存在,則持續監聽接收消息
try:
whileself.client.connect_ex(self.ADDR):
data=self.client.recv(self.BUFSIZ)
print(u'從%s收到信息:%s'%(self.HOST,data.decode('utf8')))
exceptException,e:
printstr(e)

if__name__=='__main__':
client=TcpClient()
client.sendmsg()

UDP版本:

socket-udp-server.py

#-*-coding:utf8-*-

importsys
importtime
importtraceback
importthreading
reload(sys)
sys.setdefaultencoding('utf-8')

importsocket
importtraceback

HOST="127.0.0.1"
PORT=9555
CHECK_PERIOD=20
CHECK_TIMEOUT=15

classUdpServer(object):
def__init__(self):
self.clients=[]
self.beats={}
self.ADDR=(HOST,PORT)
try:
self.sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.sock.bind(self.ADDR)#綁定同一個域名下的所有機器
self.beattrs=threading.Thread(target=self.checkheartbeat)
self.beattrs.start()
exceptException,e:
traceback.print_exc()
returnFalse

deflisten_client(self):
whileTrue:
time.sleep(0.5)
print"hohohohohoo"
try:
recvData,address=self.sock.recvfrom(2048)
ifnotrecvData:
self.close_client(address)
break
ifaddressinself.clients:
senddata=u"%s發送給我的信息是:%s"%(str(address),recvData.decode('utf8'))
ifrecvData.upper()=="QUIT":
self.close_client(address)
ifrecvData=="HEARTBEAT":
self.heartbeat(address)
continue
else:
self.clients.append(address)
senddata=u"%s發送給我的信息是:%s"%(str(address),u'進入了聊天室')
forcinself.clients:
try:
self.sock.sendto(senddata,c)
exceptException,e:
printstr(e)
self.close_client(c)
exceptException,e:
#traceback.print_exc()
printstr(e)
pass

defheartbeat(self,address):
self.beats[address]=time.time()

defcheckheartbeat(self):

whileTrue:
print"checkheartbeat"
printself.beats
try:
forcinself.clients:
printtime.time()
printself.beats[c]
ifself.beats[c]+CHECK_TIMEOUT<time.time():
printu"%s心跳超時,連接已經斷開"%str(c)
self.close_client(c)
else:
printu"checkp%s,沒有斷開"%str(c)
exceptException,e:
traceback.print_exc()
printstr(e)
pass
time.sleep(CHECK_PERIOD)

defclose_client(self,address):
try:
ifaddressinself.clients:
self.clients.remove(address)
ifself.beats.has_key(address):
delself.beats[address]
printself.clients
forcinself.clients:
self.sock.sendto(u'%s已經離開了'%str(address),c)
print(str(address)+u'已經退出')
exceptException,e:
printstr(e)
raise

if__name__=="__main__":
udpServer=UdpServer()
udpServer.listen_client()

——————————華麗的分割線——————————
socket-udp-client.py:
#-*-coding:utf8-*-

importsys
importthreading
importtime
reload(sys)
sys.setdefaultencoding('utf-8')

importsocket

HOST="127.0.0.1"
PORT=9555
#BEAT_PORT=43278
BEAT_PERIOD=5


classUdpClient(object):
def__init__(self):
self.clientsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
self.HOST=HOST
self.ADDR=(HOST,PORT)
self.clientsock.sendto(u'請求建立鏈接',self.ADDR)
self.recvtrs=threading.Thread(target=self.recvmsg)
self.recvtrs.start()
self.hearttrs=threading.Thread(target=self.heartbeat)
self.hearttrs.start()

defsendmsg(self):
whileTrue:
data=raw_input(">:")
ifnotdata:
break
self.clientsock.sendto(data.encode('utf-8'),self.ADDR)
ifdata.upper()=='QUIT':
self.clientsock.close()
break

defheartbeat(self):
whileTrue:
self.clientsock.sendto('HEARTBEAT',self.ADDR)
time.sleep(BEAT_PERIOD)

defrecvmsg(self):
whileTrue:
recvData,addr=self.clientsock.recvfrom(1024)
ifnotrecvData:
break
print(u'從%s收到信息:%s'%(self.HOST,recvData.decode('utf8')))if__name__=="__main__":
udpClient=UdpClient()
udpClient.sendmsg()

6. 請教一個關於python socket的問題

比較簡單的方法就是存儲一個字典列表,每次一個鏈接把對象都保存到對象中,同時對象中存儲對方IP。每次client連接過來,先判斷列表中IP是否超限, 如果不超限 允許連接 把對象和IP存儲到列表中。 如果超限 不允許連接 遍歷列表中所有IP,如果IP和連接IP相同,對象斷開即可,同時從列表中刪除

7. python的socket為什麼無法檢測連接狀態

tcp的實現要求極度高效,發生斷開事件,系統只是記錄狀態,不會主動通知應用程序的。 可以通過一些api查詢到socket的狀態變化,然後判斷是不是斷開了。比如用select, epoll, kqueue之類的事件分發器。話說,如果客戶端通過發送FIN包正常斷開連接(拔網線什麼的算異常),python的socket會變得可讀,並且recv會返回None。

8. 怎麼理解 Python 中的 socket 工作原理

沒有區別。首先都是用socket類中的成員函數socket創建一個socket對象,這個對象有一個句柄(socket.socket的返回值,也可以理解為套接字文件指針),在socket類中有數據AF_INET成員和SOCK_STREAM成員,所以第一種形式實際上是將socket對象自身的

9. python socket如何連接到華為雲伺服器

這篇文章主要介紹了python使用socket連接遠程伺服器的方法,涉及Python中socket通信的基本技巧,具有一定參考借鑒價值,需要的朋友可以參考下
本文實例講述了python使用socket連接遠程伺服器的方法。分享給大家供大家參考。具體如下:
import socket
print "Creating socket...",
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print "done."
print "Looking up port number...",
port = socket.getservbyname('http', 'tcp')
print "done."
print "Connecting to remote host on port %d..." % port,
s.connect(("www.jb51.net", port))
print "done."

熱點內容
mysql怎麼用資料庫 發布:2025-01-23 07:21:02 瀏覽:997
怎麼訪問暗網 發布:2025-01-23 07:02:04 瀏覽:665
無線配置代理選什麼 發布:2025-01-23 06:52:54 瀏覽:824
c程序匯編程序 發布:2025-01-23 06:49:42 瀏覽:840
cmd命令與linux命令 發布:2025-01-23 06:40:26 瀏覽:806
linux用戶目錄許可權 發布:2025-01-23 06:37:49 瀏覽:233
學計算機避免編程 發布:2025-01-23 06:29:09 瀏覽:661
易語言機器人源碼 發布:2025-01-23 06:24:03 瀏覽:320
匯編語言的編譯可以叫解釋嗎 發布:2025-01-23 06:23:22 瀏覽:35
tomcat編譯後的文件 發布:2025-01-23 06:05:46 瀏覽:254