【发布时间】:2016-01-20 20:58:26
【问题描述】:
我想在本地主机上创建 Delphi6 和 Eclipse 之间的套接字通信。 Delphi-Code 似乎可以工作,我可以将数据从 Delphi-Server 发送到 Delphi-Client。现在我想将数据从同一个 Delphi-Server 发送到 Java-Client。以下代码是我从几个示例中使用的。 Delphi 和 Java 之间的联系似乎已经建立,但是在 while-loop (stdIn.readLine()) 程序不再工作了。也不例外。该程序只是停止工作。如何从 Delphi-server 读取数据?
谢谢!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class JavaClientSocketEx {
public static void main(String[] args) {
try {
Socket echoSocket = new Socket("127.0.0.1", 10003);
PrintWriter out =
new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in =
new BufferedReader(
new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn =
new BufferedReader(
new InputStreamReader(System.in));
String userInput;
echoSocket.close();
while ((userInput = stdIn.readLine()) != null) { // at this point the programm doesnt work anymore!
out.println(userInput);
System.out.println("echo: " + in.readLine());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
编辑:Delphi 代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, ExtCtrls, StdCtrls;
type
CustomRec = record
Zahl: byte;
end;
TForm1 = class(TForm)
Edit1: TEdit;
Timer1: TTimer;
sendenButton: TButton;
Edit2: TEdit;
ClientSocket1: TClientSocket;
ServerSocket1: TServerSocket;
procedure Timer1Timer(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure sendenButtonClick(Sender: TObject);
procedure ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
senden : boolean;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
var
text : string;
begin
text := Edit1.Text;
ClientSocket1.Socket.SendText(text);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
sendenButton.Caption := 'Send';
senden := false;
ClientSocket1.Port := 10003;
ClientSocket1.Host := '127.0.0.1';
ClientSocket1.Active := true;
ServerSocket1.Port := 10003;
ServerSocket1.Active := true;
end;
procedure TForm1.sendenButtonClick(Sender: TObject);
begin
if senden then
begin
senden := false;
sendenButton.Caption := 'Send';
Timer1.Enabled := false;
end
else
begin
senden :=true;
sendenButton.Caption := 'Stopp';
Timer1.Enabled := true;
end;
end;
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Errorcode := 0;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var Rec: CustomRec;
begin
edit2.Text := Socket.ReceiveText;
rec.Zahl:=StrToInt(Edit2.Text);
Socket.SendBuf(Rec,sizeof(Rec));
end;
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
Errorcode :=0;
end;
end.
在我单击“sendenButton”后,delphi 客户端开始以一秒的间隔定期从第一个编辑元素(即输入)发送数据。第二个编辑元素是接收数据的输出。再次单击此按钮后,它停止发送。
【问题讨论】:
-
您能否用 Delphi 服务器完成您的问题并详细说明 “停止工作” 的概念?我的意思是:发生异常或
userInput立即为null? -
System.in如果你想输出套接字输入,我觉得很奇怪:BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); -
也不例外。在“userInput = stdIn.readLine()”行的调试模式下,似乎程序已完成。我也尝试过其他解决方案,例如:javaproblemstips.com/256592。但是在“String str = in.readLine();”也有同样的问题
-
但是您在等待
System.in,而不是在等待套接字,而且在我看来套接字未绑定到System.in,是吗?我不明白两者之间的关系,抱歉=:-) -
我知道你的意思,但这也不起作用,当我删除“system.in”时: Socket echoSocket = new Socket("127.0.0.1", 10003); PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));字符串用户输入; // echoSocket.close(); while ((userInput = in.readLine()) != null) { out.println(userInput); System.out.println("echo:" + in.readLine()); }