体验一下Socket网络编程,顺带初探一波C++异常处理

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调试常用的,现在改行了,不搞那玩意,太费钱

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注


皖ICP备2021003932号
召唤伊斯特瓦尔