没有读到数据当你readLine()的时候如果没有读到服务器端给你发送的信息你的客户端程序会一直等待。。因此在你看来就是僵死在那里了确认一下服务器端到底怎么才能给你回复信息

解决方案 »

  1.   

    in.readLine() 要等到对方发\r或\n才退出, 你最好用读到数组的方式
      

  2.   

    是吗,我接触java Socket不久,有没有读数组方式的样例代码吗?希望提供一个,多谢!
      

  3.   

    int len = in.read(buf); //buf是char[]类型,len是实际读到的长度
      

  4.   

    谢谢kingfish的帮助,我将程序改为:
    Socket sock = new Socket("×.×.×.×", 9002); 
    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    wr.write("test string");
    wr.flush();BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    char[] received = new char[2000];
    System.out.println("before read");
    int len = br.read(received);
    System.out.println("the len is: " + len);
             
    第一次执行时,程序能正常打印出“the len is: 145”,但第二次及以后执行时只打印出“"before read"”,而不能打印出“the len is:  ”,即执行到“int len = br.read(received);”这一步时又僵死在这里,读不到数据。
    请教这是什么原因,该怎么解决,谢谢指导!
      

  5.   

    read会阻塞,如果server端没发数据,read就会一直等
      

  6.   

    ServerSocket s = new ServerSocket(PORT);
    System.out.println("Started: " + s);
    String str1 = "";
    try
    {
    Socket socket = s.accept();
    try
    {
    System.out.println("Connection accepted:" + socket);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
    while(true)
    {
    str1 = in.readLine();
    if(str1.equals("END"))break;
    System.out.println("Echoing:" + str1);
    out.println(str1);
    }
    }
    finally
    {
    System.out.println("Closing...");
    socket.close();
    }
    }
    finally
    {
    s.close();
    }
    一段完整的代码
    您看看
    或许对您有帮助
      

  7.   

    建议您看看《java网络编程》
    这本书
    很不错
      

  8.   

    while(true)才对
    否则如果第一次他while (in.readLine() != null)此时你的发送方还没有发数据过来,他就直接做过了这一步,再也不会做while体内的语句了
      

  9.   

    谢谢各位帮助,尤其是kingfish,那意思是说第一次能正确接收到数据,以后几次接收不到数据,是因为“read会阻塞,如果server端没发数据,read就会一直等”的缘故,就是服务器端的socket服务器存在问题,没有返回数据,是吗?
      

  10.   

    我不知道你C端是执行了多次程序还是执行了1次在里面循环收了多次?楼上hellwindy说得不对。
      

  11.   

    你的服务器必须循环监听,放到while(true){}里面是一种方法!
    还有,注意socket的服务是问答试的!
      

  12.   

    jdk的scoket做的有问题,你可以做2个scoket,当其中一个出问题的时候,就回滚到出问题前的某个时间,然后启动另一个scoket,使用2个进行交替,就避免了scoket连接出莫名奇妙的错误问题
      

  13.   

    一个网络文件传输的例子。看看对你是不是有帮助
    服务器端实现代码:import java.io.*;import java.net.*; public class FileServer{       public static void main(String[] args)throws Exception{              //创建文件流用来读取文件中的数据              File file=new File("lishengjie.jpg");              FileInputStream fos=new FileInputStream(file);                            //创建网络服务器接受客户请求              ServerSocket ss=new ServerSocket(3108);              Socket client=ss.accept();                            //创建网络输出流并提供数据包装器              OutputStream netOut=client.getOutputStream();              OutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut));                            //创建文件读取缓冲区              byte[] buf=new byte[2048];              int num=fos.read(buf);              while(num!=(-1)){//是否读完文件                     doc.write(buf,0,num);//把文件数据写出网络缓冲区                     doc.flush();//刷新缓冲区把数据写往客户端                     num=fos.read(buf);//继续从文件中读取数据              }              fos.close();              doc.close();       }} 客户方实现代码:import java.io.*;import java.net.*; public class FileClient{       public static void main(String[] args)throws Exception{              //使用本地文件系统接受网络数据并存为新文件              File file=new File("newFile.jpg");              file.createNewFile();              RandomAccessFile raf=new RandomAccessFile(file,"rw");                            // 通过Socket连接文件服务器              Socket server=new Socket(InetAddress.getLocalHost(),3108);                            //创建网络接受流接受服务器文件数据               InputStream netIn=server.getInputStream();              InputStream in=new DataInputStream(new BufferedInputStream(netIn));                            //创建缓冲区缓冲网络数据              byte[] buf=new byte[2048];              int num=in.read(buf);                            while(num!=(-1)){//是否读完所有数据                     raf.write(buf,0,num);//将数据写往文件                     raf.skipBytes(num);//顺序写文件字节                     num=in.read(buf);//继续从网络中读取文件              }              in.close();              raf.close();       }}