通信嘛,那自然就是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") )
效果图