You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenEdge.Net.ServerConnection.ClientSocket?含代码验证与服务端改造咨询

Progress OpenEdge 面向对象Socket开发答疑

一、客户端代码问题修正与验证

你的测试代码存在几个关键问题,修正后才能正常收发数据:

  1. URI Scheme参数错误:普通TCP Socket需要指定tcp作为scheme,而非占位符scheme???
  2. 缺失必要的USING引用:SocketReadEventArgs类需要显式引入
  3. 事件回调方法访问修饰符不合理:回调方法无需公开,建议设为PRIVATE
  4. 内存泄漏风险:使用MEMPTR后需要清理内存
  5. 缺少连接断开逻辑:使用完成后需主动断开并释放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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:15:30