# 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 socketimport 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_sizeprint(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()
原文地址:https://www.cnblogs.com/guozhendong/p/9025497.html
时间: 2024-10-09 16:58:51