设为首页 收藏本站
查看: 928|回复: 0

[经验分享] Python-socket总结

[复制链接]

尚未签到

发表于 2018-8-6 12:08:13 | 显示全部楼层 |阅读模式
  socket是什么
  什么是socket所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。
  应用程序通常通过"套接字"向网络发出请求或者应答网络请求。说白了就是一种通信机制。
  列入你和移动客服咨询问题时,会有一个客服为你解决问题一样,就是你和客服间的相互通信
  在socket里就是“发送”和“接收”这两个动作就是socket通信方式
  socket.gethostname()     # 获取主机名
  from socket import *     # 避免 socket.socket()
  s=socket()
  s.bind()         # 绑定地址到套接字
  s.listen()       # 开始TCP监听
  s.accept()       # 被动接受TCP客户端连接,等待连接的到来
  s.connect()      # 主动初始化TCP服务器连接
  s.connect_ex()   # connect()函数的扩展版本,出错时返回出错码,而不是跑出异常
  s.recv()         # 接收TCP数据
  s.send()         # 发送TCP数据
  s.sendall()      # 完整发送TCP数据
  s.recvfrom()     # 接收UDP数据
  s.sendto()       # 发送UDP数据
  s.getpeername()  # 连接到当前套接字的远端的地址(TCP连接)
  s.getsockname()  # 当前套接字的地址
  s.getsockopt() # 返回指定套接字的参数
  s.setsockopt()   # 设置指定套接字的参数
  s.close()        # 关闭套接字
  s.setblocking()  # 设置套接字的阻塞与非阻塞模式
  s.settimeout()   # 设置阻塞套接字操作的超时时间
  s.gettimeout()   # 得到阻塞套接字操作的超时时间
  s.filen0()       # 套接字的文件描述符
  s.makefile()     # 创建一个与该套接字关联的文件对象
  socket.AF_UNIX # 只能够用于单一的Unix系统进程间通信
  socket.AF_INET  # 服务器之间网络通信
  socket.AF_INET6 # IPv6
  socket.SOCK_STREAM  # 流式socket , for TCP
  socket.SOCK_DGRAM  # 数据报式socket , for UDP
  socket.SOCK_RAW      # 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。
  socket.SOCK_RDM   # 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。
  socket.SOCK_SEQPACKET # 可靠的连续数据包服务
  基础讲解
  # 创建socket对象
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # 监听端口
  sock.bind(('127.0.0.1',8001))
  # 开始监听,
  sock.listen(5)
  while True:
  # 阻塞,deng 。。。。
  # 直到有请求连接
  print '....'
  connection, address = sock.accept()
  # connection,代表客户端socket对象,
  # address,客户端IP地址
  #handle_request(connection)
  buf = connection.recv(1024)
  print buf
  connection.send("HTTP/1.1 200 OK\r\n\r\n")
  connection.send("Hello, World")
  connection.close()
  #服务端
  import socket
  HOST=''  #空代表0.0.0.0
  PORT= 6666  #监听端口
  s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.bind((HOST,PORT))
  s.listen(1)
  while True:
  conn,addr= s.accept()
  print'Connected by', addr
  while  True:
  data = conn.recv(1024) #接收1024字节数据
  if not data: break     #如果收不到客户端数据了(代表客户端断开了),就断开
  conn.sendall(data.upper())    #将收到的数据全变成大写再发给客户端
  conn.close() #关闭此客户端的连接实例
  #客户端
  import socket
  HOST=''
  PORT= 6666  #监听端口
  s= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  s.bind((HOST,PORT))
  s.listen(1)
  while True:
  conn,addr= s.accept()
  print'Connected by', addr
  while  True:
  data = conn.recv(1024) #接收1024字节数据
  if not data: break     #如果收不到客户端数据了(代表客户端断开了),就断开
  conn.sendall(data.upper())    #将收到的数据全变成大写再发给客户端
  conn.close() #关闭此客户端的连接实例
  服务端socket在使用bind方法之后调用listen方法去监听一个给定的 地址。然后,客户端socket就可以通过使 用 connect方法(connect方法所使用的地址参数与bind相同)去连接服务端。listen方法 要求一个参数,这个参数就是等待连接队列中所能包含的连接数。
  一旦服务端socket调用了listen方法,就进入了临听状态,然后通 常使用一个无限的循环:1、开始接受客房端的连接,这通过调用accept方法来实现。调用了这个方法后将处于阻塞状态(等待客户端发起连接)直到一个客 户端连接,连接后,accept返回形如(client,address)的一个元组,其中client是一个用于与客户端通信的 socket,address是客户端的形如xxx.xxx.xxx.xxx:xxx的地址;2、然后服务端处理客户端的请求;3、处理完成之后又调用 1。
  #以上例子是单线程的只能一对一的服务,即服务端只能处理一个链接,想要处理多线程怎么办,不用急多线程的Python已给我们写好直接调用就好
  socket服务端
  #用于处理多线程的模块
  import SocketServer
  import os

  >  def handle(self):
  while True:
  self.data=self.request.recv(1024).strip() #接受数据
  if self.data == 'quit' or not self.data:break #如果没有数据或为quit 退出
  cmd_data=os.popen(self.data).read() #将命令结果存为字符串
  if cmd_data == '':cmd_data= self.data + ': Command not found' #如果命令结果为空或命令返回为空
  self.request.sendall(cmd_data) #发送所有的数据
  if __name__ == '__main__':
  HOST,PORT = '127.0.0.1',6666 #绑定端口和ip
  server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP) #将写的类加入多线程处理
  server.serve_forever() #循环启动
  socket客户端
  import socket
  HOST='127.0.0.1'
  PORT=6666
  s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #服务期间的TCP通信
  s.connect((HOST,PORT)) #绑定端口和ip
  while True:
  while True: #如果命令为空继续输入
  cmd=raw_input('CMD:').strip()
  if cmd != '':break
  s.sendall(cmd) #发送所有数据
  data=s.recv(1024).split('\n') #以换行符分割接收的数据
  print 'cmd:'
  for line in data:print line #循环打印数据
  s.close() #关闭套接字
  用SocketServer创建一个服务器需要三步:
  1、通过子类化BaseRequestHandler类和覆盖它的handle()方法来创建一个请求处理器类,用于处理进来
  的请求;
  2、实例化服务类如TCPServer,并传递给它参数:服务器地址和请求处理器类;
  3、调用服务实例对象的handle_request()或serve_forever()方法去处理请求。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-547608-1-1.html 上篇帖子: python元组及文件 下篇帖子: Python 安装nose-linux运维
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表