socket网络编程

  Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。socket服务一般分为服务端和客户端;与此同时,socket服务有基本tcp和udp的两种版本类型

TCP类型

  基础版socket服务

  1. ####服务端####
  2. import socket
  3. phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
  4. '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
  5.  
  6. phone.bind(('127.0.0.1',8080))#插卡
  7.  
  8. phone.listen(5) #开机(监听)
  9. '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
  10.  
  11. conn,addr=phone.accept()#接电话(3次握手建立连接)
  12. print('tcp的连接',conn)
  13. print('客户端的地址',addr)
  14.  
  15. data = conn.recv(1024) #说话(收消息)
  16. print('from client msg: %s' %data)
  17.  
  18. conn.send(data.upper()) #发消息
  19.  
  20. conn.close()#挂电话
  21. phone.close()#关手机
  22.  
  23. ####客户端####
  24. import socket
  25. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  26. '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
  27.  
  28. client.connect(('127.0.0.1',8080)) #拨通电话
  29.  
  30. client.send('hello'.encode('utf-8')) #客户端发消息
  31.  
  32. data = client.recv(1024) #客户端收消息
  33. print(data)
  34. client.close() #关闭

  循环版socket服务

  1. ####服务端####
  2. import socket
  3. phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
  4. '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
  5.  
  6. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  7. '''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''
  8.  
  9. phone.bind(('127.0.0.1',8080))#插卡
  10.  
  11. phone.listen(5) #开机(监听)
  12. '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
  13.  
  14. while True: #链接循环
  15. conn,addr=phone.accept()#接电话(3次握手建立连接)
  16. print('client: ',addr)
  17.  
  18. while True: #通讯循环
  19. try:
  20. data = conn.recv(1024) #说话(收消息)
  21. if not data:break #针对Linux,客户端断开链接的异常处理
  22. print('from client msg: %s' %data)
  23.  
  24. conn.send(data.upper()) #发消息
  25. except Exception: #异常捕捉
  26. break
  27.  
  28. conn.close()#挂电话
  29.  
  30. phone.close()#关手机
  31.  
  32. ####客户端####
  33. import socket
  34. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  35. '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
  36.  
  37. client.connect(('127.0.0.1',8080)) #拨通电话
  38.  
  39. while True:
  40. msg = input('>>>: ')
  41. if not msg:continue
  42. client.send(msg.encode('utf-8')) #客户端发消息
  43.  
  44. data = client.recv(1024) #客户端收消息
  45. print(data)
  46.  
  47. client.close() #关闭

  socketserver服务(可并发的socket)

  1. ####服务端####
  2. import socketserver
  3.  
  4. class FtpServer(socketserver.BaseRequestHandler):
  5. def handle(self):
  6. print(self.request) #conn
  7. print(self.client_address)
  8.  
  9. while True:
  10. data = self.request.recv(1024)
  11. self.request.send(data.upper())
  12.  
  13. if __name__ == '__main__':
  14. s = socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
  15. s.serve_forever() #链接循环就有了
  16.  
  17. ####客户端1####
  18. # import socket
  19. from socket import *
  20.  
  21. client = socket(AF_INET,SOCK_STREAM)
  22. client.connect(('127.0.0.1',8080))
  23.  
  24. while True:
  25. msg = input('>>: ')
  26. client.send(msg.encode('utf-8'))
  27.  
  28. data = client.recv(1024)
  29. print(data)
  30.  
  31. ####客户端1####
  32. # import socket
  33. from socket import *
  34.  
  35. client = socket(AF_INET,SOCK_STREAM)
  36. client.connect(('127.0.0.1',8080))
  37.  
  38. while True:
  39. msg = input('>>: ')
  40. client.send(msg.encode('utf-8'))
  41.  
  42. data = client.recv(1024)
  43. print(data)
  44.  
  45. """
  46. socketserver可以实现多并发,即一个服务端同时和多个客户端进行通信
  47. """

  远程执行

  1. ###远程执行命令-server端###
  2. import socket
  3. import subprocess
  4. import struct
  5. import json
  6.  
  7. phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
  8. '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
  9.  
  10. phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  11. '''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''
  12.  
  13. phone.bind(('127.0.0.1',8080))#插卡
  14.  
  15. phone.listen(5) #开机(监听)
  16. '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
  17.  
  18. while True: #链接循环
  19. conn,addr=phone.accept()#接电话(3次握手建立连接)
  20. print('client: ',addr)
  21.  
  22. while True: #通讯循环
  23. try:
  24. cmd = conn.recv(1024) #说话(收消息)
  25. if not cmd:break #针对Linux,客户端断开链接的异常处理
  26. print('from client msg: %s' %cmd)
  27.  
  28. res = subprocess.Popen(cmd.decode('utf-8'),
  29. shell=True,
  30. stdout=subprocess.PIPE,
  31. stderr=subprocess.PIPE
  32. )
  33. err = res.stderr.read()
  34. if err:
  35. back_msg = err
  36. else:
  37. back_msg = res.stdout.read()
  38.  
  39. #解决长度局限
  40. #第一阶段:制作报头
  41. head_dic = {
  42. 'data_size':len(back_msg)
  43. }
  44. head_json = json.dumps(head_dic)
  45. head_bytes = head_json.encode('utf-8')
  46.  
  47. '''添加解决粘包代码'''
  48. # conn.send(struct.pack('i',len(back_msg))) #传数据的长度(有局限)
  49.  
  50. #第二阶段:发送报头的长度
  51. conn.send(struct.pack('i',len(head_bytes)))
  52.  
  53. # conn.send(back_msg)
  54. # 第三阶段:发报头
  55. conn.send(head_bytes)
  56.  
  57. #第四阶段:发真实数据
  58. conn.sendall(back_msg)
  59.  
  60. except Exception: #异常捕捉
  61. break
  62.  
  63. conn.close()#挂电话
  64.  
  65. phone.close()#关手机
  66.  
  67. ###远程执行命令-client端###
  68. import socket
  69. import struct
  70. import json
  71.  
  72. client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  73. client.connect(('127.0.0.1',8080))
  74.  
  75. while True:
  76. cmd= input('>>>: ').strip()
  77. if not cmd:continue
  78.  
  79. client.send(cmd.encode('utf-8'))
  80. #解决粘包注释的改动部分(注释掉)
  81. # res=client.recv(1024)
  82. # print(res.decode('gbk'))
  83.  
  84. '''通过定义传输数据文件大小来解决粘包'''
  85. # data = client.recv(4)
  86. # data_size=struct.unpack('i',data)[0]
  87.  
  88. ###优化:接收头的长度
  89. head = client.recv(4)
  90. head_size = struct.unpack('i',head)[0]
  91.  
  92. ###收报头(根据报头长度)
  93. head_bytes = client.recv(head_size)
  94. head_json = head_bytes.decode('utf-8')
  95. head_dic= json.loads(head_json)
  96. data_size = head_dic['data_size'] #取真实数据
  97.  
  98. """大数据量传输(收真实数据)"""
  99. recv_size = 0
  100. recv_bytes = b''
  101. while recv_size < data_size:
  102. res=client.recv(1024)
  103. recv_bytes+=res
  104. recv_size+=len(res)
  105. print(recv_bytes.decode('gbk'))
  106.  
  107. # res=client.recv(data_size)
  108. # print(res.decode('gbk'))

Python之旅Day8 socket网络编程的更多相关文章

  1. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  2. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  3. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...

  4. NO.8:自学python之路------并行socket网络编程

    摘要 一到放假就杂事很多,这次的作业比较复杂,做了一个周,进度又拖了.不过结果还不错. 正文 粘包 在上一节中,如果连续发送过多数据,就可能发生粘包.粘包就是两次发送的数据粘在一起被接收,损坏了数据的 ...

  5. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  6. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  7. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  8. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  9. 从零开始学Python第八周:网络编程基础(socket)

    Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...

随机推荐

  1. WPF 初识

    1.WPF 与Winform比较 1.1.WPF所有的操作都不依赖于GDI和GDI+,而是间接依赖于强大的Direct3D,这就意味着通过WPF可以做出以前WinFrom无法想象的视觉效果,包括3D效 ...

  2. 23. Merge k Sorted Lists (JAVA)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  3. 19-01【vmware machine】虚拟机无法联网访问

    问题 我本地的虚拟机上没办法访问外网,然后搞了很久很久,最终解决了. 现象 A,电脑持续运行了三天,也没有复杂的环境调整的情况下.我本地的ubuntu(使用VMWare machine创建的),突然没 ...

  4. 探索未知种族之osg类生物---渲染遍历之裁剪二

    前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...

  5. python基础 (初识函数&函数进阶)

    函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...

  6. C51汇编典型代码&一些org-mode技巧

    C51汇编典型代码&一些org-mode技巧 文档存放 具体内容可见存放的数据. 下面主要介绍关键代码. ASM 部分 1;; LCD数据发送========================= ...

  7. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again

    虚拟机恢复快照后,使用yum安装软件,提示下面的信息,开始以为是yum源的问题或者DNS的问题,但是无果,最后再看一下服务器的时间,坑了,还原快照,时间变成以前的了. [root@localhost ...

  8. Chapter5_初始化与清理_方法重载

    方法重载是java中编译器在方法调用时采用的一个重要机制.起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机 ...

  9. 基于grafana+telegraf的服务器监控方案

    准备工作:安装InfluxDb 1 Windows 1.1 下载agent      https://dl.influxdata.com/telegraf/releases/telegraf-1.10 ...

  10. IDEA中通过工具类实现对数据库的增删改查

    package com.hu.dao; import com.hu.entity.Student; import java.util.List;import java.util.Map; public ...