1. Scoket概念:

    socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。 建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。(利用IP和端口实现两个设备的通信)。

  2. Socket核心方法:

    接收端:
    import socket
    socket.TCP/IP
    listen(ip,port)
    waiting()#等待数据
    recv()#接收数据
    send()#再发送数据
    发送端:
    import socket
    socket.TCP/IP
    connect(a.ip,a.port)#接受端主机的IP,端口(port:端口号)
    socket.send(hello)#发送的数据sendall()名义上是一次性发送所有的数据,但是由于系统原因还是有限制的
    socket.recv()#接收数据
    socket.close()#关闭
  3. 实例列举:

    服务器端:
    import socket
    server=socket.socket()#设置连接
    server.bind((“localhost”,8888))#绑定连接(参数是一个元组)
    server.listen(5)#监听
    conn,addr=server.accept()#等待
    data=conn.recv(1024)#接收(是byte类型的,需要转换(一般编为utf-8))
    conn.sendall(data)#一次性发送所有数据(由于系统原因,是发送不了所有的数据的)
    server.close()
    客户端:
    import socket
    client=socket.socket()
    client=connect((“localhost”,8888))#建立连接,参数是一个元组
    data=input().strip()#手工输入的是unicode类型,但是再传输的时候是要编码的
    client.send(data.encode(“utf-8”))#发送数据
    data=client.recv(1024)#收到的数据是utf-8编码的,所以直接输出是乱码
    client.close()
  4. 粘包:

    当你连续的调用send()时,由于接收时recv()有大小限制,会发生发送的数据量大于接收的数据量,导致接收的数据不是你期待的数据,这个时候就发生了粘包(两次发送的数据被同一次接收) 为了避免这种错误,我们通常会设计反馈,即你发送一次数据,我们会吧发送的数据反馈给发送给你。这样两次发送中间夹杂着一次接收,避免了数据在缓冲中导致粘包。

  5. 一些注意的地方:

  • 发送与接收的类型:

我们在Python3中,默认是Unicode,而在发送数据(send)时,函数send()的参数类型是:Byte,所以我们要进行数据的转换:

str==>bytes bytes==>str

a=”qweqwe”  =>a的类型为str

str==>bytes

b=a.encode(“utf-8”)

b=b”hello word”  =>b为bytes类型

bytes==>str

s=b.decode(“utf-8”)

  • 数据的校验:

字符串类型的,我们可以利用hashlib包中的md5算法来检验

文件类型的,我们可以对比两个文件的区别:

diff file1 file2

观察两个文件是否一致(文件检测)

SocketServer:

这个比较方便,它集成了一些东西,很方便的,只是server端改变了一下书写方式,客户端不用改变

代码如下:

#this is server
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):#类名随意,但是继承的不能改变
def handle(self):#系统会自动调用这个函数,我们只需要在这个函数中写我们要实现的方法就可以了
while True:
try:
self.data=self.request.recv(1024).strip()
print("{} wrote".format(self.client_address))
print(self.data)
self.request.send(self.data.upper())
except ConnectionResetError as e:
print("error: ",e)
break
if __name__ =="__main__":
HOST,PORT="localhost",9999#声明IP与端口
server=socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)#设置连接
server.serve_forever()#建立连接,然后系统在连接成功以后会自动调用函数handle()
#this is client
import socket
client=socket.socket()
client.connect(("localhost",9999))
while True:
cmd=input(">>").strip()
if cmd =="":
continue
client.send(cmd.encode())
data=client.recv(1024)
print(data)

附:

socket一个最简单的通信:

#服务器端:
import socket
server=socket.socket()
server.bind(("localhost",8888))
server.listen()
conn,addr=server.accept()
count=10
while count:
data=conn.recv(1024)
print(data.decode("utf-8"))
conn.send(data)
count-=1
server.close()
#客户端
import socket
client=socket.socket()
client.connect(("localhost",8888))
while True:
chioce=input(">>").strip()
client.sendall(chioce.encode("utf-8"))
data=client.recv(1024)
if not data:
break
print(data.decode("utf-8"))
client.close()

Socket简单实现ssh笔记的更多相关文章

  1. 运用socket实现简单的ssh功能

    在python socket知识点中已经对socket进行了初步的了解,那现在就使用这些知识来实现一个简单的ssh(Secure Shell)功能. 首先同样是建立两个端(服务器端和客户端) 需求是: ...

  2. Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据

    实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...

  3. 网络编程基础【day09】:实现简单地ssh(四)

    本节内容 概述 简单ssh socket接收大数据的困惑 一.概述 我们用过linux的就知道什么是ssh,它是一种客户端和服务端交互返回的一个解决,输入一个命令,给我返回什么,接下来我们说一说,如何 ...

  4. FreeBSD简单配置SSH并用root远程登陆方法

    FreeBSD简单配置SSH并用root远程登陆方法 前言:最近下载了FreeBSD,在虚拟机上安装,第一步先要开启SSH服务,用终端putty软件可以实现在windows系统进行远程管理, 初级 = ...

  5. 简单脱壳教程笔记(2)---手脱UPX壳(1)

    本笔记是针对ximo早期发的脱壳基础视频教程,整理的笔记. ximo早期发的脱壳基础视频教程 下载地址如下: http://down.52pojie.cn/%E5%90%BE%E7%88%B1%E7% ...

  6. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  7. ContOS网络连接及简单的ssh Xshell连接!

    这边简单的记录一下下ContOS网络连接及简单的ssh Xshell连接! 首先你得安装一个Contos Linux系统对吧! 1.找到设置--->网络-->有线连接-->IPv4 ...

  8. Python网络编程02 /基于TCP、UDP协议的socket简单的通信、字符串转bytes类型

    Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes类型 目录 Python网络编程02 /基于TCP.UDP协议的socket简单的通信.字符串转bytes ...

  9. C# .NET Socket 简单实用框架,socket组件封装

    参考资料 https://www.cnblogs.com/coldairarrow/p/7501645.html 根据.NET Socket 简单实用框架进行了改造,这个代码对socket通信封装还是 ...

随机推荐

  1. 【koa2】用户注册、登录校验与加盐加密

    加密与解密 先介绍一下关于服务端用户名跟密码的存储状态,我们知道当前端在注册一个新用户时,会在表单内填入用户名和密码,并通过post请求提交到服务器,服务器再把用户名和密码从ctx.request.b ...

  2. ArcGIS api for JavaScript 3.27 在线浏览的一些小部件

    var navOption; var navToolbar;// 当前选择的操作 require( [ "esri/toolbars/navigation", "esri ...

  3. 【Gradle】Android Gradle 插件

    Android Gradle 插件 Android Gradle 插件简介 从Gradle角度来看,Android其实是Gradle的一个第三方插件,它是由Google的Android团队开发的.但从 ...

  4. 使用Settings sync同步VS Code配置

    使用Settings sync同步VS Code配置 因为要在多台电脑上使用VSCode,想要简单地管理VSCode地配置,不用每次手动去一一配置,保持多个开发环境的同步,于是使用Settings s ...

  5. 解决element-ui的表格设置固定栏后,边框线消失的bug

    如上图所示,边框线消失了,解决方法如下 添加css代码,如果是修改全局,则到全局样式文件添加 .el-table__row{ td:not(.is-hidden):last-child{ right: ...

  6. LogMiner Utility Release 8i - 11g (Doc ID 291686.1)

    LogMiner Utility Release 8i - 11g (Doc ID 291686.1) APPLIES TO: Oracle Database Exadata Cloud Machin ...

  7. (办公)mysql索引

    举个例子:20多w的数据,查询语句,什么都没有查到,既没有走到主键索引,普通索引,什么都没走,走的就非常慢. 下面要加索引,并了解mysql索引的作用,以及如何使用他们索引. 介绍MysqlMySQL ...

  8. 以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取【原创】

    以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号 ...

  9. I2C协议学习笔记

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/wzt_007/article/detai ...

  10. 【转】Cookie和Session和Cache

    1 Cookie和Session Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实 ...