简单使用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)相关推荐

  1. 利用云服务器和Python架设TCP Server控制ESP8266单片机

    目录 1.前言 2.控制架构 3.代码 4.控制效果 5.参考 1.前言 之前我做了个利用小爱同学+ESP8266控制电灯的装置:使用小爱同学+ESP8266+舵机控制家里的电灯_斌96的博客-CSD ...

  2. epoll 入门例子 tcp server/client

    原文: https://rebootcat.com/2020/09/26/epoll_examples/ 复习一下 上一篇博文 epoll原理深入分析 详细分析了 epoll 底层的实现原理,如果对 ...

  3. 基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程(转)...

    源:基于原子探索者stm32f407开发板的ucos-iii+lwip1.4.1的tcp server并发服务器完美解决例程 转载于:https://www.cnblogs.com/LittleTig ...

  4. linux c语言tcp,我个人的Linux TCP server和client测试源码,C语言(2)(★firecat推荐★)...

    1.直接上TCP Server源码,这种方法没有使用向muduo那样的活塞式buffer,可谓简单粗暴: #include #include #include #include #include #i ...

  5. python中引入sql的优点_SQL Server 2017中的Python:增强的数据库内机器学习

    Microsoft SQL Server是一款优秀的关系型数据库管理系统,Python是目前流行的数据科学语言之一,拥有丰富的库生态系统.从SQL Server 2017的CTP 2.0版本开始,可以 ...

  6. nodejs TCP server和TCP client如何建立连接

    首先客户端和服务器端通信得需要一个消息结构,我用如下的构造函数创建一个消息结构,包含消息正文和消息类型(method): function message(_data,_method = '') {_ ...

  7. socket 编程入门教程(一)TCP server 端:1、建模

    绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中的一小部分 ...

  8. Modbus协议栈开发笔记之三:Modbus TCP Server开发

    在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这 ...

  9. 在SQL Server 2017上充分利用Python

    介绍 (Introduction) One of the new features announced with SQL Server 2017 is support for the Python l ...

  10. 在SQL Server 2017中使用Python进行数据插值和转换

    As a continuation to my previous article, How to use Python in SQL Server 2017 to obtain advanced da ...

最新文章

  1. Label 的作用是什么,是怎么用的?
  2. 菜菜从零学习WCF十(序列化)
  3. Java如何转换protobuf-net中的bcl.Decimal对象
  4. mysql半同步复制
  5. python histo 改变 bins 大小_在Python中显示具有非常不均匀的bin宽度的直方图
  6. kafka分区与分组原理_大数据技术-Kafka入门
  7. 【AI视野·今日NLP 自然语言处理论文速览 第五期】Thu, 10 Jun 2021
  8. win8学习--------计时器
  9. vaspkit使用_VASP 的光学性质计算及 vaspkit 的安装与使用
  10. Linux命令:find
  11. 【递归,Java从入门到精通第五版pdf百度云
  12. Linux终端删除文件夹命令
  13. STM32F401RE Nucleo 在 keil MDK上的使用
  14. linux用光盘安装系统时需要如何设置,Linux如何设置光盘启动
  15. Linux系统管理员对普通用户的基本操作
  16. 2019年中南大学研究生复试机试题 题解
  17. php 发 语音验证码,分享一下子语音验证码的php开发流程
  18. 〖Python零基础入门篇㉟〗- 私有函数、私有变量及封装
  19. fortran教程9:和C语言混合编程
  20. STM32使能/屏蔽外部中断

热门文章

  1. Pytorch损失函数BCELoss,BCEWithLogitsLoss
  2. 损失函数——交叉熵由来
  3. MySQL必知必会(二)
  4. 《MySQL技术内幕(SQL编程)》——查询处理
  5. 博文视点大讲堂第42期——程序员修炼道路上的“葵花宝典”
  6. 网上支付失败了我该怎么办
  7. 关于简历:怎样才叫熟悉/精通Linux?
  8. oracle表update在等待,Oracle中如何更新一张大表记录
  9. linux数据库redis主从配置,redis介绍及主从配置
  10. CSDN—编写博客(快捷键)