如果可能的话,我想在没有任何外部库的情况下完成此操作...
我想打开到特定 IP 地址上的特定端口的 TCP 连接,然后通过发送 ANSI 字符串进行通信并接收 ANSI 字符串响应。
可悲的是,我不知道从哪里开始,在互联网上搜索发现了一些看起来相当复杂的例子。
任何人都可以给我任何起点吗?
您可以使用 Free Pascal 中提供的套接字类。我使用这些类创建了一个简单的项目:TCP/IP 客户端/服务器
我添加了三个示例来展示如何使用它:tcpipcomp/demo
要检查连接是否仍然有效,您可以执行以下操作
SocketName.CanRead(Timeout: Integer);
我听到你了。你需要什么客户端的连接号码。
我的互联网国际象棋应用程序的设计需要这个。
我创建了两个解决方案。
我的解决方案有效,但这里可能没有时间或空间来描述它们。
在分享我的解决方案之前,我想让您知道,如果同一 LAN 上的两个人连接到您的应用程序,捕获客户端的 RemoteAddress 将无法帮助您确定他们的连接号码。
另外...虽然 Socket:TCusomSocket.Data 很容易使用...但请注意,“数据”不是数据。它是一个指向数据的指针。我尝试了我所知道的一切,将一些独特的值与该数据关联起来,并在尝试确定正确的客户端连接数时对其进行比较,但失败了。你将走同样的路。您可能不会失败,但是,您将花费大量时间学习如何使用指针。
所以......这是我的 TCP Delphi TServerSocket/TClientSocket 解决方案的要点。
简而言之,每个客户端都有一个记录类型的实例,服务器也有一个相同的数组。
顺序...
在服务器应用程序上的 PRIVATE 中,我创建... arRecPlayer:TrecPlayer 数组;
代码... 在 TServerSocket 客户端连接事件中,我实例化了一个新的 arRecPlayer 元素...... arRecPlayer[x].ConnectionID := 复制(CreateClassID,1,19) + '}'; 然后服务器将其发送回刚刚连接的客户端 使用 ServerSocket.SendText('NC' + arRecPlayer[x].ConnectionID); “NC”是从 TClentSocket.ReceiveText 解析并执行代码... ServerSocket.Socket.SendText('NC' + arRecPlayer[x].ConnectionID + recThisPlayer.MemberID,'任何消息'); 当服务器收到第二个“NC”消息时,它会解析该消息并填充其 areRecPlayer[{当前连接号}].MemberID 字段以匹配客户端的字段。
后续从客户端发送的文本格式为指令(IS 邀请已发送、IA 邀请已接受、WO 谁在线、WRU 你是谁……当客户端断开连接时从服务器发送。所有客户端将其连接信息发送回服务器并且活动连接会自动恢复。 更多的... 就像我说的,这里没有足够的时间和空间。 给我发电子邮件 [电子邮件受保护]
山姆