python 網路編程(Socket)

來源:互聯網
上載者:User

標籤:請求   自動   sim   inpu   str   cps   end   soc   問題   

# from wsgiref.simple_server import make_server
#
# def RunServer(environ,start_response):
# start_response(status=‘200 OK‘,headers=[(‘Content-Type‘,‘text/html‘)])
# url=environ[‘PATH_INFO‘]
#
# return "guozhendong"
#
# if __name__==‘__main__‘:
# httpd=make_server(‘‘,8008,RunServer)
# print("Servering HTTP on port 8008....")
# httpd.serve_forever()



"""
python 網路編程
Socket(TCP、IP)通訊端

服務端
1、運行起來 ip和連接埠,等待別人的串連
用戶端
用戶端
用戶端
以下是伺服器端代碼
"""
import socket

sk=socket.socket()
sk.bind(("172.8.250.59",8008))
sk.listen(5)#表示只能等待5個人

while True:
conn, ip = sk.accept() # 接收用戶端的請求,並會阻塞,程式一直在這句話等待串連,以下的語句不會被執行
# conn和Ip為擷取到連線物件的ip地址和連接埠
#print(conn, ip)
conn.sendall(bytes(‘你好‘,encoding=‘utf-8‘))
while True:
ret_bytes=conn.recv(1024)
ret_str=str(ret_bytes,encoding=‘utf-8‘)
#print(ret_str)
conn.sendall(bytes(ret_str+"執行這裡了",encoding=‘utf-8‘))

"""
這個是Socket網路編程的服務端
"""
import socket

obj=socket.socket();
obj.connect(("172.8.250.59",8008))
recive=obj.recv(1024)#最多接收1024位元組
recive=str(recive,encoding=‘utf-8‘)
print(recive)

while True:
inp=input("請輸入要發送的內容")
if inp==‘q‘:
obj.sendall(bytes(inp, encoding=‘utf-8‘))
break
else:
obj.sendall(bytes(inp, encoding=‘utf-8‘))
print(str(obj.recv(1024), encoding=‘utf-8‘))



------------------------------------------------------------------

利用Socket傳送檔案


# from wsgiref.simple_server import make_server
#
# def RunServer(environ,start_response):
# start_response(status=‘200 OK‘,headers=[(‘Content-Type‘,‘text/html‘)])
# url=environ[‘PATH_INFO‘]
#
# return "guozhendong"
#
# if __name__==‘__main__‘:
# httpd=make_server(‘‘,8008,RunServer)
# print("Servering HTTP on port 8008....")
# httpd.serve_forever()



"""
python 網路編程
Socket(TCP、IP)通訊端

服務端
1、運行起來 ip和連接埠,等待別人的串連
用戶端
用戶端
用戶端
"""
import socket

sk=socket.socket()
sk.bind(("172.8.250.59",8008))
sk.listen(5)#表示只能等待5個人

while True:
conn, ip = sk.accept() # 接收用戶端的請求,並會阻塞,程式一直在這句話等待串連,以下的語句不會被執行
# conn和Ip為擷取到連線物件的ip地址和連接埠
conn.sendall(bytes("你好,歡迎登陸",encoding=‘utf-8‘))
f=open(‘new.png‘,‘wb‘)
file_size=str(conn.recv(1024),encoding=‘utf-8‘)#接收到服務端發送的檔案的大小
conn.sendall(bytes("開始吧", encoding=‘utf-8‘))
total_size=int(file_size)
print(total_size)
has_rev=0

while True:
if total_size==has_rev:
break
ret_bytes=conn.recv(1024)
f.write(ret_bytes)
has_rev+=len(ret_bytes)
f.close();


#用戶端

"""
這個是Socket網路編程的服務端
"""
import socket
import os

obj=socket.socket();
obj.connect(("172.8.250.59",8008))
recive=obj.recv(1024)#最多接收1024位元組
recive=str(recive,encoding=‘utf-8‘)
print(recive)
#擷取當前檔案的大小
size=os.stat(‘f.JPG‘).st_size
print(size,type(size))
obj.recv(1024)#解決粘包問題
obj.sendall(bytes(str(size),encoding=‘utf-8‘))
with open(‘f.JPG‘,‘rb‘) as f:
for line in f:
obj.sendall(line)
obj.close()
"""
為了使檔案發送完後自動停止接收,需要擷取當前檔案的大小
"""
#由於檔案發送依賴緩衝區,但是緩衝區的檔案發送東西需要等待一會時間,再把檔案發送過去,如果把檔案和前邊的大小以及其他東西放在一起發送,這就會造成粘包,解決粘包問題需要伺服器端接收完檔案大小後,返回一個確定訊息,即可解決粘包問題


-----------------------------------------------
利用socketserver可以實現多個串連訪問,代碼如下



import socketserver

class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn=self.request
conn.sendall(bytes((‘歡迎訪問我‘),encoding=‘utf-8‘))
while True:
ret_bytes=conn.recv(1024)
ret_str=str(ret_bytes,encoding=‘utf-8‘)
if ret_str==‘q‘:
break
conn.sendall(bytes(ret_str+‘號‘,encoding=‘utf-8‘))

if __name__==‘__main__‘:
server=socketserver.ThreadingTCPServer(("172.8.250.59",8008),MyServer)
server.serve_forever()





python 網路編程(Socket)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.