標籤:請求 自動 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)