我使用java.net编写一个文件传输服务器,需要接受客户端发送过来的文件,文件接受完毕过后,在给客户端发送一个ok的确认信息,结果出现了一个如下的问题:
客户传输一个文件过后,在随后使用
byte returnvalue[]=new byte[10];
int len=in.read(returnvalue);
接受服务器确认的信息时,却在服务器端老实出现接收阻塞,既num = in.read(buf);一直阻塞,无法得到-1结束的信息,并且一个在等待》
请问该如何处理

解决方案 »

  1.   

    /*
     * 创建日期 2005-12-28
     */
    package server.nio.fileserver;import java.io.*;import java.net.*;public class FileServer {    public static void main(String[] args) throws Exception {        //使用本地文件系统接受网络数据并存为新文件
            FileServer f=new FileServer();
            
            File file = new File("D:\\newFile.mp3");
            file.createNewFile();        RandomAccessFile raf = new RandomAccessFile(file, "rw");        // 通过Socket连接文件服务器        ServerSocket ss = new ServerSocket(3108); Socket server = ss.accept();        //创建网络接受流接受服务器文件数据        InputStream netIn = server.getInputStream();
            InputStream in = new DataInputStream(new BufferedInputStream(netIn));
           
            OutputStream netOut = server.getOutputStream();
    OutputStream doc = new DataOutputStream(
    new BufferedOutputStream(netOut));

            //创建缓冲区缓冲网络数据
      f.jieshou(in,raf);//        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);//继续从网络中读取文件
    //            System.out.println(num);
    //        }
            
            
            doc.write("ok".getBytes());
            doc.flush();
            in.close();        raf.close();    }
        
        synchronized void jieshou(InputStream in, RandomAccessFile raf) {
            try {
                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);//继续从网络中读取文件
                    System.out.println(num);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }    }}
      

  2.   

    /*
     * Created on 2005-12-28
     * 
     * TODO To change the template for this generated file go to Window -
     * Preferences - Java - Code Style - Code Templates
     */
    package Client.fileclient;import java.io.*;import java.net.*;public class FileClient { public static void main(String[] args) throws Exception { //创建文件流用来读取文件中的数据 File file = new File("D:\\SH1.jpg");
    FileInputStream fos = new FileInputStream(file); //创建网络服务器接受客户请求 Socket server=new Socket(InetAddress.getLocalHost(),3108); //创建网络输出流并提供数据包装器 OutputStream netOut = server.getOutputStream();
    OutputStream doc = new DataOutputStream(
    new BufferedOutputStream(netOut));

     InputStream netIn = server.getInputStream();
            InputStream in = new DataInputStream(new BufferedInputStream(netIn));
             //创建文件读取缓冲区 byte[] buf = new byte[2048]; int num = fos.read(buf); while (num != (-1)) {//是否读完文件 doc.write(buf, 0, num);//把文件数据写出网络缓冲区 doc.flush();//刷新缓冲区把数据写往客户端 num = fos.read(buf);//继续从文件中读取数据 }

     Thread.sleep(1500);        byte returnvalue[]=new byte[10];
            int len=in.read(returnvalue);
            String str=new String(returnvalue,0,len);
    System.out.println(str);
    fos.close(); doc.close(); }}