A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈兆辉 于 2014-10-10 10:41 编辑

如题,写多线程上传文件的例子,我运行服务端的时候没问题,一运行客户端就发生绑定异常:java.net.BindException: Address already in use: JVM_Bind。无论我改端口号还是重启eclipse或者终止javax都没有用。最后也没找到错误在哪,求大家帮我看看哪错了。
首先是服务端的代码:
  1. package review.part4;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.File;
  5. import java.io.FileOutputStream;
  6. import java.io.IOException;
  7. import java.io.PrintWriter;
  8. import java.net.ServerSocket;
  9. import java.net.Socket;

  10. class ServerThread implements Runnable{
  11.         //接收客户端对象
  12.         private Socket client;
  13.         ServerThread(Socket client){
  14.                 this.client = client;
  15.         }
  16.         
  17.         @Override
  18.         public void run() {
  19.                 //打印ip信息
  20.                 String ip = client.getInetAddress().getHostAddress();
  21.                 System.out.println(ip+": connected");
  22.                
  23.                 //创建要上传的文件
  24.                 int count = 1;
  25.                 try {
  26.                         File file = new File(ip+"("+(count)+").mp3");
  27.                         while(file.exists()){
  28.                                 file = new File(ip+"("+(++count)+").mp3");
  29.                         }
  30.                         
  31.                         //创建网络读取流和文件写入流。
  32.                         BufferedInputStream bufIn = new BufferedInputStream(client.getInputStream());
  33.                         BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
  34.                         
  35.                         //循环读取,写入所创建的文件中
  36.                         byte[] buf = new byte[1024];
  37.                         int len = 0;
  38.                         while((len = bufIn.read(buf))!=-1){
  39.                                 bos.write(buf, 0, len);
  40.                                 bos.flush();
  41.                         }
  42.                         
  43.                         //创建网络写入流写出回馈信息,然后关闭资源
  44.                         PrintWriter pw = new PrintWriter(client.getOutputStream());
  45.                         pw.println("ok,传完啦!");
  46.                         bos.close();
  47.                         client.close();
  48.                         
  49.                 } catch (IOException e) {
  50.                         throw new RuntimeException(ip+"传输失败!");
  51.                 }
  52.         }
  53.         
  54. }
  55. class ServerConcurrencyUpload {

  56.         public static void main(String[] args) throws IOException {
  57.                 //建立服务器端点,循环接收请求,并建立线程。
  58.                 ServerSocket server = new ServerSocket(10086);
  59.                 while(true){
  60.                         Socket client = server.accept();
  61.                         new Thread(new ServerThread(client)).start();
  62.                 }
  63.         }

  64. }
复制代码


然后是客户端的代码:
  1. package review.part4;

  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedOutputStream;
  4. import java.io.BufferedReader;
  5. import java.io.File;
  6. import java.io.FileInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9. import java.net.InetAddress;
  10. import java.net.Socket;
  11. import java.net.UnknownHostException;

  12. class ClientConcurrencyUpload {

  13.         public static void main(String[] args) throws UnknownHostException, IOException {
  14.                 //建立客户端
  15.                 Socket socket = new Socket(InetAddress.getLocalHost(),10086);
  16.                 //根据所传路径建立文件,并检查所传路径是否正确
  17.                 File file = new File(args[0]);
  18.                 //是否选择了一个jpg文件
  19.                 if(!(args.length==1 && args[0].endsWith(".mp3"))){
  20.                         System.out.println("请选择一个MP3格式的文件");
  21.                         socket.close();
  22.                         return;
  23.                 }
  24.                 //文件是否存在
  25.                 if(!(file.exists() && file.isFile())){
  26.                         System.out.println("所选文件不存在!");
  27.                         socket.close();
  28.                         return;
  29.                 }
  30.                 //文件大小检查
  31.                 if(file.length()>5*1024*1024){
  32.                         System.out.println("文件不能超过5M");
  33.                         socket.close();
  34.                         return;
  35.                 }
  36.                
  37.                 //检查正确,开始读取所选文件,然后上传
  38.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
  39.                 BufferedOutputStream bufOut = new BufferedOutputStream(socket.getOutputStream());
  40.                
  41.                 byte[] buf = new byte[1024];
  42.                 int len = 0;
  43.                 while((len = bis.read(buf))!=-1){
  44.                         bufOut.write(buf,0,len);
  45.                         bufOut.flush();
  46.                 }
  47.                
  48.                 //关闭写入流,读取服务器反馈信息,关闭资源
  49.                 socket.shutdownOutput();
  50.                 BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  51.                 System.out.println(reader.readLine());
  52.                 bis.close();
  53.                 socket.close();
  54.         }

  55. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1

查看全部评分

9 个回复

正序浏览
应该是你所传文件的路径没写对,
我刚试了一下,如果客服端文件的路径不对,在客服端的异常是: java.io.FileNotFoundException
,而在服务端则是Connection reset

你将检查一下你输入的文件路径再 试试
回复 使用道具 举报
xplcc 发表于 2014-10-7 13:54
运行了一下 可以运行 代码没问题 就是设计上有问题 每次运行客户端不管上传成功与否 服务端都会创建文件  ...

在你电脑上运行没问题?那就奇怪了。我今早还运行了一遍,还是老毛病啊!
回复 使用道具 举报
xplcc 中级黑马 2014-10-7 13:54:58
8#
陈兆辉 发表于 2014-10-7 10:11
换了N次了,要是换个端口号就好了,我早就解决了,也不至于来这边问啊。就是解决不了才求大神们给我看看 ...

运行了一下 可以运行 代码没问题 就是设计上有问题 每次运行客户端不管上传成功与否 服务端都会创建文件
回复 使用道具 举报
亲们,帮我看看撒!
回复 使用道具 举报
xplcc 发表于 2014-10-6 23:59
换个端口号,你每次启动端口号被上次启动占用了

换了N次了,要是换个端口号就好了,我早就解决了,也不至于来这边问啊。就是解决不了才求大神们给我看看呢。
回复 使用道具 举报

换个端口号,你每次启动端口号被上次启动占用了
回复 使用道具 举报
没人么?
回复 使用道具 举报
犹豫铅笔 发表于 2014-10-6 20:48
估计你服务端运行了一次,没关,又运行了一次服务端

不是这个问题,我eclipse都重启好几遍了,javax也关了好几次了。没用。
回复 使用道具 举报
估计你服务端运行了一次,没关,又运行了一次服务端
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马