如何使用OpenEdge.Net.ServerConnection.ClientSocket?含代码验证与服务端改造咨询
Progress OpenEdge 面向对象Socket开发答疑
一、客户端代码问题修正与验证
你的测试代码存在几个关键问题,修正后才能正常收发数据:
- URI Scheme参数错误:普通TCP Socket需要指定
tcp作为scheme,而非占位符scheme??? - 缺失必要的USING引用:
SocketReadEventArgs类需要显式引入 - 事件回调方法访问修饰符不合理:回调方法无需公开,建议设为
PRIVATE - 内存泄漏风险:使用
MEMPTR后需要清理内存 - 缺少连接断开逻辑:使用完成后需主动断开并释放Socket对象
修正后的完整代码:
USING OpenEdge.Net.ServerConnection.ClientSocket. USING OpenEdge.Net.URI. USING OpenEdge.Net.ServerConnection.ClientSocketConnectionParameters. USING OpenEdge.Net.ServerConnection.SocketReadEventArgs. CLASS SocketTest: CONSTRUCTOR PUBLIC SocketTest(): DEF VAR clientSocket AS ClientSocket NO-UNDO. DEF VAR data AS LONGCHAR NO-UNDO. DEF VAR memptr AS MEMPTR NO-UNDO. /* 创建Socket对象,指定tcp scheme */ clientSocket = NEW ClientSocket( NEW ClientSocketConnectionParameters( NEW URI("tcp", "192.162.1.50", "9100") ) ). /* 订阅DataReceived事件 */ clientSocket:DataReceived:Subscribe(THIS-OBJECT, OnDataReceived). /* 建立连接 */ clientSocket:Connect(). /* 发送数据 */ data = "Hello world!". COPY-LOB FROM data TO memptr. clientSocket:WriteData(memptr). SET-SIZE(memptr) = 0. /* 清理MEMPTR内存 */ /* 等待响应(可指定超时时间,单位毫秒) */ clientSocket:WaitForResponse(3000). /* 延迟等待事件触发处理数据 */ PAUSE 2 NO-MESSAGE. /* 断开连接并释放资源 */ clientSocket:Disconnect(). DELETE OBJECT clientSocket. END CONSTRUCTOR. /* 事件回调方法设为私有 */ METHOD PRIVATE OnDataReceived(poSender AS ClientSocket, poEventArgs AS SocketReadEventArgs): DEF VAR longcharData AS LONGCHAR NO-UNDO. /* 转换接收的数据为LONGCHAR */ COPY-LOB FROM poEventArgs:Data TO longcharData. /* 添加输出验证是否收到数据 */ MESSAGE "收到响应:" longcharData VIEW-AS ALERT-BOX. END METHOD. END CLASS. /* 启动测试 */ RUN NEW SocketTest().
二、ClientSocket必要配置说明
- 超时设置:通过
ClientSocketConnectionParameters的ConnectTimeout(连接超时)和ReadTimeout(读取超时)属性配置,例如:DEF VAR connParams AS ClientSocketConnectionParameters NO-UNDO. connParams = NEW ClientSocketConnectionParameters(NEW URI("tcp", "192.162.1.50", "9100")). connParams:ConnectTimeout = 5000. /* 5秒连接超时 */ connParams:ReadTimeout = 10000. /* 10秒读取超时 */ - 编码处理:如果传输非ASCII字符,需确保收发编码一致,可在
COPY-LOB时指定CODEPAGE参数,例如COPY-LOB FROM data TO memptr CODEPAGE "UTF-8". - 长连接配置:若需要保持持久连接,避免发送数据后立即断开,根据业务逻辑控制断开时机。
三、改造为服务端实现
使用ServerSocket类可实现服务端功能,主动监听客户端连接并处理消息,示例代码如下:
USING OpenEdge.Net.ServerConnection.ServerSocket. USING OpenEdge.Net.ServerConnection.ServerSocketConnectionParameters. USING OpenEdge.Net.ServerConnection.ClientSocket. USING OpenEdge.Net.ServerConnection.SocketReadEventArgs. CLASS SocketServer: DEF VAR serverSocket AS ServerSocket NO-UNDO. CONSTRUCTOR PUBLIC SocketServer(): /* 创建服务端Socket,监听所有网卡的9100端口 */ serverSocket = NEW ServerSocket( NEW ServerSocketConnectionParameters("0.0.0.0", "9100") ). /* 订阅客户端连接事件 */ serverSocket:ClientConnected:Subscribe(THIS-OBJECT, OnClientConnected). /* 开始监听 */ serverSocket:StartListening(). MESSAGE "服务端启动,监听端口9100..." VIEW-AS ALERT-BOX. /* 保持服务端运行(实际场景可替换为循环或事件驱动逻辑) */ PAUSE 60 NO-MESSAGE. /* 停止监听并释放资源 */ serverSocket:StopListening(). DELETE OBJECT serverSocket. END CONSTRUCTOR. METHOD PRIVATE OnClientConnected(poSender AS ServerSocket, poClientSocket AS ClientSocket): MESSAGE "新客户端连接:" poClientSocket:RemoteEndPoint VIEW-AS ALERT-BOX. /* 订阅该客户端的数据接收事件 */ poClientSocket:DataReceived:Subscribe(THIS-OBJECT, OnClientDataReceived). /* 主动向客户端发送欢迎消息 */ DEF VAR sendData AS LONGCHAR NO-UNDO. DEF VAR memptr AS MEMPTR NO-UNDO. sendData = "欢迎连接服务端!". COPY-LOB FROM sendData TO memptr. poClientSocket:WriteData(memptr). SET-SIZE(memptr) = 0. END METHOD. METHOD PRIVATE OnClientDataReceived(poSender AS ClientSocket, poEventArgs AS SocketReadEventArgs): DEF VAR longcharData AS LONGCHAR NO-UNDO. COPY-LOB FROM poEventArgs:Data TO longcharData. MESSAGE "收到客户端数据:" longcharData VIEW-AS ALERT-BOX. /* 回复客户端消息 */ DEF VAR replyData AS LONGCHAR NO-UNDO. DEF VAR memptr AS MEMPTR NO-UNDO. replyData = "已收到你的消息:" + longcharData. COPY-LOB FROM replyData TO memptr. poSender:WriteData(memptr). SET-SIZE(memptr) = 0. END METHOD. END CLASS. /* 启动服务端 */ RUN NEW SocketServer().
服务端注意事项
- 监听地址
0.0.0.0表示监听所有网卡,可指定具体IP限制监听范围 - OpenEdge Socket类为异步事件驱动,可同时处理多个客户端连接
- 需确保程序有足够权限监听指定端口,避免端口被占用
内容的提问来源于stack exchange,提问作者W0lfw00ds
相关产品推荐
相关产品推荐

