- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个问题让我感到困惑。我正在尝试将 Windows 上的 Indy 10 客户端/服务器应用程序的服务器端移植到 Linux 以节省成本。该应用程序最初是使用 Delphi 2010 开发的。我已将其移植到 Lazarus/FreePascal,并且在 Windows 上运行良好。鉴于 Lazarus/FreePascal 是多平台且免费的,它是这份工作的理想人选。
我已尽我所能使服务器应用程序在 Linux 上运行,但没有成功。服务器只是不与连接的客户端通信。什么都没有!
然后我决定回到原点。我试图获得一个在 Linux 上运行的非常基本的示例。相关部分源码如下图
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
s: string;
i: Integer;
begin
with AContext.Connection.IOHandler do
try
WriteLn('Type an integer and Enter');
s := ReadLn;
try
i := StrToInt(s);
WriteLn(s + ' squared is ' + IntToStr(i*i));
except
WriteLn(s + ' is not an integer');
end;
finally
Free;
end;
end;
procedure TForm1.FormActivate(Sender: TObject);
var
Binding: TIdSocketHandle;
begin
{$IFDEF UNIX}
Binding := IdTCPServer1.Bindings.Add;
//Binding.IPVersion := Id_IPv4; <----- Gives compilation error Error: Identifier not found "Id_IPv4"
{$ENDIF}
Binding.IP := '127.0.0.1';
Binding.Port := 6501;
IdTCPServer1.Active := True;
end;
end.
这是程序的工程文件squares.lpr
program squares;
{$mode objfpc}{$H+}
// The following line is is necessary for Linux thread support
{$IFDEF UNIX}{$DEFINE UseCThreads}{$ENDIF}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, uSquares
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
当我尝试使用 telnet 从终端连接到服务器时,我得到以下响应
telnet 127.0.0.1 6501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
7
Connection closed by foreign host.
如您所见,telnet 连接到服务器。但是客户端连接后服务器的第一个响应“Type an integer and Enter”并没有出现。此外,当我向服务器发送一个数字时,例如要平方的“7”,telnet 会显示“外部主机关闭连接”。所以 telnet 客户端也根本收不到服务器的响应。我使用的是 Indy svn 版本,所以这不是旧 Indy 版本的问题。
所以即使这个基本示例在 Linux 中也不起作用!我不知道如何解决这个问题,所以我真的需要你的帮助。此外,如果您有任何我可以阅读的有关使用 Pascal 在 Linux 上进行套接字编程的资料,我将不胜感激。
我在 Linux Mint 上使用 Lazarus 0.9.31/FPC 2.4.4 和 Indy 10.5.8。
丹尼尔
最佳答案
Id_IPv4
在 IdGlobal.pas 中定义,确保该单元在您的 uses
子句中。请注意,您仅在定义了 UNIX 时才调用 Bindings.Add()
,但您正试图访问 IFDEF block 之外的 Binding
。您根本不需要 IFDEF block 。 Indy 默认为 IPv4。
关于通信问题,我认为您显示的代码没有任何问题,前提是 FreePascal 正确调用 TIdIOHandler.WriteLn()
而不是某些控制台 WriteLn() I/O 例程。你能显示客户端代码吗?
服务器端,我现在唯一能想到的可能出错的是 Indy 的 TIdTextEncoding 类在发送/接收字符串时可能失败,如果您设置了 TIdIOHandler.DefStringEncoding
属性或全局 GIdDefaultEncoding
变量为非默认编码。在非 Windows 系统上,TIdTextEncoding 使用 iconv 库,而 Indy 的 iconv 支持目前已知有点问题。另一方面,Indy 的默认编码是 ASCII,它根本不依赖 iconv,所以使用它应该不会有任何失败。
关于linux - Indy 10 TCPServer 不与 Linux 上连接的客户端通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7767616/
如何在 Ruby 中使用 TcpServer.new(0) 找到由 Windows 分配给 TcpServer 的端口 最佳答案 您可以使用 addr 获取它: tcp_server = TCPSer
我已经阅读了 Ruby 文档,但我并没有真正理解这两个对象之间的区别。 TCPServer.new(端口) 和 TCPServer.open("X.X.X.X", 端口) 我所知道的是 .new 仅响
我不得不为工作中的一个项目编写一个 TCP 服务器,我在谷歌上搜索了如何编写。我有一个 MSDN回答并设法让它工作,但我不知道如何让数据能够来回接收。 socket 的连接时间最多不会超过 30 秒(
import SocketServer import sys from Queue import * import threading class CustomTCPServer(SocketServ
python 2.7.2 window 7 32 位 让我以我对网络编程相当陌生作为这个问题的序言。我使用 python 的内置 SocketServer 创建了一个简单的服务器和客户端 Socket
我有一个正在编码的应用程序,用于通过 tcpsocket 将日志记录信息发送到服务器,并有一个监视器客户端连接到服务器以查看日志记录数据。到目前为止,我能够进入将信息发送到服务器的阶段,但是我需要一些
我正在尝试编写一个 c# 服务器/客户端,它将同时通过 TCP 相互发送字节数组。我正在努力思考如何实现这一目标。我见过的所有示例都在等待消息,然后发送响应。我需要同时进行交流。 我是否需要为服务器和
也许我把我的套接字编程方式搞混了,但像这样的东西不应该工作吗? srv = TCPServer.open(3333) client = srv.accept data = "" while (tmp
我目前仅使用标准库在 ruby 中实现一个简单的发布/订阅系统,客户端可以在其中订阅消息主题或将消息发布到主题,这些消息将发送给所有订阅者。我只使用标准的 TCPServer 并假设所有消息都在使
int main() { int sock, connected, bytes_recieved , true = 1; char send_data [1024] , recv_data[1
我正在尝试使用 jacoco 代理远程获取覆盖数据,并使用 Reset=true 重置服务器上的执行信息; 服务器上的jacoco java代理: JAVA_OPTIONS="${JAVA_OPTIO
我试图通过客户端的 GET 请求从 SocketServer 模块关闭 TCPServer,该请求在窗口关闭时发出,但是以下代码无法启动关闭: def show_webgl(data): im
我正在编写一个简单的 python3 网络服务器。我已经尝试了各种教程,并且都运行良好。尽管如此,还是有一点我不明白。 在一个教程中,他们使用 HTTPServer 如下: server = HTTP
目前我有一个 c# tcpclient 和一个 c++ tcpserver,但我只能从服务器端的流中读取字符,因此所有数据都将转换为字符。由于c++ char是一个有符号的8位整数,而c#客户端发送的
我一直在玩弄 Python 的 SocketServer: #!/usr/bin/python import SocketServer class EchoHandler(SocketServer.B
我正在创建一个仅在 Windows 操作系统上运行的客户端-服务器应用程序,每个 Windows 用户将一次连接到服务器。局域网使用DHCP,所以IP不固定。 我需要将字符串消息从 IdTCPServ
我尝试在客户端发送长度小于 255 的数据。 我尝试使用此协议(protocol)发送数据: Lenghth+String Byte+string sample : string = ABCD sen
我正在使用 Python 的 SocketServer.ThreadingTCPServer。现在我想知道在某个时刻连接了多少个客户端。 如何解决? 最佳答案 SocketServer.Threadi
我想创建一个 TCPserver 并根据需要向客户端发送/接收消息,而不是 TCPserver 的 OnExecute 事件。 发送/接收消息没有问题;我确实喜欢这样: procedure TForm
我需要有关 TCPServer 和 TcpClient 问题的帮助。我正在使用 Delphi XE2 和 Indy 10.5。 我根据一个流行的屏幕捕获程序制作了服务器和客户端程序: ScreenTh
我是一名优秀的程序员,十分优秀!