- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 Delphi firemonkey 应用程序创建一个 TCP 服务器。
我的资源文件Unit1.fmx
如下。
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 480
ClientWidth = 640
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Devices = [Desktop]
OnActivate = FormShow
OnCreate = FormCreate
DesignerMasterStyle = 0
object Label1: TLabel
Position.X = 504.000000000000000000
Position.Y = 248.000000000000000000
Text = 'Label1'
end
object TCPServer: TIdTCPServer
Bindings = <>
DefaultPort = 0
OnAfterBind = TCPServerAfterBind
OnConnect = TCPServerOnConnect
OnExecute = TCPserverExecute
Left = 560
Top = 184
end
end
我的代码文件在这里。
unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Platform,
IdCustomTCPServer, IdTCPServer, IdBaseComponent, IdComponent, IdUDPBase, IdContext,
IdSocketHandle, IdUDPServer, FMX.Controls.Presentation, FMX.StdCtrls, Windows;
type
TForm1 = class(TForm)
TCPServer: TIdTCPServer;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TCPserverExecute(AContext: TIdContext);
procedure TCPServerOnConnect(AContext: TIdContext);
procedure TCPServerAfterBind(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyLoggingService = class(TInterfacedObject, IFMXLoggingService)
public
procedure Log(const Format: string; const Params: array of const);
end;
var
Form1: TForm1;
MyLoggingService: IFMXLoggingService;
implementation
{$R *.fmx}
procedure TMyLoggingService.Log(const Format: string; const Params: array of const);
begin
// do whatever you want...
OutputDebugString(PChar(Format));
end;
procedure TForm1.FormCreate(Sender: TObject);
var
Binding : TIdSocketHandle;
begin
MyLoggingService := TMyLoggingService.Create;
if TPlatformServices.Current.SupportsPlatformService( IFMXLoggingService ) then
TPlatformServices.Current.RemovePlatformService( IFMXLoggingService );
// register my service
TPlatformServices.Current.AddPlatformService( IFMXLoggingService, MyLoggingService );
TCPServer.DefaultPort := 16000;
TCPServer.Bindings.Clear;
Binding := TCPServer.Bindings.Add;
Binding.IP := '127.0.0.1';
Binding.Port := 16000;
//if Assigned(MyLoggingService) then
MyLoggingService.Log('FormCreate!',[]);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
TCPServer.Active := True;
end;
procedure TForm1.TCPServerAfterBind(Sender: TObject);
begin
MyLoggingService.Log('After Bind',[]);
end;
procedure TForm1.TCPServerOnConnect(AContext: TIdContext);
begin
MyLoggingService.Log('Recieved Connection From Client ',[]);
end;
procedure TForm1.TCPServerExecute(AContext: TIdContext);
Var
C : String;
begin
C:= AContext.Connection.Socket.ReadLn();
//if Assigned(MyLoggingService) then
MyLoggingService.Log('TserverExecute !',[]);
MyLoggingService.Log('Recived Data !',[C]);
if C = 'TESTSTRING' then
begin
AContext.Connection.Socket.Writeln('SENT');
end;
end;
end.
我的问题是在我记录消息的系统日志中,这是我得到的。
Debug Output: FormCreate! Process Project1.exe (3340)
Debug Output: After Bind Process Project1.exe (3340)
Debug Output: Recieved Connection From Client Process Project1.exe (3340)
First chance exception at $759BC42D. Exception class EIdSocketError with message
'Socket Error # 10054
Connection reset by peer.'.
Process Project1.exe (3340)
connection reset by peer .我的问题是为什么我的代码会发生这种情况?我做错了什么,我该如何解决?
在远程端,我有一个非常简单的 python 脚本,如下所示。
import socket
# Set up a TCP/IP socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# Connect as client to a selected server
# on a specified port
s.connect(('127.0.0.1',16000))
# Protocol exchange - sends and receives
data = 'TESTSTRING';
s.send(data.encode())
while True:
resp = s.recv(1024)
if resp == "":
print('NOTHING')
break
else:
print(resp)
break
# Close the connection when completed
s.close()
print("\ndone")
最佳答案
服务器代码没有问题。客户端在其端断开连接,而服务器端的调试器 只是检测 Indy 向自身引发的异常以处理断开连接。 这是正常行为。
但是,您的客户端代码存在问题。在服务器端,您正在使用 TIdIOHandler.ReadLn()
,它期望客户端发送一行由 LF
字符(或 CRLF
字符串)。但是您的客户端脚本根本没有发送该分隔符,因此 ReadLn()
不会退出,因此服务器不会调用 TIdIOHandler.WriteLn()
来发送响应.在客户端,s.recv()
可能失败(因为没有收到响应)并且脚本结束,断开套接字,导致 ReadLn()
服务器端将异常返回给 TIdTCPServer
,以便它可以停止线程并关闭套接字。
关于delphi - Indy TCPServer 在客户端连接时出现 `Connection reset by peer` 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36073889/
如何在 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
我是一名优秀的程序员,十分优秀!