TCP Server 实现 RPN计算器(Python)
简单使用Python语言在TCP Server上实现了RPN计算器,默认端口号为65432
客户端通过建立TCP连接到服务器上用户指定的特定端口来发起请求。建立连接后,客户端将函数发送给服务器,服务器进行计算并返回结果。服务器一次只处理一个操作。服务器以FCFS方式服务客户端,每次只处理一个客户端,忽略它在服务客户端时收到的任何连接请求。
客户端和服务器通过发送ASCII消息进行通信。服务器向服务器发送RPN函数,服务器发送RPN函数的执行结果。
rpnserver.py
import socket
import sysHOST='127.0.0.1'
BUFF_SIZE=1024
OVERFLOW='OVERFLOW'
if(len(sys.argv)<=1):print ('Using default port number:65432')PORT=65432
elif(len(sys.argv)==2):PORT=int(sys.argv[1])#initialize socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))while True:#wait for client connections.listen(1)conn,addr=s.accept()print ("==============================================")#keep receiving instructions from clientwhile True:recv_str=conn.recv(BUFF_SIZE)#send acknowledgementif(recv_str==''):conn.close()breakout='Server Recieved:"'+recv_str+'"'print (out)#do the calculationdata=recv_str.split()op1=int(data[0])op2=int(data[1])if data[2]=='+':result=op1+op2elif data[2]=='-':result=op1-op2elif data[2]=='*':result=op1*op2elif data[2]=='/':if(op1*op2<0 and op1%op2!=0):#6/-132=0result=op1/op2+1else:result=op1/op2#OVERFLOW caseif(sys.getsizeof(result)>BUFF_SIZE):conn.send(OVERFLOW)else:conn.send(str(result))
rpnclient.py
import socket
import sysHOST='127.0.0.1' #server's hostname or IP address
PORT=int(sys.argv[1]) #server port
BUFF_SIZE=1024
OVERFLOW='OVERFLOW'#initialize client
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
if(len(sys.argv)<3):print ('No input function.')sys.exit()
input_str=sys.argv[2].split()stk=[]
for cnt in range(len(input_str)):c=input_str[cnt]if(c.lstrip('-').isdigit()):stk.append(int(c))if(cnt==len(input_str)-1):print ("Input syntex error: no enough operators.")else:if(len(stk)<2 or (c!='+' and c!='-' and c!='*' and c!='/')):print ('Input syntex error at',c)s.close()breaknum2,num1=stk.pop(),stk.pop()if(c=='/' and num2==0):print ('Can not devide by 0.')s.close()breakstring=str(num1)+' '+str(num2)+' '+cif(sys.getsizeof(string)>BUFF_SIZE):print ('Exceeds buffer size.')s.close()sys.exit()s.send(string)#wait for server to calculateresult=s.recv(BUFF_SIZE)#overflowif(result==OVERFLOW):print ('Result exceeds buffer size.')s.close()else:if(cnt==len(input_str)-1):out='Client Received Final:'+resultif(len(stk)!=0):print ('Input syntex error: no enough operators.')print (out)s.close()#send a NULL string to serverelse:out='Client Received:'+resultprint (out)stk.append(int(result))
——客户端
客户端每次处理一个RPN函数,计算完成后立即退出程序并显示结果。当它关闭套接字时,它向服务器发送一个EOF消息。客户端是无状态的。
——服务器
服务器有四种状态:等待客户端,等待功能,计算和关闭。
等待客户端-服务器侦听端口并等待连接请求。它建立了与第一个来的客户的联系。
Waiting for function—在此状态下,服务器侦听来自客户端的请求。在接收到函数消息时,它转换为计算格式。当服务器收到EOF消息时,它关闭连接并切换到等待客户端模式。
计算-服务器读取输入函数,计算并将结果返回给客户端。然后返回到等待函数模式。
关闭-用户可以关闭服务器,只要他们想按^c。
sample:
sample1
sample2
sample3
sample4
sample5
sample6
TCP Server 实现 RPN计算器(Python)相关推荐
- 利用云服务器和Python架设TCP Server控制ESP8266单片机
目录 1.前言 2.控制架构 3.代码 4.控制效果 5.参考 1.前言 之前我做了个利用小爱同学+ESP8266控制电灯的装置:使用小爱同学+ESP8266+舵机控制家里的电灯_斌96的博客-CSD ...
- epoll 入门例子 tcp server/client
原文: https://rebootcat.com/2020/09/26/epoll_examples/ 复习一下 上一篇博文 epoll原理深入分析 详细分析了 epoll 底层的实现原理,如果对 ...
- 基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程(转)...
源:基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程 转载于:https://www.cnblogs.com/LittleTig ...
- linux c语言tcp,我个人的Linux TCP server和client测试源码,C语言(2)(★firecat推荐★)...
1.直接上TCP Server源码,这种方法没有使用向muduo那样的活塞式buffer,可谓简单粗暴: #include #include #include #include #include #i ...
- python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习
Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...
- nodejs TCP server和TCP client如何建立连接
首先客户端和服务器端通信得需要一个消息结构,我用如下的构造函数创建一个消息结构,包含消息正文和消息类型(method): function message(_data,_method = '') {_ ...
- socket 编程入门教程(一)TCP server 端:1、建模
绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分 ...
- Modbus协议栈开发笔记之三:Modbus TCP Server开发
在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这 ...
- 在SQL Server 2017上充分利用Python
介绍 (Introduction) One of the new features announced with SQL Server 2017 is support for the Python l ...
- 在SQL Server 2017中使用Python进行数据插值和转换
As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...
最新文章
- Label 的作用是什么,是怎么用的?
- 菜菜从零学习WCF十(序列化)
- Java如何转换protobuf-net中的bcl.Decimal对象
- mysql半同步复制
- python histo 改变 bins 大小_在Python中显示具有非常不均匀的bin宽度的直方图
- kafka分区与分组原理_大数据技术-Kafka入门
- 【AI视野·今日NLP 自然语言处理论文速览 第五期】Thu, 10 Jun 2021
- win8学习--------计时器
- vaspkit使用_VASP 的光学性质计算及 vaspkit 的安装与使用
- Linux命令:find
- 【递归,Java从入门到精通第五版pdf百度云
- Linux终端删除文件夹命令
- STM32F401RE Nucleo 在 keil MDK上的使用
- linux用光盘安装系统时需要如何设置,Linux如何设置光盘启动
- Linux系统管理员对普通用户的基本操作
- 2019年中南大学研究生复试机试题 题解
- php 发 语音验证码,分享一下子语音验证码的php开发流程
- 〖Python零基础入门篇㉟〗- 私有函数、私有变量及封装
- fortran教程9:和C语言混合编程
- STM32使能/屏蔽外部中断