Socket应该是网络编程的思密达了,更值得注意的是,Python集成Socket模块就更加提升了这一网络编程方式可用性(快速上手)
最简单的运用就是模拟服务器、客户机进行本地Socket程序测试,Python实现不超过60行代码,简洁明了,移植到真正的服务器上也挺靠谱
# -*- coding:utf-8 -*- # IP_RECEIVE_DATA from socket import * ip = '127.0.0.1' port = 8888 ip_port = (ip,port) udpSocket = socket() udpSocket.bind(ip_port) udpSocket.listen(5) while True: print('Waiting data recv......\n') conn,destInfo = udpSocket.accept() # print(str(recvData,encoding="utf-8")) msg = 'Connect success.' conn.send(msg.encode()) while True: data = conn.recv(1024) print(data.decode()) conn.send(data) if data==b'exit': break conn.close() # udpSocket.close()
上述服务器代码已经支持单次链接传输了(接受发送的字符并原样返回),但是每当关闭链接时,程序异常中止,你需要重启该程序,修正很简单,利用异常机制即可,自己去探索
# -*- coding:utf-8 -*- # IP_SEND_DATA import socket # from socket import * sock = socket.socket() # sock.settimeout(0.5) ''' if status == 0: print('the port is OK') else: print('this port is not OK') ''' # SEND CODE # udpSocket = socket(AF_INET,SOCK_DGRAM) # sendData = "Hello, Windows Server!" ip = '127.0.0.1' port = 8888 sock.connect((ip,port)) while True: data = sock.recv(1024) print(data.decode()) sendData = input('Input infor you want to send...\n') sock.send(sendData.encode()) # sock.sendto(sendData.encode("gbk"),(ip,port)) # sock.close()
客户机代码如上,如果按照上面的SERVER+CLIENT模式,本地机先运行SERVER再运行CLIENT即可实现如下数据传输
- 客户机发送字符串[PLAY AN SEND MODE]
- 服务器接收并回传相同字符串
- 客户机接收回传的字符串[PLAY AN RECEIVE MODE]
上面的程序已经在我的服务器和本地机上成功运行了,从合工大(合肥校区)发送到华东-上海再回到-合肥,速度挺快,毕竟光纤链路🐸,记得当年“The big bang theory”数据环游世界再回到本地,其实利用分散式服务器节点就能实现一波了
- 树莓派[a hardware support a base for run our project]
- Python
- Socket[a model in python, though has single operation base]
- Windows Server
以树莓派为本地CLIENT,配合其它微控制器,利用相应通信协议进行二者间数据互传,PI进行Socket网络传输,利用服务器进行对远程数据的监测,这是我本科毕设的一个拓展想法,受限于当时琐事,没进一步实现
# -*- coding:utf-8 -*- # com check import socket def connecthost(ip,port): sk1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sk1.settimeout(5) try: sk1.connect((ip,port)) return "OK" except Exception as e: return "ERROR" sk1.close() ret = connecthost('localhost',8888) print(ret)
也可以说是一个遗憾,最后采用一个超远程射频通信代替了,不过值得一提的是它的性能还挺优秀,8公里的通信距离,ms级的延迟已经很无敌了
那个适合非联网传输(一定远距离监测),而Socket模式支持互联网能够达到的地方,也就是Everywhere,基于服务器的监测模式使得任何地点、任何时间都能直接登录查看(界面化需要PyQt)
https://pypi.org/project/PyQt5/
C++的异常捕捉与处理操作,实际上这是个极其复杂的问题,复杂到需开辟一个单独的领域去研究,一门学问
不要慌,是我让它这样报错的,不过未定义异常处理操作起作用的实际上是依赖于编译器,指不定在其它编译器会如何
#include <stdio.h> #include <iostream> using namespace std; int main() { std::cout << "Hello World!\n"; int ival1, ival2; //can not be # cout << "Enter 2 integer:"; //cin >> ival1 >> ival2; while (cin >> ival1 >> ival2) { //state error not here //cout << "Enter 2 integer:"; try { if (ival2 == 0) { throw runtime_error("-[Low must not be 0!]\n"); } }catch (runtime_error err){ // cout << err.what() << "Try again Y|N:"; char ch; cin >> ch; if (ch == 'N' || ch == 'n') { break; //continue; } else { //cout << "Enter 2 integer:"; } } //here cout << "Enter 2 integer:"; } return 0; }
在验证层面,Visual Studio的调试机制很靠谱,虽然我很少用,但必要的时候不得不用,之前还是写ARM的使用用的J-Link调试常用的,现在改行了,不搞那玩意,太费钱