C++ 和 Python 的“交易” —— win+python 和 linux+c++的通信

4 篇文章 0 订阅
2 篇文章 0 订阅

通信嘛,那自然就是TCP UDP,不过有个框架,ZEROMQ,实现了在不同操作系统上的网络层绑定,十分十分十分好用

采用的req-rep 应答模式,外加多帧消息,第一帧发送消息长度,服务器动态对客户端的消息扩容

 linux+c+++zmq

g++ python-server.cpp -o pss -lzmq

#include<iostream>
#include<zmq.h>
#include<sstream>
#include<cstdio>
using namespace std;
int main(){
    void *ctx=zmq_ctx_new();
    void *socket=zmq_socket(ctx,ZMQ_REP);
    int rc=zmq_bind(socket,"tcp://*:5555");
    stringstream os;
    cout<<rc<<endl;
    int client_len=0;
    char *buffer=nullptr;
    while(true){
        os.str("");
        os.clear();     //必须clear & str("") 否则下一次循环他依旧会保持上一个的状态
        char len[8]={0};  //第一个消息帧接受消息大小,动态适应客户端的消息量
        zmq_recv(socket,&len,8,0);
        os<<len;
        int tmp_len;
        os>>tmp_len;//客户端告知客户端的消息长度后,我们这里使用stringstream转换成数字,新建一个数组来保存它
        if(tmp_len>client_len){ //如果目前已经申请的数组大小比将要接受的消息小,那么就重新申请,扩充buffer区,避免每一次都delete[]的性能消耗
            cout<<"缓冲区不足,重新分配";
            delete[] buffer;
            buffer=new char[tmp_len+1];
            client_len=tmp_len; //更新目前buffer的最大长度
        }
        
        buffer[tmp_len]='\0';//给字符串末尾充0
        zmq_recv(socket,buffer,tmp_len,0);   //接受消息
        printf("python发送的消息为:%s  长度为:%d,目前缓冲区大小为:%d\n",buffer,tmp_len,client_len);
        zmq_send(socket,"server",11,0);

    }

    return 0;
}

windows下安装了pyzmq的python

import zmq
import os
import time
ctx=zmq.Context()
socket=ctx.socket(zmq.REQ)
socket.connect("tcp://192.168.223.128:5555")

while True:
    msg=input()

    #ilen=len(msg)              这个方法不会正确的计算中文的长度
    ilen=len(msg.encode("utf-8"))  #需要用这个方法才能正确的计算中文长度,当然如果你只有发送英文数字的需求的话就没必要弄这条
    blen=str(ilen).encode(); #把字符串的长度转换成字符串再转换成bytes
    socket.send(blen,zmq.SNDMORE)  #第一帧把消息长度发过去
    socket.send(msg.encode(),0) #第二帧把消息发过去
    msg=socket.recv()
    print("server: %s"% msg.decode("utf-8") )
    

效果图

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值