呵呵
,这个应该去Delphi版问

解决方案 »

  1.   

    我在 DELPHI 版 贴了这个 问题,结果比 这里 还 要 失望,没有 一个回复啊;难道 懂 JAVA 的 都 不懂 DELPHI 吗;呵呵
      

  2.   

    我做过delphi to delphi 和 java to java的很正常,delphi 与 java的socket编程没有试过,
    发给我一份,研究一下
    [email protected]
      

  3.   

    email错,应为:[email protected]
      

  4.   

    // JAVA的 服务器 端 SOCKET
    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;
      

  5.   

    没做过delphi的,也有相同的需求,关注一下。
            InputStream input = socket.getInputStream();
            
            byte[] b = new byte[100];
            input.read(b);
            fileName = new String(b);
            fileName = fileName.trim();
    你的程序停在read语句上,估计是客户端没有发过来,可以查一下delphi帮助是否客户端需要flush一下才发出消息。
      

  6.   

    楼上的:看起来 上应该 用 flush 概念的方法 来将 内容 输送到 服务器端 ;可是 查了DELPHI,好象 没有这个方法;我倒怀疑 是服务器 端 已经得到了 输入;只是 约定的 方式不同,造成 ,JAVA 以为还有没输完的内容,可能有一个结束符之类的,然后就在等待;而 DELPHI 在 TCLIENTSOCKET CLOSE 的时候 才把 某个结束 的信息 给了 JAVA 端,随后 JAVA 端 认为 没有 等待的必要了,因为SOCKET已结束,等待输入已经是无意义的了;然后 程序就执行 下去了; 问题是,我如何 让 JAVA 端 不等待,当然 前提是 保持该SOCKET连接!
      

  7.   

    楼上说的有理,客户端应该发过来啦(至少做一个相类似的java的delphi服务器能够正常工做)。
    关注中......
      

  8.   

    你在delphi这个跨语言的问题,一定没有回答,但我不会delphi,我bcb,现转java,知道其中原因:
    JAVA socket服务端采用同步机制来读取数据的,而
    delphi TCLIENTSOCKET 你选择啦一步方式,如果你采用同步方式,你写数据java socket服务段就可以接受数据啦,但你的TCLIENTSOCKET必须采用线程来读取数据。你不能依靠TCLIENTSOCKET的事件来读取数据。
    hehe:)
      

  9.   


      ClientSocket1.Socket.SendText('hello‘); 
    与  
     fileName = d.readLine(); 
    有问题,前者没有发送回车符号,而后者等待回车符号。
    你自己看看是不是有问题?
     ClientSocket1.Socket.SendText('hello\r\n‘); 
    试试看:)
      

  10.   

    java的readline()是个阻塞的方法,它一定等到客户端发来的信息且含有结尾符才行。
    你试试将delphi中的:
    ClientSocket1.Socket.SendText('hello');
    改为:
    ClientSocket1.Socket.SendText('hello'+#10+#13);试试看GOOD LUCK!
      

  11.   

    就 以上 问题 的 执行 通过 ,已经 OK 了;如: wks9527 所言;加了 +#10+#13 后 readLine 通过;仔细 想想,以前 也考虑 过 加 \n ,我不知道JAVA 的SOCKET 是否对 字符串中的 \n 做相应处理,DELPHI 好象 不是这么做的,它会把它当做一个普通的字符串,而不是 #10 #13 的效果!此帖OVER!