socket编程进阶(代码片段)

it-scavenger it-scavenger     2022-11-19     520

关键词:

socketserver

虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。

socketserver模块可以简化网络服务器的编写,Python把网络服务抽象成两个主要的类,一个是Server类,用于处理连接相关的网络操作,另外一个则是RequestHandler类,用于处理数据相关的操作。并且提供两个MixIn 类,用于扩展 Server,实现多进程或多线程。

 

Server类

它包含了种五种server类,BaseServer(不直接对外服务)。TCPServer使用TCP协议,UDPServer使用UDP协议,还有两个不常使用的,即UnixStreamServer和UnixDatagramServer,这两个类仅仅在unix环境下有用(AF_unix)。

 

创建一个socketserver 至少分以下几步

1.首先,您必须创建一个请求处理类,继承BaseRequestHandlerclass类并且重 写父类的handle()方法,该方法将处理传入的请求。

2.其次,你必须实例化一个上面类型中的一个类(如TCPServer)传递服务器的地址和你上面创建的请求处理类 给这个TCPServer。

3.然后,调用handle_request()或者serve_forever()方法来处理一个或多个请求。

ser.handle_request()  # 只处理一个请求,处理完就退出了
ser.serve_forever()   # 处理多个请求,永远执行。

4.最后,调用server_close()关闭socket。

 

聊天并发实例

import socketserver
class MyServer(socketserver.BaseRequestHandler):
   def handle(self):
       print ("服务端启动...")
       while True:
           conn = self.request
           print (self.client_address)
           while True:
               client_data=conn.recv(1024)
               print (str(client_data,"utf8"))
               print ("waiting...")
               server_response=input(">>>")
               conn.sendall(bytes(server_response,"utf8"))
               # conn.sendall(client_data)
           conn.close()
           # print self.request,self.client_address,self.server
if __name__ == ‘__main__‘:
   server = socketserver.ThreadingTCPServer((‘127.0.0.1‘,8098),MyServer)
   server.serve_forever()
##########################################
import socket
ip_port = (‘127.0.0.1‘,8098)
sk = socket.socket()
sk.connect(ip_port)
print ("客户端启动:")
while True:
   inp = input(‘>>>‘)
   sk.sendall(bytes(inp,"utf8"))
   server_response=sk.recv(1024)
   print (str(server_response,"utf8"))
   if inp == ‘exit‘:
       break
sk.close()

 

解决大数据传送和粘包问题

粘包:相邻两次发送的数据粘在了一起

import socketserver
import subprocess
class Myserver(socketserver.BaseRequestHandler):
   def handle(self):
       while True:
           conn=self.request
           conn.sendall(bytes("欢迎登录","utf8"))
           while True:
               client_bytes=conn.recv(1024)
               if not client_bytes:break
               client_str=str(client_bytes,"utf8")
               print(client_str)
               command=client_str
               result_str=subprocess.getoutput(command)
               result_bytes = bytes(result_str,encoding=‘utf8‘)
               info_str="info|%d"%len(result_bytes)
               conn.sendall(bytes(info_str,"utf8"))
               # conn.recv(1024)
               conn.sendall(result_bytes)
           conn.close()
if __name__=="__main__":
   server=socketserver.ThreadingTCPServer(("127.0.0.1",9998),Myserver)
   server.serve_forever()
#####################################client
import socket
ip_port=("127.0.0.1",9998)
sk=socket.socket()
sk.connect(ip_port)
print("客户端启动...")
print(str(sk.recv(1024),"utf8"))
while True:
   inp=input("please input:").strip()
   sk.sendall(bytes(inp,"utf8"))
   basic_info_bytes=sk.recv(1024)
   print(str(basic_info_bytes,"utf8"))
   # sk.send(bytes(‘ok‘,‘utf8‘))
   result_length=int(str(basic_info_bytes,"utf8").split("|")[1])
   print(result_length)
   has_received=0
   content_bytes=bytes()
   while has_received<result_length:
       fetch_bytes=sk.recv(1024)
       has_received+=len(fetch_bytes)
       content_bytes+=fetch_bytes
   cmd_result=str(content_bytes,"utf8")
   print(cmd_result)
sk.close()

 

文件上传

import socket,os
ip_port=("127.0.0.1",8898)
sk=socket.socket()
sk.bind(ip_port)
sk.listen(5)
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
while True:
   print("waiting connect")
   conn,addr=sk.accept()
   flag = True
   while flag:
           client_bytes=conn.recv(1024)
           client_str=str(client_bytes,"utf8")
           func,file_byte_size,filename=client_str.split("|",2)

           path=os.path.join(BASE_DIR,‘yuan‘,filename)
           has_received=0
           file_byte_size=int(file_byte_size)

           f=open(path,"wb")
           while has_received<file_byte_size:
               data=conn.recv(1024)
               f.write(data)
               has_received+=len(data)
           print("ending")
           f.close()

#----------------------------------------------client
#----------------------------------------------
import socket
import re,os,sys
ip_port=("127.0.0.1",8898)
sk=socket.socket()
sk.connect(ip_port)
BASE_DIR=os.path.dirname(os.path.abspath(__file__))
print("客户端启动....")
while True:
   inp=input("please input:")
   if inp.startswith("post"):
       method,local_path=inp.split("|",1)
       local_path=os.path.join(BASE_DIR,local_path)
       file_byte_size=os.stat(local_path).st_size
       file_name=os.path.basename(local_path)
       post_info="post|%s|%s"%(file_byte_size,file_name)
       sk.sendall(bytes(post_info,"utf8"))
       has_sent=0
       file_obj=open(local_path,"rb")
       while has_sent<file_byte_size:
           data=file_obj.read(1024)
           sk.sendall(data)
           has_sent+=len(data)
       file_obj.close()
       print("上传成功")

 

注意:

       1  纸条就是conn

       2  一收一发(解决粘包的关键)

       3   client_data=conn.recv(1024)        

           if  那边send一个空数据  这边recv为空,则recv继续阻塞,等待其他的数据。所以聊天的时候好好聊,别发空数据。 

 


 

技术分享图片

识别图中二维码,欢迎关注python宝典

 




































































































































30java进阶——socket编程(代码片段)

 ✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。🍎个人主页:乐趣国学的博客🍊个人信条:不迁怒,不贰过。小知识,大智慧。💞当前专栏:JAVA开发者成长之路✨特色专... 查看详情

python入门自学进阶——8-网络编程(代码片段)

...,网络通信的三个要素:IP地址、端口号、协议。socket所在层次示意图:我们写的程序运行起来就是用户进程,我们的程序进行在运行时,如果要进行网络通信,只需要与socket进行交互就可以,socket封... 查看详情

网络编程-socket(代码片段)

网络编程之socket一、为什么要学习socket  首先我们python基础部分已经学完,而socket是我们基础进阶的课程,也就是说,你已经可以写一点小程序了,socket就是网络通信的工具,任何一门语言都有socket,他不是任何语言的专有名... 查看详情

手把手写c++服务器(22):linuxsocket网络编程进阶第一弹(代码片段)

...:前面一篇文章手把手写C++服务器(21):Linuxsocket网络编程入门基础,讲解了如何建立socket连接、如何转换/使用socket地址、如何绑定/监听/发起/接受/断开/终止/关闭连接。socket博大精深,进阶会多写几弹,... 查看详情

手把手写c++服务器(22):linuxsocket网络编程进阶第一弹(代码片段)

...:前面一篇文章手把手写C++服务器(21):Linuxsocket网络编程入门基础,讲解了如何建立socket连接、如何转换/使用socket地址、如何绑定/监听/发起/接受/断开/终止/关闭连接。socket博大精深,进阶会多写几弹,... 查看详情

socket网络编程进阶与实战

...全在于希望极大的方便同学进行本课程的学习。...第2章Socket网络编程快速入门本章首先整体介绍什么是Socket网络编程;让大家对Socket有个大概的概念与方向。之后通过几 查看详情

socket网络编程进阶与实战

...全在于希望极大的方便同学进行本课程的学习。...第2章Socket网络编程快速入门本章首先整体介绍什么是Socket网络编程;让大家对Socket有个大概的概念与方向。之后通过几 查看详情

python进阶第一篇socket(代码片段)

1.socket()模块函数要使用socket.socket()函数来创建套接字。其语法如下:socket.socket(socket_family,socket_type,protocol=0) socket_family可以是如下参数:  socket.AF_INETIPv4(默认)  socket.AF_INET6IPv6  socket.AF_UNIX只能够用于单一的Unix系统 查看详情

socket网络编程进阶与实战

...学进行本课程的学习。...1-1课程导学(课前必看)第2章Socket网络编程快速入门本章首先整体介绍什么是Socket网络编程;让大家对Sock 查看详情

socket编程进阶

1、  动态导入模块第一种方法(python解释器自己内部用的):上图是我程序的目录结构下面代码是动态导入模块3.py的源码:1#AUTHOR:FAN2lib_dir=__import__(‘lib.aa‘)3print(lib)4obj=lib.aa.C()5print(obj.name)lib包目录下aa.py的源码如下:1#... 查看详情

网络编程之socket(代码片段)

网络编程之socket看到本篇文章的题目是不是很疑惑,whatisthis?,不要着急,但是记住一说网络编程,你就想socket,socket是实现网络编程的工具,那么什么是socket,什么是网络编程,什么是网络,为什么要学习socket,都在下面有... 查看详情

day8--socket网络编程进阶

   socket:socket就是实现服务器和客户端数据的交换,服务器端接收并发送数据,客户端发送并接收数据,并且需要注意的是,在python3中,socket值接收字节。因为客户端在发送连接给服务器的时候,要转换为字节码;... 查看详情

[8421论坛]2019socket网络编程入门到进阶与实战完整视频教程

第一章 课程介绍及java语言简介第二章 快速入门Socket网络编程第三章 快速入门Socket UDP第四章 快速入门Socket TCP第五章 UDP辅助TCP实现点对点传输案例第六章 简易聊天室案例第七章 服务器传输优... 查看详情

java实战用socket通信编程制作多人聊天室(代码片段)

 个人简介👨🏻‍💻个人主页:陈橘又青🏃🏻‍♂️博客记录心情,代码编写人生。🌟如果文章对你有用,麻烦关注点赞收藏走一波,感谢支持!🌱欢迎订阅我的专栏:【Java... 查看详情

socket网络编程进阶与实战

...读(不看会错过一个亿)1-2课程导学(课前必看)第2章Socket网络编程快速入门本章首先整体介绍什么是Socket网络编程;让大家对Socket有个大概的概念与方向。之后通过几个小Case引出课程的主角,轻松愉快的让你体验到Socket编程... 查看详情

python面向对象编程进阶(代码片段)

python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super)isinstance(obj,cls)检查是否obj是否是类cls的对象1classFoo(object):2pass34obj=Foo()56isinstance(obj,Foo)issubclass(sub,super)检查sub类是否是super类的派生类1class 查看详情

shell的进阶编程(代码片段)

shell的进阶编程关于for  for变量名字in列表;do    循环体  done  例如for:forNAME[inWORDS...];doCOMMANDS;don其中前面的name就是个变量名,而且不需要加$,每次循环和中间列表中的值有关,中间的列表可... 查看详情

socket网络编程进阶与实战

...全在于希望极大的方便同学进行本课程的学习。...第2章Socket网络编程快速入门本章首先整体介绍什么是Socket网络编程;让大家对Socket有个大概的概念与方向。之后通过几个小Case引出课程的主角,轻松愉快的让你体验到Socket编程... 查看详情