Engee 文档

套接字支持包

Socket(原始套接字)是一个接口,用于在同一台计算机内的进程之间以及通过网络在不同机器之间交换数据。

在*Engee*的上下文中,原始套接字通过*Engee子系统运行在用户客户端程序的一侧。集成*,而在*Engee*本身,则接收与客户端程序进行数据处理的结果或单边/双边地向客户端程序发送数据。

要开始使用套接字支持包,请安装*Engee子系统。集成*:运行客户端程序并指定*Engee*服务器URL(参见 说明)。

基本方法

下面列出了关键方法:

  • 插座。套接字(family="AF_INET",socket_type="SOCK_STREAM",socket_descriptor=0) -构造函数(默认为TCP/IPv4)。

  • 插座。绑定(设备,主机::字符串,端口::Int64) -绑定到地址/端口。

  • 插座。听(设备,积压::Int64) -接收连接的监听模式(服务器)。

  • 插座。接受(设备)→Int64 -等待客户端,返回脚注描述符:[描述符是OS标记打开资源的整数:套接字,文件,连接等。 程序不需要知道里面有什么;它将这个数字传递给读/写/关闭函数,操作系统使用它来查找所需的资源。 如果句柄关闭或无效,则使用它的操作不起作用。]的新插座。

  • 插座。连接(设备,主机::字符串,端口::Int64)→Int64 -连接到远程服务器(对于客户端)。

  • 插座。发送(设备,消息::向量{UInt8}) -发送字节。

  • 插座。receive(device,bufsize::Int64)→Union{Nothing,ResultUIntList} -在阻塞模式下读取。

  • Sockets.is_open(device,socket_descriptor::Int64)→Bool -检查插座是否打开。

  • 插座。关闭(装置) -关闭套接字并释放资源。

使用套接字的分步示例

让我们考虑一个在同一台计算机(localhost)上的两个UDP套接字之间进行数据交换的示例。 在这个例子中:

  • *Socket1*充当服务器:它绑定到特定端口并等待数据;

  • *套接字2*充当客户端:它连接到套接字1的端口并发送消息。

    1. 创建第一个套接字(服务器)-通过指定地址族创建套接字 AF_INET (IPv4)和类型 SOCK_DGRAM (UDP):

      socket_1 = SOCKET.Socket("AF_INET", "SOCK_DGRAM")
    2. 将第一个套接字绑定到地址和端口-将套接字绑定到本地机器的地址(127.0.0.1)和港口 8888. 现在套接字正在"侦听"这个端口。:

      socket_1.bind("127.0.0.1", 8888)
    3. 创建第二个套接字(客户端)-创建具有相同参数的第二个套接字:

      socket_2 = SOCKET.Socket("AF_INET", "SOCK_DGRAM")
    4. 将第二个套接字连接到服务器-将客户端套接字连接到服务器套接字正在"侦听"的地址和端口。:

      socket_2.connect("127.0.0.1", 8888)
    5. 消息发送和验证周期-从第二个套接字发送1000条消息,并立即在套接字一中接收它们,验证传递的正确性:

      const num_messages = 1000
      
      for i in 1:num_messages
          # 形成短信
          message = "Message $i"
          # 将消息转换为字节数组
          byte_array = collect(codeunits(message))
          # 通过socket2发送字节数组
          socket_2.send(byte_array)
      
          # 我们接受套接字1上的数据(最大1000字节)
          res_for_recv = socket_1.receive(1000).data
          # 我们检查接收到的数据是否与发送的数据匹配。
          @assert res_for_recv == byte_array
      end
      类型 SOCK_DGRAM (UDP)不保证数据包的传递和顺序,但在单个计算机(localhost)内,数据交换几乎是无损的,这使得示例稳定。
    6. 关闭套接字并释放资源-交换完成后关闭两个套接字:

      socket_1.close()
      socket_2.close()

有用的连结