2011-06-27 34 views
0

我想创建简单的下载加速器。带多线程的Java客户端/服务器文件传输问题

它是如何工作

  1. 服务器等待传入的连接。
  2. 客户端连接到服务器。
  3. 然后,服务器将文件大小发送到客户端并等待下载连接。
  4. 客户端获得文件大小,然后创建下载线程,并将这些线程连接到服务器。
  5. 服务器从每个线程获得连接后,服务器将等待来自线程的开始和结束偏移文件。
  6. 每个线程发送开始和结束偏移文件到服务器。
  7. 服务器得到偏移量后,服务器会将文件的一部分发送给线程。
  8. 每个线程都会读取和写入文件。例如,buffer.p01,buffer.p02,buffer.p03
  9. 客户端按顺序将所有文件合并为一个文件顺序。 (尚未实施

我认为服务器端它工作正常,但客户端它有一些问题。

的问题是,如果我设置MAXTHREAD 1,它工作正常。但是,如果我设置了多个,它永远停留在某个地方。

这是服务器端的代码.. http://pastebin.com/TEakGB0c

,这是客户端代码与多线程 http://pastebin.com/wKhP7DxS

谢谢你。

+0

听起来像一个死锁问题。没有任何代码,我们不能真正帮助? –

+0

我已经在问题结尾处发布了代码。你能看到吗? –

+0

啊我现在看到它。让我看看。 –

回答

1

你有一个很明显的问题。 ServerSocket的accept方法每次都会返回一个新的套接字。在这里你的服务器代码

initSocket = servSock.accept(); 

initSocket是,这意味着你将在写旧插座,从来没有关闭它的一类成员字段。你应该开始一个新的线程来处理这个套接字,从我看到它看起来你只是不断重复使用相同的套接字。这是行不通的。查看关于如何打开套接字的教程。对不起,我不能帮助更多,但有很多事情发生在这里,这是行不通的。也许你可以开始专注于部分代码,我们可以提供更多帮助。

0

我同意,这可能是一个小问题,或者它可能是一个大的,一些示例代码,将有助于我们帮助你,如果你试图连接到服务器使用相同的端口3次,你会得到一个错误,因为每个端口只能有1个连接,问题可能会非常简单或非常复杂,如果您编辑您的文章并添加您的代码,那么我们可以更好地帮助您。

0
Please close your OutputStream os 

Sending u a snippet 


public static boolean sendFile() { 
     int start = Integer.parseInt(startAndEnd[0]) - 1; 
     int end = Integer.parseInt(startAndEnd[1]) - 1; 
     int size = (end - start) + 1; 
     try { 
      os = initSocket.getOutputStream(); 
      os.write(byteArr, start, size); 
      os.flush(); 
      System.out.println("Send file to : " + initSocket); 
     } catch (IOException e) { 
      System.out.println(e.getLocalizedMessage()); 
      disconnected(); 
      return false; 
     } finally { 
      if (os != null) { 
       try { 
        os.close(); 
       } catch (IOException ex) { 
        Logger.getLogger(FileServer.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     } 
     return true; 
    } 
相关问题