socket

解决粘包-简单版本

喜你入骨 提交于 2020-02-03 17:29:32
服务端:import socketimport subprocessimport struct#简易版缺点:struct 的数据i需要在4以内,如果发送的数据较大,会超过I,无法发送。因此需要优化#创建套接字server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind(('192.168.43.177',8093))server.listen(5)while True: conn,addr = server.accept() while True: try: cmd = conn.recv(8086) if not cmd :break obj = subprocess.Popen(cmd.decode('utf-8'),shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) stdout = obj.stdout.read() stderr = obj.stderr.read() #3.把命令的结果返回给客户端 #第一步:制作固定长度的报头 total_size = len(stdout)+len(stderr) header = struct.pack('i',total_size) print(stdout) conn

Python3 UNIX domain sockets使用代码实现

早过忘川 提交于 2020-02-03 15:50:14
一、说明 背景一:大学的时候学网络编程,经常看到说socket有AF_UNIX、AF_INET和AF_INET6三个协议族,AF_UNIX一般不用、AF_INET是IPv4的、AF_INET6是IPv6的。基于这种说教一直以来写网络编程,上来协议族就写AF_INET,AF_UNIX是什么怎么用一直没深究。 背景二:毕业后多接触Linux,也经常用netstat看端口监听情况,在较长一段时间内也不懂“netstat -ltnp”、"netstat -unp",上来就是“netstat -anp”。这样导致的问题就是在最后总是有“Active UNIX domain sockets”一项,而且经常占很长的一个版面,要往前拉很久才能看到前面的tcp和udp。 背景三:今天早上看《Linux内核源代码情景分析》的进程间通信章节,发现AF_UNIX和UNIX domain sockets竟是一个东西,同时解决了两个困惑,真想击节称叹。 二、使用代码实现 2.1 服务端示例代码 import socket class SocketServer: def __init__(self): # 常规tcp监听写法 # server_address = ('127.0.0.1', 9999) # socket_family = socket.AF_INET # socket_type = socket

Socket抽象层

旧时模样 提交于 2020-02-03 15:19:18
目录 Socket抽象层 一、Socket抽象层 Socket抽象层 一、Socket抽象层 我们知道两个进程如果需要进行通讯最基本的一个前提是能够唯一标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用IP地址+协议+端口号唯一标示网络中的一个进程。 能够唯一表示网络中的进程后,它们就可以利用Socket进行通信了,什么是Socket呢?我们经常把Socket翻译为套接字,Socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。 [ rk) Socket起源于UNIX,在Unix一切皆文件哲学的思想下,Socket是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。 来源: https://www.cnblogs.com/randysun/p/12255672.html

python网络编程

谁说我不能喝 提交于 2020-02-03 15:17:27
一:进程间的通信   1.本地进程间的通信   消息传递(管道,FIFO,消息队列)   同步(互斥量,条件变量,读写锁,文件和写记录锁,信号量)   共享内存(匿名的和具名的) 远程过程调用      2.网络进程间的通信   网络上的进程对得唯一区分,这样才能进行网络间的通信,比如QQ,微信聊天等等。而可以唯一区分的是进程的ip地址(互联网协议地址),协议,端口(设备与外界通讯的出口)。Python进行网络编程,就是在Python程序本身这个进程内,连接别的服务器进程的通信端口进行通信。 二:软件开发的架构   1.B/S架构(浏览器端、服务器端)   2.C/S架构(客户端、服务器端)   2.1 socket套接字就是,应用程序通过套接字向网络发出请求或者应答网络请求,使主机间或者计算机间的程序可以相互通信。 应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。   2.2 socket()函数     socket

# 2017-2018-1 20155324 实验五 通信协议设计

被刻印的时光 ゝ 提交于 2020-02-03 12:54:09
2017-2018-1 20155324 实验五 通信协议设计 任务一 在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作业 实验步骤 安装~OpenSSL~ OpenSSL是一个SSL协议的开源实现,采用C语言作为开发语言,具备了跨平台的能力,支持Unix/Linux、Windows、Mac OS等多种平台。 前往OpenSSL官网,下载OpenSSL源码,下载压缩包“openssl-master.zip 在Linux下使用~unzip openssl-master.zip~命令解压 进入源代码目录~cd openssl-1.1.0-pre1~ 使用如下命令进行安装: $ ./config $ make $ make test $ make install 编写一个测试代码test_openssl.c: #include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; } 使用~gcc -o test_openssl test_openssl.c -L/usr/local/ssl/lib -lcrypto -ldl -lpthread~命令编译,生成“test_openssl”可执行文件

基于RT-Thread系统使用 QEMU 运行 RT-Thread 提供的基于多线程的非阻塞 socket 编程

一曲冷凌霜 提交于 2020-02-03 03:58:32
多线程非阻塞网络编程 简介: 在实际开发中,往往要求网络传输时不能阻塞当前线程,以致无法及时处理其他消息。在用户无法直接套用简单的 socket demo 时,RT-Thread 提供基于多线程的非阻塞 socket 编程示例,方便用户进行应用程序开发。 在 RT-Thread 使用 socket 网络编程时,当一个任务调用 socket的 recv()函数接收数据时,如果 socket 上并没有接收到数据,这个任务将阻塞在这个 recv() 函数里。这个时候,这个任务想要处理一些其他事情,例如进行一些数据采集,发送一些额外数据到网络上等,将变得不可能了。与此同时,其他线程也需要将数据上传同一个服务器,如果直接多个线程共同使用一个 socket 操作,这将会破坏底层 lwip 的消息事件模型。 客户端使用流程: socket() 创建一个 socket,返回套接字的描述符,并为其分配系统资源。 connect() 向服务器发出连接请求。 send()/recv() 与服务器进行通信。 closesocket() 关闭 socket,回收资源。 服务器使用流程: socket() 创建一个 socket,返回套接字的描述符,并为其分配系统资源。 bind() 将套接字绑定到一个本地地址和端口上。 listen() 将套接字设为监听模式并设置监听数量,准备接收客户端请求。 accept

python-网络编程学习笔记

时间秒杀一切 提交于 2020-02-03 01:08:14
import socketimport timeimport loggingFORMAT = "%(asctime)s %(thread)d %(message)s"logging.basicConfig(level=logging.INFO,format=FORMAT)#TCP seversock =socket.socket() #1 创建socket对象ip ='127.0.0.1'port =8000addr =(ip,port)sock.bind(addr) #2 IP PORT 绑定sock.listen() #3 PORT监听conn,clientinfo =sock.accept() #建立连接 阻塞在中logging.info(conn)logging.info(clientinfo)data =conn.recv(1024) #接收数据logging.info(data.decode())msg = "kanghaibin"conn.send(msg.encode()) #发送数据conn.close()sock.close() #关闭连接--------------------------------------------------- 来源: https://www.cnblogs.com/centos-kang/p/12254366.html

3分钟接入socket.io使用

可紊 提交于 2020-02-02 23:35:05
WebSocket 简介 传统的客户端和服务器通信协议是HTTP:客户端发起请求,服务端进行响应,服务端从不主动勾搭客户端。 这种模式有个明显软肋,就是同步状态。而实际应用中有大量需要客户端和服务器实时同步状态的场景,比如聊天室、股票行情、在线共享文档等都需要客户端实时拿到服务器的最新状态。 针对这种实时同步的需求,一种简单的方式是轮询,比如每隔5s发一次http请求去拿服务器最新的状态数据。但这种方式会存在数据延迟,浪费带宽等副作用。 更完美的方式是使用WebSocket,浏览器原生支持,W3C标准协议,客户端和服务器建立持久性连接可以互发消息。 socket.io 简介 socket.io 是一个类库,内部封装了WebSocket,可以在浏览器与服务器之间建立实时通信。 如果某些旧版本的浏览器不支持WebSocket,socket.io会使用轮询代替。另外它还具有可发送二进制消息、多路复用、创建房间等特性,因此相比直接使用原生WebSocket,socket.io是更好的选择。 开发一个实时应用主要分两部分:服务端和客户端,socket.io分别提供了相应的npm包供我们方便地调用。 接下来就通过一个生动形象且有趣的栗子分别介绍这两大块。 现在假设李白,瑶,吕布,后羿,貂蝉5个人加入了一个叫 KPL 的房间,在文章结束时我们将拥有一个麻雀虽小五脏俱全的峡谷英雄在线聊天室

Python Socket编程

时间秒杀一切 提交于 2020-02-02 21:04:54
因需要做一个监测TCP数据内容的小插件,学习了局域网内部的封装好的传输软件Socket: 一、Socket的简介如下: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 建立网络通信连接至少要一对端口号(socket)。 socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员 做网络开发所用的接口,这就是Socket编程接口; HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机, 提供了网络通信的能力。 二、Socket的操作流程如下: 如上图所示:TCP客户端和TCP服务器端都需要进行上述的步骤 TCP服务端的配置步骤: Step1: 建立Socket对象 Sk = socket.socket() Step2: 把一个地址族中的特定地址赋给socket Sk.bind((host,port)) Step3: 开启监听进程等待客户端链接服务端 Sk.listen(1) Step4: 接受客户端的申请,获取客户端的IP地址及其端口PORT clnt, addr = Sk.accept() Step5: 建立好连接之后,等待接受客户端的数据 data = clnt.recv(1024) Step6: 应答客户机的请求,将对应的数据发回去 clnt.sendall(data) Step7:

TCP模擬BS服務器

混江龙づ霸主 提交于 2020-02-02 09:16:04
package IOStream ; import java . io . * ; import java . net . ServerSocket ; import java . net . Socket ; /* 创建BS版本TCP服务器 */ public class BSTCPTest { public static void main ( String [ ] args ) throws IOException { //创建一个服务器ServerSocket,和系统要指定的端口号 ServerSocket server = new ServerSocket ( 8080 ) ; /* 浏览器解析服务器回写的html页面,页面中如果有图片,那么浏览器就会单独的开启一个线程,读取服务器的图片 我们就的让服务器一直处于监听状态,客户端请求一次,服务器就回写一次 */ while ( true ) { //使用accept方法获取到请求的客户端对象(浏览器) Socket socket = server . accept ( ) ; new Thread ( new Runnable ( ) { @Override public void run ( ) { try { //使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象