关于【对象“***.rem”已经断开连接或不在服务器上】异常的解决方法

本文介绍了一种在Remoting服务端回调客户端接口时出现的异常情况及其解决方案。当服务端尝试调用已断开连接的客户端接口时,将引发特定异常。文章提供了一段示例代码,展示了如何通过设置客户端对象的生命周期来避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设,Remoting服务端接受并保存了一个Remoting客户端注册的回调接口(比如ICallback),在一定的时刻,服务端会通过ICallback接口调用客户端的某些方法。当运行一段时间后,服务端再次回调ICallback时,就抛出了类似下面的异常:
对象“/9ca38d87_7f53_49b7_8c81_f2d499239f27/jqgpmhyy_rwcmicplf3j8s0j_1.rem”已经断开连接或不在服务器上。
原因在于回调接口指向的服务对象已经被释放,解决方案很简单,只要设置服务对象的生命周期就可以了:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> publicclassCallback:MarshalByRefObject,ICallback
{
publicoverrideobjectInitializeLifetimeService()
{
//Remoting对象无限生存期

returnnull;
}
}
如此可以保证客户端的Callback对象在应用程序的整个生命周期内都是激活的状态,服务端可以随时回调它。
''' 深圳市普中科技有限公司(PRECHIN 普中) 技术支持:www.prechin.net PRECHIN 普中 实验名称:WIFI远程控制--DHT11温湿度采集 接线说明:LED模块-->ESP32 IO (D1)-->(15) DS18B20温度传感器模块-->ESP32 IO (DS)-->(13) 实验现象:程序下载成功后,手机连接的WIFI需和ESP32连接的WIFI处于同一频段(比如192.168.1.xx), 然后在手机网页输入Shell控制台输出的本机IP地址即可进入手机端网页显示采集的温度数据, 可手动刷新页面更新数据显示。 注意事项:ESP32作为服务器,手机电脑作为客户端 ''' #导入Pin模块 from machine import Pin import time import network import socket import onewire import ds18x20 #定义LED控制对象 led1=Pin(15,Pin.OUT,Pin.PULL_DOWN) #定义DS18B20控制对象 ds18b20=ds18x20.DS18X20(onewire.OneWire(Pin(13))) #连接的WIFI账号和密码 ssid = "PRECHIN" password = "12345678" def read_ds_sensor(): roms = ds18b20.scan() print('Found DS devices: ', roms) print('Temperatures: ') ds18b20.convert_temp() for rom in roms: temp = ds18b20.read_temp(rom) if isinstance(temp, float): msg = round(temp, 2) print(temp, end=' ') print('Valid temperature') return msg return b'0.0' #WIFI连接 def wifi_connect(): wlan=network.WLAN(network.STA_IF) #STA模式 wlan.active(True) #激活 if not wlan.isconnected(): print("conneting to network...") wlan.connect(ssid,password) #输入 WIFI 账号密码 while not wlan.isconnected(): led1.value(1) time.sleep_ms(300) led1.value(0) time.sleep_ms(300) led1.value(0) return False else: led1.value(0) print("network information:", wlan.ifconfig()) return True #网页数据 def web_page(): temp = read_ds_sensor() html = """<!DOCTYPE HTML><html><head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; } h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } </style></head><body><h2>ESP32 DS18B20 Temperature detection</h2> <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature</span> <span id="temperature">""" + str(temp) + """</span> <sup class="units">°C</sup> </p> <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature</span> <span id="temperature">""" + str(round(temp * (9/5) + 32.0, 2)) + """</span> <sup class="units">°F</sup> </p></body></html>""" return html #程序入口 if __name__=="__main__": if wifi_connect(): #SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议 my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket连接 # 将socket对象绑定ip地址和端口号 my_socket.bind(('', 80)) # 相当于电话的开机 括号里的参数表示可以同时接收5个请求 my_socket.listen(5) while True: try: # 进入监听状态,等待别人链接过来,有两个返回值, #一个是对方的socket对象,一个是对方的ip以及端口 client, addr = my_socket.accept() print('Got a connection from %s' % str(addr)) # recv表示接收,括号里是最大接收字节 request = client.recv(1024) request = str(request) print('Content = %s' % request) response = web_page() client.send('HTTP/1.1 200 OK\n') client.send('Content-Type: text/html\n') client.send('Connection: close\n\n') client.sendall(response) client.close() except OSError as e: conn.close() print('Connection closed') 加入温度超限启动无源蜂鸣器和led报警功能同时启动电机
最新发布
07-04
from machine import Pin import time import network import socket import onewire import ds18x20 #定义LED控制对象 led1=Pin(3,Pin.OUT,Pin.PULL_DOWN) #定义DS18B20控制对象 ds18b20=ds18x20.DS18X20(onewire.OneWire(Pin(15))) #连接的WIFI账号和密码 ssid = “PRECHIN” password = “12345678” def read_ds_sensor(): roms = ds18b20.scan() print('Found DS devices: ', roms) print('Temperatures: ‘) ds18b20.convert_temp() for rom in roms: temp = ds18b20.read_temp(rom) if isinstance(temp, float): msg = round(temp, 2) print(temp, end=’ ‘) print(‘Valid temperature’) return msg return b’0.0’ #WIFI连接 def wifi_connect(): wlan=network.WLAN(network.STA_IF) #STA模式 wlan.active(True) #激活 if not wlan.isconnected(): print("conneting to network...") wlan.connect(ssid,password) #输入 WIFI 账号密码 while not wlan.isconnected(): led1.value(1) time.sleep_ms(300) led1.value(0) time.sleep_ms(300) led1.value(0) return False else: led1.value(0) print("network information:", wlan.ifconfig()) return True #网页数据 def web_page(): temp = read_ds_sensor() html = “”" <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; } h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } </style></head><body><h2>ESP32 DS18B20 Temperature detection</h2> <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature</span> <span id="temperature">""" + str(temp) + """</span> <sup class="units">°C</sup> </p> <p><i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature</span> <span id="temperature">""" + str(round(temp * (9/5) + 32.0, 2)) + """</span> <sup class="units">°F</sup> </p></body></html>""" return html #程序入口 if name==“main”: if wifi_connect(): #SOCK_STREAM表示的是TCP协议,SOCK_DGRAM表示的是UDP协议 my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket连接 # 将socket对象绑定ip地址和端口号 my_socket.bind(('', 80)) # 相当于电话的开机 括号里的参数表示可以同时接收5个请求 my_socket.listen(5) while True: try: # 进入监听状态,等待别人链接过来,有两个返回值, #一个是对方的socket对象,一个是对方的ip以及端口 client, addr = my_socket.accept() print('Got a connection from %s' % str(addr)) # recv表示接收,括号里是最大接收字节 request = client.recv(1024) request = str(request) print('Content = %s' % request) response = web_page() client.send('HTTP/1.1 200 OK\n') client.send('Content-Type: text/html\n') client.send('Connection: close\n\n') client.sendall(response) client.close() except OSError as e: conn.close() print('Connection closed')分析此段代码并加入在oled屏中显示并且在达到温湿度阈值时无源蜂鸣器报警和led灯闪烁同时启动电机
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值