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网络编程的更多相关文章

  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. gitlab-ci.xml:script config should be a string or an array of strings

    The following command in a job script: STATUS_ID=$(grep -Eo "Status Code [0-9]+: Done" som ...

  2. SwipeBackLayout 右滑退出Activity

    不推荐通过添加依赖的方式来导入类库,因为本人导入后出现没法解决的问题. 这里推荐自己导入第三方库类,地址如下: https://github.com/yangzhilong00/MEvolution/ ...

  3. LeetCode解题录-1~50

    [leetcode]1. Two Sum两数之和 Two Pointers, HashMap Easy [leetcode]2. Add Two Numbers两数相加 Math, LinkedLis ...

  4. echarts 图表重新加载,原来的数据依然存在图表上

    问题 在做一个全国地图上一些饼图,并且向省一级的地图钻取的时候,原来的饼图依然显示 原因 echars所有添加的图表都在一个series属性集合中,并且同一个echars对象默认是合并之前的数据的,所 ...

  5. 通过maven-assembly-plugin将Springboot项目打包成tar.gz压缩包,在Linux环境可执行脚本直接安装成系统服务

    1.在pom.xml中添加maven-assembly-plugin依赖,同时需将默认生成的spring-boot-maven-plugin依赖删除,否则最终打出的发行包启动会有问题 <plug ...

  6. 基于SoftRoCE 了解RDMA

    RDMA是基于IB技术的内存直接传送,无需内核参与,硬件网卡搞定.IB需要HPC领域的专用硬件,ROCE则是RDMA协议在普通以太网卡的实现,RoCEv1是在MAC上的二层封装,局域网内可以,要通过路 ...

  7. iptables命令提取总结,包含扩展模块<取自朱双印博客>

    以下内容只是一些命令相关的,以朱双印博客中的iptables的教程提取出来的.纯粹只是命令的总结,如果需要看理论的知识,建议去看朱老师的博客,目前还没有看到写得比这个好的了. <http://w ...

  8. Python 判断文件是否存在

    参考:https://www.cnblogs.com/jhao/p/7243043.html

  9. JAVA解决前端跨域问题。

    什么是跨域? 通俗来说,跨域按照我自己的想法来理解,是不同的域名之间的访问,就是跨域.不同浏览器,在对js文件进行解析是不同的,浏览器会默认阻止,所以 现在我来说下用java代码解决前端跨域问题. 用 ...

  10. 星星打分,今天我们就用Jq代码来实现,看看究竟是如何实现的 其中有两个重要的事件mouseenter和mouseleave效果如下图

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...