Python之旅Day8 socket网络编程
socket网络编程
Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。socket服务一般分为服务端和客户端;与此同时,socket服务有基本tcp和udp的两种版本类型
TCP类型
基础版socket服务
- ####服务端####
- import socket
- phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
- '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
- phone.bind(('127.0.0.1',8080))#插卡
- phone.listen(5) #开机(监听)
- '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
- conn,addr=phone.accept()#接电话(3次握手建立连接)
- print('tcp的连接',conn)
- print('客户端的地址',addr)
- data = conn.recv(1024) #说话(收消息)
- print('from client msg: %s' %data)
- conn.send(data.upper()) #发消息
- conn.close()#挂电话
- phone.close()#关手机
- ####客户端####
- import socket
- client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
- client.connect(('127.0.0.1',8080)) #拨通电话
- client.send('hello'.encode('utf-8')) #客户端发消息
- data = client.recv(1024) #客户端收消息
- print(data)
- client.close() #关闭
循环版socket服务
- ####服务端####
- import socket
- phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
- '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
- phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- '''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''
- phone.bind(('127.0.0.1',8080))#插卡
- phone.listen(5) #开机(监听)
- '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
- while True: #链接循环
- conn,addr=phone.accept()#接电话(3次握手建立连接)
- print('client: ',addr)
- while True: #通讯循环
- try:
- data = conn.recv(1024) #说话(收消息)
- if not data:break #针对Linux,客户端断开链接的异常处理
- print('from client msg: %s' %data)
- conn.send(data.upper()) #发消息
- except Exception: #异常捕捉
- break
- conn.close()#挂电话
- phone.close()#关手机
- ####客户端####
- import socket
- client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
- client.connect(('127.0.0.1',8080)) #拨通电话
- while True:
- msg = input('>>>: ')
- if not msg:continue
- client.send(msg.encode('utf-8')) #客户端发消息
- data = client.recv(1024) #客户端收消息
- print(data)
- client.close() #关闭
socketserver服务(可并发的socket)
- ####服务端####
- import socketserver
- class FtpServer(socketserver.BaseRequestHandler):
- def handle(self):
- print(self.request) #conn
- print(self.client_address)
- while True:
- data = self.request.recv(1024)
- self.request.send(data.upper())
- if __name__ == '__main__':
- s = socketserver.ThreadingTCPServer(('127.0.0.1',8080),FtpServer)
- s.serve_forever() #链接循环就有了
- ####客户端1####
- # import socket
- from socket import *
- client = socket(AF_INET,SOCK_STREAM)
- client.connect(('127.0.0.1',8080))
- while True:
- msg = input('>>: ')
- client.send(msg.encode('utf-8'))
- data = client.recv(1024)
- print(data)
- ####客户端1####
- # import socket
- from socket import *
- client = socket(AF_INET,SOCK_STREAM)
- client.connect(('127.0.0.1',8080))
- while True:
- msg = input('>>: ')
- client.send(msg.encode('utf-8'))
- data = client.recv(1024)
- print(data)
- """
- socketserver可以实现多并发,即一个服务端同时和多个客户端进行通信
- """
远程执行
- ###远程执行命令-server端###
- import socket
- import subprocess
- import struct
- import json
- phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM)#买手机
- '''AF_INET:地址家族; SOCK_STREAM:TCP协议'''
- phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
- '''用来解决报错:ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''
- phone.bind(('127.0.0.1',8080))#插卡
- phone.listen(5) #开机(监听)
- '''listen(5):等待客户端连接的最大连接数(可自定义数值)'''
- while True: #链接循环
- conn,addr=phone.accept()#接电话(3次握手建立连接)
- print('client: ',addr)
- while True: #通讯循环
- try:
- cmd = conn.recv(1024) #说话(收消息)
- if not cmd:break #针对Linux,客户端断开链接的异常处理
- print('from client msg: %s' %cmd)
- res = subprocess.Popen(cmd.decode('utf-8'),
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE
- )
- err = res.stderr.read()
- if err:
- back_msg = err
- else:
- back_msg = res.stdout.read()
- #解决长度局限
- #第一阶段:制作报头
- head_dic = {
- 'data_size':len(back_msg)
- }
- head_json = json.dumps(head_dic)
- head_bytes = head_json.encode('utf-8')
- '''添加解决粘包代码'''
- # conn.send(struct.pack('i',len(back_msg))) #传数据的长度(有局限)
- #第二阶段:发送报头的长度
- conn.send(struct.pack('i',len(head_bytes)))
- # conn.send(back_msg)
- # 第三阶段:发报头
- conn.send(head_bytes)
- #第四阶段:发真实数据
- conn.sendall(back_msg)
- except Exception: #异常捕捉
- break
- conn.close()#挂电话
- phone.close()#关手机
- ###远程执行命令-client端###
- import socket
- import struct
- import json
- client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
- client.connect(('127.0.0.1',8080))
- while True:
- cmd= input('>>>: ').strip()
- if not cmd:continue
- client.send(cmd.encode('utf-8'))
- #解决粘包注释的改动部分(注释掉)
- # res=client.recv(1024)
- # print(res.decode('gbk'))
- '''通过定义传输数据文件大小来解决粘包'''
- # data = client.recv(4)
- # data_size=struct.unpack('i',data)[0]
- ###优化:接收头的长度
- head = client.recv(4)
- head_size = struct.unpack('i',head)[0]
- ###收报头(根据报头长度)
- head_bytes = client.recv(head_size)
- head_json = head_bytes.decode('utf-8')
- head_dic= json.loads(head_json)
- data_size = head_dic['data_size'] #取真实数据
- """大数据量传输(收真实数据)"""
- recv_size = 0
- recv_bytes = b''
- while recv_size < data_size:
- res=client.recv(1024)
- recv_bytes+=res
- recv_size+=len(res)
- print(recv_bytes.decode('gbk'))
- # res=client.recv(data_size)
- # print(res.decode('gbk'))
Python之旅Day8 socket网络编程的更多相关文章
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- Python面向对象进阶和socket网络编程-day08
写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __init__(self ...
- NO.8:自学python之路------并行socket网络编程
摘要 一到放假就杂事很多,这次的作业比较复杂,做了一个周,进度又拖了.不过结果还不错. 正文 粘包 在上一节中,如果连续发送过多数据,就可能发生粘包.粘包就是两次发送的数据粘在一起被接收,损坏了数据的 ...
- Python之路,Day8 - Socket编程进阶
Python之路,Day8 - Socket编程进阶 本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- 从零开始学Python第八周:网络编程基础(socket)
Socket网络编程 一,Socket编程 (1)Socket方法介绍 Socket是网络编程的一个抽象概念.通常我们用一个Socket表示"打开了一个网络链接",而打开一个Soc ...
随机推荐
- WPF 初识
1.WPF 与Winform比较 1.1.WPF所有的操作都不依赖于GDI和GDI+,而是间接依赖于强大的Direct3D,这就意味着通过WPF可以做出以前WinFrom无法想象的视觉效果,包括3D效 ...
- 23. Merge k Sorted Lists (JAVA)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 19-01【vmware machine】虚拟机无法联网访问
问题 我本地的虚拟机上没办法访问外网,然后搞了很久很久,最终解决了. 现象 A,电脑持续运行了三天,也没有复杂的环境调整的情况下.我本地的ubuntu(使用VMWare machine创建的),突然没 ...
- 探索未知种族之osg类生物---渲染遍历之裁剪二
前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...
- python基础 (初识函数&函数进阶)
函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
- C51汇编典型代码&一些org-mode技巧
C51汇编典型代码&一些org-mode技巧 文档存放 具体内容可见存放的数据. 下面主要介绍关键代码. ASM 部分 1;; LCD数据发送========================= ...
- Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
虚拟机恢复快照后,使用yum安装软件,提示下面的信息,开始以为是yum源的问题或者DNS的问题,但是无果,最后再看一下服务器的时间,坑了,还原快照,时间变成以前的了. [root@localhost ...
- Chapter5_初始化与清理_方法重载
方法重载是java中编译器在方法调用时采用的一个重要机制.起初方法重载的初衷是方便构造器的调用,比如对于一个类,可以实现用不同的方法来初始化它,又由于构造器的名称都是一样的,所以必须使用到方法重载的机 ...
- 基于grafana+telegraf的服务器监控方案
准备工作:安装InfluxDb 1 Windows 1.1 下载agent https://dl.influxdata.com/telegraf/releases/telegraf-1.10 ...
- IDEA中通过工具类实现对数据库的增删改查
package com.hu.dao; import com.hu.entity.Student; import java.util.List;import java.util.Map; public ...