java 通过socket做为服务器段 与 delphi写的可户段 通讯的问题 呵呵,这个应该去Delphi版问 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我在 DELPHI 版 贴了这个 问题,结果比 这里 还 要 失望,没有 一个回复啊;难道 懂 JAVA 的 都 不懂 DELPHI 吗;呵呵 我做过delphi to delphi 和 java to java的很正常,delphi 与 java的socket编程没有试过,发给我一份,研究一下[email protected] email错,应为:[email protected] // JAVA的 服务器 端 SOCKETpackage test;import java.io.*;import java.net.*;public class FileServer extends Thread { public static void main(String[] argv) { ServerSocket s; try { s = new ServerSocket(7010, 10); }catch (IOException e) { System.err.println("Unable to create file socket"); e.printStackTrace(); return; } try { while (true) { new FileServer(s.accept()); System.out.print("server once \n"); } }catch (IOException e) { } } private Socket socket; FileServer(Socket s) { socket = s; start(); } public void run() { // 用意很简单,得到连接的 CLIENT 的一个传来的字符串 fileName ,然后打印出来就OK了; InputStream in; String fileName = ""; try { in = socket.getInputStream(); BufferedReader d = new BufferedReader(new InputStreamReader(in)); fileName = d.readLine(); // 用DELPHI时,在这里就停住了;一直到DELPHI的程序退出或 // TCLIENTSOCKET CLOSE 的时候 才进行下去; } catch (IOException e) { try { socket.close(); }catch (IOException ie) { } return; } try { in.close(); socket.close(); System.out.print(fileName+":close socket \n"); } catch (IOException e) { } }}// DELPHI 的写个 按钮的 点击 事件,在窗体 上 放一个 TCLIENTSOCKET 的组件procedure TForm1.Button1Click(Sender: TObject);begin ClientSocket1.Address := '10.0.10.75'; // 服务器端 IP ClientSocket1.Port := 7010; ClientSocket1.ClientType := ctBlocking; // 用 ctNonBlocking 连服务器都接不上去 ClientSocket1.Active := true; if ClientSocket1.Active then begin ClientSocket1.Socket.SendText('hello'); // 如果连到服务器就 发个字符串过去;可是要等到 ClientSocket1.close();的时候,才发出去? end else showMessage('no ok');end; 没做过delphi的,也有相同的需求,关注一下。 InputStream input = socket.getInputStream(); byte[] b = new byte[100]; input.read(b); fileName = new String(b); fileName = fileName.trim();你的程序停在read语句上,估计是客户端没有发过来,可以查一下delphi帮助是否客户端需要flush一下才发出消息。 楼上的:看起来 上应该 用 flush 概念的方法 来将 内容 输送到 服务器端 ;可是 查了DELPHI,好象 没有这个方法;我倒怀疑 是服务器 端 已经得到了 输入;只是 约定的 方式不同,造成 ,JAVA 以为还有没输完的内容,可能有一个结束符之类的,然后就在等待;而 DELPHI 在 TCLIENTSOCKET CLOSE 的时候 才把 某个结束 的信息 给了 JAVA 端,随后 JAVA 端 认为 没有 等待的必要了,因为SOCKET已结束,等待输入已经是无意义的了;然后 程序就执行 下去了; 问题是,我如何 让 JAVA 端 不等待,当然 前提是 保持该SOCKET连接! 楼上说的有理,客户端应该发过来啦(至少做一个相类似的java的delphi服务器能够正常工做)。关注中...... 你在delphi这个跨语言的问题,一定没有回答,但我不会delphi,我bcb,现转java,知道其中原因:JAVA socket服务端采用同步机制来读取数据的,而delphi TCLIENTSOCKET 你选择啦一步方式,如果你采用同步方式,你写数据java socket服务段就可以接受数据啦,但你的TCLIENTSOCKET必须采用线程来读取数据。你不能依靠TCLIENTSOCKET的事件来读取数据。hehe:) ClientSocket1.Socket.SendText('hello‘); 与 fileName = d.readLine(); 有问题,前者没有发送回车符号,而后者等待回车符号。你自己看看是不是有问题? ClientSocket1.Socket.SendText('hello\r\n‘); 试试看:) java的readline()是个阻塞的方法,它一定等到客户端发来的信息且含有结尾符才行。你试试将delphi中的:ClientSocket1.Socket.SendText('hello');改为:ClientSocket1.Socket.SendText('hello'+#10+#13);试试看GOOD LUCK! 就 以上 问题 的 执行 通过 ,已经 OK 了;如: wks9527 所言;加了 +#10+#13 后 readLine 通过;仔细 想想,以前 也考虑 过 加 \n ,我不知道JAVA 的SOCKET 是否对 字符串中的 \n 做相应处理,DELPHI 好象 不是这么做的,它会把它当做一个普通的字符串,而不是 #10 #13 的效果!此帖OVER! 新手问题 请大家帮我分析下这段代码 对象数组的排序?? 急!executeQuery连用问题 [闭月羞花猫]问一个使用POI,在excel单元格中设置 斜线的问题!!!!!!! ★★★★※※高分求助--javac错误:使用了未经检查或不安全的操作。※※※※※※※※※※※※ 大家用JAVA开发出来的都是些什么软件?运行在什么环境下? 怎样用JAVA操作注册表? 哪里有java的类库下载?sun里有吗? 图象的保护 Java WorkShop为什么不认Win2000? jtree setSelectionPath问题 Java如何画复杂多边形
发给我一份,研究一下
[email protected]
package test;import java.io.*;
import java.net.*;public class FileServer extends Thread {
public static void main(String[] argv) {
ServerSocket s;
try {
s = new ServerSocket(7010, 10);
}catch (IOException e) {
System.err.println("Unable to create file socket");
e.printStackTrace();
return;
}
try {
while (true) {
new FileServer(s.accept());
System.out.print("server once \n");
}
}catch (IOException e) {
}
}
private Socket socket;
FileServer(Socket s) {
socket = s;
start();
}
public void run() { // 用意很简单,得到连接的 CLIENT 的一个传来的字符串 fileName ,然后打印出来就OK了;
InputStream in;
String fileName = "";
try {
in = socket.getInputStream();
BufferedReader d = new BufferedReader(new InputStreamReader(in));
fileName = d.readLine(); // 用DELPHI时,在这里就停住了;一直到DELPHI的程序退出或
// TCLIENTSOCKET CLOSE 的时候 才进行下去;
} catch (IOException e) {
try {
socket.close();
}catch (IOException ie) {
}
return;
}
try {
in.close();
socket.close();
System.out.print(fileName+":close socket \n");
} catch (IOException e) {
}
}
}// DELPHI 的写个 按钮的 点击 事件,在窗体 上 放一个 TCLIENTSOCKET 的组件
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Address := '10.0.10.75'; // 服务器端 IP
ClientSocket1.Port := 7010;
ClientSocket1.ClientType := ctBlocking; // 用 ctNonBlocking 连服务器都接不上去
ClientSocket1.Active := true;
if ClientSocket1.Active then begin
ClientSocket1.Socket.SendText('hello'); // 如果连到服务器就 发个字符串过去;可是要等到 ClientSocket1.close();的时候,才发出去?
end
else showMessage('no ok');
end;
InputStream input = socket.getInputStream();
byte[] b = new byte[100];
input.read(b);
fileName = new String(b);
fileName = fileName.trim();
你的程序停在read语句上,估计是客户端没有发过来,可以查一下delphi帮助是否客户端需要flush一下才发出消息。
关注中......
JAVA socket服务端采用同步机制来读取数据的,而
delphi TCLIENTSOCKET 你选择啦一步方式,如果你采用同步方式,你写数据java socket服务段就可以接受数据啦,但你的TCLIENTSOCKET必须采用线程来读取数据。你不能依靠TCLIENTSOCKET的事件来读取数据。
hehe:)
ClientSocket1.Socket.SendText('hello‘);
与
fileName = d.readLine();
有问题,前者没有发送回车符号,而后者等待回车符号。
你自己看看是不是有问题?
ClientSocket1.Socket.SendText('hello\r\n‘);
试试看:)
你试试将delphi中的:
ClientSocket1.Socket.SendText('hello');
改为:
ClientSocket1.Socket.SendText('hello'+#10+#13);试试看GOOD LUCK!