一、socket模块socket模块提供了底层的接口,通过socket模块可以实现不同计算机的通信ip+port定位了计算机中应用程序的具体位置,socket绑定ip+port来建立链接,socket的方法详情:socket(family, type, proto): socket函数创建一个socket对象,使用socket对象创建连接,family协议族,默认AF_INET,ipv4协议,type,socket类型,proto协议类型bind((ip, port)): 绑定服务器地址listen(n): 监听socket创建的链接, n代表指定连接队列数,connect(('127.0.0.1', 8080)): 连接到服务端accept():等待客户端连接,返回连接对象和客户端ip组成的元组recv(n): 接收数据,n代表接受固定的数据send(data): 发送数据例子:模拟客户端服务端通信server:#!/usr/bin/python# --*-- coding: utf-8 --*--import socketphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('127.0.0.1', 8080))phone.listen(5)print('starting...')conn, addr = phone.accept()print(conn)print('client addr: ', addr)print('ready to read msg')client_msg = conn.recv(1024)print('client msg: %s' %(client_msg))conn.send(client_msg.upper())conn.close()phone.close()client#!/usr/bin/pytthon# --*-- coding: utf-8 --*--import socketphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8080))phone.send('hello'.encode('utf-8'))back_msg = phone.recv(1024)print(back_msg.decode('gbk'))phone.close()模拟循环发送接收数据serverimport socketphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('127.0.0.1', 8080))phone.listen(5)while True:print('starting...')conn, addr = phone.accept()print('client addr ', addr)while True:try:client_msg = conn.recv(1024)if not client_msg: breakprint('client_msg: %s' %client_msg)conn.send(client_msg.upper())except Exception:breakconn.close()phone.close()clientimport socketphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8080))while True:msg = input(">>: ")if not msg: continuephone.send(msg.encode('utf-8'))back_msg = phone.recv(1024)print(back_msg.decode('utf-8'))phone.close()模拟远程执行命令,并返回结果serverimport socketimport subprocessphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('127.0.0.1', 8080))phone.listen(5)while True:print('starting...')conn,addr = phone.accept()print('client addr: ', addr)while True:try:cmd = conn.recv(1024)if not cmd: breakres = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)err = res.stderr.read()if err:cmd_res = errelse:cmd_res = res.stdout.read()conn.send(cmd_res)except Exception:breakconn.close()phone.close()clientimport socketphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8080))while True:cmd = input('>>: ').strip()if not cmd: continuephone.send(cmd.encode('utf-8'))back_msg = phone.recv(1024)print(back_msg.decode('gbk'))phone.close()粘包现象,数据包无规则断开,出现不希望的断开现象serverfrom socket import *import timetcp_server = socket(AF_INET, SOCK_STREAM)tcp_server.bind(('127.0.0.1', 8080))tcp_server.listen(5)conn, addr = tcp_server.accept()res1 = conn.recv(5)res2 = conn.recv(5)res3 = conn.recv(7)print(res1.decode('gbk'))print(res2.decode('gbk'))print(res3.decode('gbk'))clientfrom socket import *import timetcp_client = socket(AF_INET, SOCK_STREAM)tcp_client.connect(('127.0.0.1', 8080))tcp_client.send('hello world'.encode('utf-8'))time.sleep(5)tcp_client.send('egon666'.encode('utf-8'))解决粘包问题,使用struct模块,打包数据并解包数据例子:serverimport socketimport subprocessimport structimport jsonphone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)phone.bind(('127.0.0.1', 8080))phone.listen(5)while True:print('starting...')conn, addr = phone.accept()print('client addr: ', addr)while True:try:cmd = conn.recv(1024)if not cmd:breakres = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)err = res.stderr.read()if err:cmd_res = errelse:cmd_res = res.stdout.read()head_dict = {'filename': None, 'hash': None, 'total_size': len(cmd_res)}head_json = json.dumps(head_dict)head_bytes = head_json.encode('utf-8')print(struct.pack('i', len(head_bytes)))conn.send(struct.pack('i', len(head_bytes)))conn.send(head_bytes)conn.send(cmd_res)except Exception:breakconn.close()phone.close()clientimport socketimport structimport jsonphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 8080))while True:cmd = input('>>: ').strip()if not cmd: continuephone.send(cmd.encode('utf-8'))head_struct = phone.recv(4)#print(head_struct)head_len = struct.unpack('i', head_struct)[0]head_bytes = phone.recv(head_len)head_json = head_bytes.decode('utf-8')#print(head_json)head_dict = json.loads(head_json)#print(head_dict)total_size = head_dict['total_size']recv_size = 0data = b''while recv_size < total_size:recv_data = phone.recv(1024)data += recv_datarecv_size += len(recv_data)print(data.decode('gbk'))phone.close()

转载于:https://blog.51cto.com/haoyonghui/1939996

python学习之网络编程相关推荐

  1. Python学习笔记:网络编程

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  2. python学习(九) 网络编程学习--简易网站服务器

    python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...

  3. python的网络编程学什么_【Python学习】网络编程

    1 # 1.发get请求 2 import requests 3 url = 'http://api.nnzhp.cn/api/user/stu_info' 4 data = {'stu_name': ...

  4. Python学习之面向对象编程

    Python学习目录 在Mac下使用Python3 Python学习之数据类型 Python学习之函数 Python学习之高级特性 Python学习之函数式编程 Python学习之模块 Python学 ...

  5. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  6. Python四大主流网络编程框架

    目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Pytho ...

  7. python网络编程攻略-Python四大主流网络编程框架

    目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Pytho ...

  8. 您所应了解的Python四大主流网络编程框架

    本文内容摘录自<Python高效开发实战--Django.Tornado.Flask.Twisted>一书.该书分为三部分:第1部分是基础篇,带领初学者实践Python开发环境和掌握基本语 ...

  9. python学习笔记——多线程编程

    python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...

最新文章

  1. oracle学习 sql基本语法(三),Oracle数据库学习三
  2. URLEncoder.encode转译后“空格”变“加号”的问题的解决方案
  3. Mysql(五) JDBC
  4. 平台还是代购?海外贸易之争趋近尾声
  5. (boost::mp11::mp_rotate_left相关用法的测试程序
  6. python获取文件夹下文件_Python 获取指定文件夹下的目录和文件的实现
  7. 搭建JavaWeb项目时出现的问题
  8. 前端js-angluar定时刷新器
  9. 职场怪谈:技术面试过了一般HR多久联系?
  10. Nginx工作原理及基本使用
  11. 计算机如何共享桌面,怎么共享电脑屏幕?
  12. 算法之二叉树各种遍历
  13. php文字下划线,如何在文字下面添加下划线
  14. 组件、控件和插件的区别
  15. mfw 攻防世界web题 (Git泄露)
  16. 安装系统时,硬盘格式转换
  17. 英语口语8000句-随意的谈话
  18. 1.Hadoop的安装和使用(华为云学习笔记,Spark编程基础,大数据)
  19. 精品网址整理——计算机类学习视频资料
  20. 本科生毕业论文降重的技巧

热门文章

  1. 无限级分销系统数据库表设计
  2. tomcat没有编译重新编写的代码
  3. 安装SQLSERVER2000时出现以前的某个程序安装已在安装计算机上创建挂起的文件操作...
  4. 你会想待下去吗?世界上25个最惊险的屋顶
  5. ESXi vSphere Client中copy paste如何启用
  6. 【微信小程序开发•系列文章七】websocket
  7. From NSURLConnection to NSURLSession
  8. 用VS开发PHP扩展
  9. OSwatcher on Exadata
  10. 程序员:下一次面试前你需要准备的五个基本步骤