python学习之网络编程
一、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学习之网络编程相关推荐
- Python学习笔记:网络编程
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python学习(九) 网络编程学习--简易网站服务器
python `网络编程`和其他语言都是一样的,服务器这块步骤为: `1. 创建套接字` `2. 绑定地址` `3. 监听该描述符的所有请求` `4. 有新的请求到了调用accept处理请求` Pyt ...
- python的网络编程学什么_【Python学习】网络编程
1 # 1.发get请求 2 import requests 3 url = 'http://api.nnzhp.cn/api/user/stu_info' 4 data = {'stu_name': ...
- Python学习之面向对象编程
Python学习目录 在Mac下使用Python3 Python学习之数据类型 Python学习之函数 Python学习之高级特性 Python学习之函数式编程 Python学习之模块 Python学 ...
- python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...
- Python四大主流网络编程框架
目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Pytho ...
- python网络编程攻略-Python四大主流网络编程框架
目前Python的网络编程框架已经多达几十个,逐个学习它们显然不现实.但这些框架在系统架构和运行环境中有很多共通之处,本文带领读者学习基于Python网络框架开发的常用知识,及目前的4种主流Pytho ...
- 您所应了解的Python四大主流网络编程框架
本文内容摘录自<Python高效开发实战--Django.Tornado.Flask.Twisted>一书.该书分为三部分:第1部分是基础篇,带领初学者实践Python开发环境和掌握基本语 ...
- python学习笔记——多线程编程
python学习笔记--多线程编程 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时 ...
最新文章
- oracle学习 sql基本语法(三),Oracle数据库学习三
- URLEncoder.encode转译后“空格”变“加号”的问题的解决方案
- Mysql(五) JDBC
- 平台还是代购?海外贸易之争趋近尾声
- (boost::mp11::mp_rotate_left相关用法的测试程序
- python获取文件夹下文件_Python 获取指定文件夹下的目录和文件的实现
- 搭建JavaWeb项目时出现的问题
- 前端js-angluar定时刷新器
- 职场怪谈:技术面试过了一般HR多久联系?
- Nginx工作原理及基本使用
- 计算机如何共享桌面,怎么共享电脑屏幕?
- 算法之二叉树各种遍历
- php文字下划线,如何在文字下面添加下划线
- 组件、控件和插件的区别
- mfw 攻防世界web题 (Git泄露)
- 安装系统时,硬盘格式转换
- 英语口语8000句-随意的谈话
- 1.Hadoop的安装和使用(华为云学习笔记,Spark编程基础,大数据)
- 精品网址整理——计算机类学习视频资料
- 本科生毕业论文降重的技巧