1. 程式人生 > >python 網絡編程(Socket)

python 網絡編程(Socket)

python recv ets forever AI AC sim 文件 執行

# 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)