0

我用 Java 编写了服务器和客户端的代码。客户端能够从服务器下载文件,服务器也应该能够同时向客户端提供文件。为此,我在 Server 中使用了多线程。

它对一个客户端来说工作得很好,但是在为每个客户端使用线程时,它似乎在我的代码中无法正常工作。

由于文件未正确下载,已损坏并且针对不同客户端的大小不同。

从客户端接受后,我正在创建一个新线程来为它提供服务器的文件代码 -

public static void send(String pathname) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException
{

    try
    {
    System.out.println("....");

    byte[] buf = new byte[1024];
    OutputStream os = sock.getOutputStream();
    //PrintWriter writer = new PrintWriter(os);
    System.out.println("...11.");

    BufferedOutputStream out = new BufferedOutputStream(os, 1024);
    int i=0;


    System.out.println("hi1");
    File fp = new File(pathname);
    System.out.println("hi2");
    RandomAccessFile ra = new RandomAccessFile(fp,"r");
    System.out.println("hi3");
    long bytecount=1024;
    ////////////////

    while((i=ra.read(buf, 0, 1024)) != -1)
    {

    System.out.println("hi");

        bytecount += 1024;
        System.out.println("hi6");
        out.write(buf, 0, i);
        System.out.println("hi7");
        out.flush();
    }
    System.out.println("bye");
    //os.flush();
    //out.close();
    ra.close();
    //sock.close();
    }
    catch(IOException ex)
    {

    }
    }

用于文件接收的客户端代码是

    public void run() {
        try{
            byte[] b = new byte[1024];
            int len = 0;
            long  bytcount = 1024;

            File fp = new File(path);
            RandomAccessFile ra=new RandomAccessFile(fp,"rw");
            ra.seek(0);
            InputStream is = sock.getInputStream();
            BufferedReader reader=new BufferedReader(new InputStreamReader(is));
            while ((len = is.read(b, 0, 1024)) != -1) {
                  bytcount = bytcount + 1024;

                  //decrypt

                  ra.write(b, 0, len);

            }
            //is.close();
            //ra.close();
            //sock.close();

        }
            catch(IOException ex){
            ex.printStackTrace();
            }

//        throw new UnsupportedOperationException("Not supported yet.");
    }


}

我不知道这里出了什么问题。请提前帮助很多很多thanx

4

2 回答 2

3

send是静态的,这表明您只有一个名为 的套接字,sock否则以下内容将无法编译。

 public static void send(String pathname) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException
{

    try
    {
    System.out.println("....");

    byte[] buf = new byte[1024];
    OutputStream os = sock.getOutputStream();
    //PrintWriter writer = new PrintWriter(os);
    System.out.println("...11.");

如果是这种情况,很难看出向 >1 个客户的交付如何可靠。您肯定需要每个客户端一个套接字来执行并发交付吗?需要更多代码才能确定这一点,但看起来套接字处理的设计可能需要修改。

于 2012-11-26T22:31:55.133 回答
2

您的第一个问题是您在服务器上使用 OutputStream 并在客户端使用 Reader。客户端应该使用 InputStreams,而不是 Readers。

于 2012-11-26T21:01:26.797 回答