第一次写socket小程序,用socket上传文件,却总出问题,请大家帮我看看代码,到底是什么原因,以下是我的代码客户端:package com.ydz.client.socket;import java.io.*;
import java.net.*;public class SocketClient { public static void main(String[] args)
{
Socket s = null;
try{
File file = new File("F://java练习//AA.java");
FileInputStream fis = new FileInputStream(file);
long fileSize = fis.available();
String fileName = file.getName();
s = new Socket("127.0.0.1", 10000);
System.out.println("已经连接上服务器");
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(fileSize);
pw.println(fileName);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
for(long i=0; i<count; i++){
int aa = fis.read(buffer, 0, 1024);
os.write(buffer, 0, aa);
}
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
if(br.readLine().equals("OK")){
os.close();
fis.close();
s.close();
}
} catch (IOException e){
e.printStackTrace();
}
}
}
服务端:package com.ydz.server.socket;import java.io.*;
import java.net.*;import com.ydz.server.thread.inceptfile.InceptFileThread;public class SocketServer { public void start()
{
try{
ServerSocket ss = new ServerSocket(10000);
System.out.println("等待客户端连接");
int i = 1;
while(true){
Socket s = ss.accept();
System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
InceptFileThread ifThread = new InceptFileThread(s, i);
ifThread.start();
i++;
}
} catch (IOException e){
e.printStackTrace();
}
}

public static void main(String[] args)
{
SocketServer ss = new SocketServer();
ss.start();
}
}
package com.ydz.server.thread.inceptfile;import java.io.*;
import java.net.Socket;public class InceptFileThread extends Thread { private Socket s;
private int fileNumber;

public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}

public void run(){
try{
InputStream is = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
PrintWriter pw = new PrintWriter(s.getOutputStream());
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileSizeStr = br.readLine();
System.out.println("文件长度"+fileSizeStr);
long fileSize = Long.valueOf(fileSizeStr).longValue();
String fileName = br.readLine();
System.out.println("文件名称"+fileName);
StringBuilder filePath = new StringBuilder();
filePath.append("E://主服务器//file")
.append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())
fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
long count = fileSize/1024;
if(fileSize%1024 != 0)
count += 1;
System.out.println("开始接收文件");
for(long i=0; i<count; i++){
int aa = is.read(buffer, 0, 1024);
fos.write(buffer, 0, aa);
}
fos.close();
is.close();
System.out.println("文件"+fileNumber+"上传完毕");
pw.println("OK");
} catch (IOException e) {
e.printStackTrace();
}
}
}
整个程序执行到线程类的for循环中的第一句“int aa = is.read(buffer, 0, 1024);”就阻塞了,文件总是无法实现上传,请各位高人知道,提前感谢。

解决方案 »

  1.   

    楼主,我测试了你的程序.正常
    运行结果:
    [align=center]等待客户端连接
    第1客户端连接进来了
    第1个文件开始上传
    文件长度19968
    文件名称1.doc
    开始接收文件
    文件1上传完毕[/align]
      

  2.   

    等待客户端连接
    第1客户端连接进来了
    第1个文件开始上传
    文件长度19968
    文件名称1.doc
    开始接收文件
    文件1上传完毕
      

  3.   

    为什么我这里测试的时候就总是阻塞呢输出结果等待客户端连接
    第1客户端连接进来了
    第1个文件开始上传
    文件长度182
    文件名称AA.java
    开始接收文件这样就没反应了,也没有异常的捕获,文件只是在目标目录创建了,但是没有内容上传
      

  4.   

    给你改了改,你试试:public class InceptFileThread extends Thread {    private Socket s;
        private int fileNumber;
        
        public InceptFileThread(Socket s, int fileNumber){
            this.s = s;
            this.fileNumber = fileNumber;
        }
        
        public void run(){
            try{
                InputStream is = s.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                PrintWriter pw = new PrintWriter(s.getOutputStream());
                System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");

                String fileSizeStr = br.readLine();
                System.out.println("文件长度"+fileSizeStr);

                long fileSize = Long.valueOf(fileSizeStr).longValue();
                String fileName = br.readLine();
                System.out.println("文件名称"+fileName);

                StringBuilder filePath = new StringBuilder();
                filePath.append("E://主服务器//file").append(fileNumber);
                File fileCatalog = new File(filePath.toString());
                if(!fileCatalog.exists())fileCatalog.mkdirs();
                filePath.append("//").append(fileName);

                File file = new File(filePath.toString());
                FileOutputStream fos = new FileOutputStream(file);
                byte[] buffer = new byte[1024];
                long count = fileSize/1024;
                if(fileSize%1024 != 0)
                    count += 1;
                System.out.println("开始接收文件");

    pw.println("ready");
    pw.flush();
    System.out.println("server is ready!");
                //for(long i=0; i<count; i++){
    while(true){
                    int aa = is.read(buffer, 0, 1024);
    if(aa==-1)break;
    System.out.println("aa="+aa);
                    fos.write(buffer, 0, aa);
                }

                fos.close();
                is.close();
                System.out.println("文件"+fileNumber+"上传完毕");
                pw.println("OK");
    pw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public class SocketClient {    public static void main(String[] args)
        {
            Socket s = null;
            try{
                File file = new File("F:\\java练习\\AA.java");
                FileInputStream fis = new FileInputStream(file);
                long fileSize = fis.available();
                String fileName = file.getName();
                s = new Socket("127.0.0.1", 10000);
                System.out.println("已经连接上服务器");

                OutputStream os = s.getOutputStream();
                PrintWriter pw = new PrintWriter(os, true);

                pw.println(fileSize);
                pw.println(fileName);
    pw.flush();

                byte[] buffer = new byte[1024];

                long count = fileSize/1024;
                if(fileSize%1024 != 0)
                    count += 1;
    System.out.println("wait for the data from the server:");

        InputStream in = s.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line="";
    while(true){
          line=br.readLine();
      System.out.println("line="+line);
          if(line!=null && line.equals("ready")){
          for(long i=0; i<count; i++){
    int aa = fis.read(buffer);
    System.out.println("aa="+aa);
    os.write(buffer, 0, aa);
    os.flush();
       }
       break;
      }  
    }

    os.close();
                fis.close();
                s.close();
    br.close();

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

  5.   

    感谢6楼朋友的帮忙,不过你改完的程序还是那样的,无法上传文件,我以前没有写过socket编程,不知道这里是不是和服务端的接受信息完毕的回叫应答有关系,服务端信息接收完毕的回叫应答应该如何写,客户端又该如何接收这个应答信号呢
      

  6.   

    如果我去掉客户端
    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                if(br.readLine().equals("OK")){
    这个判断,但是判断条件内部的语句保留,文件可以传上去了,但是传上去的文件,占用空间大小和原文件一样,打开后却是空的,什么都没有。
      

  7.   

    呵呵,服务端的read方法是阻塞的啊,所以你客户端不断开的话,他就在那里一直死等啊,而你客户端的最后那个BufferedReader也是阻塞等待,大家就这样一直等一下去...
    刚帮你看了下,文件传上去后确实是空的,帮你改了一下:// 客户端
    package test;import java.io.*;
    import java.net.*;public class SocketClient {    public static void main(String[] args)
        {
            Socket s = null;
            try{
                File file = new File("C:/socketTest.txt");
                BufferedReader br = new BufferedReader(new FileReader(file));
                long fileSize = file.length();//.available();
                String fileName = file.getName();
                s = new Socket("127.0.0.1", 10000);
                System.out.println("已经连接上服务器");
                OutputStream os = s.getOutputStream();
                PrintWriter pw = new PrintWriter(os, true);
                pw.println(fileSize);
                pw.println(fileName);
                final char[] buffer = new char[1024];
                long count = fileSize/1024;
                if(fileSize%1024 != 0)
                    count += 1;
    //            for(long i=0; i<count; i++){
    //                int aa = fis.read(buffer, 0, 1024);
    //                os.write(buffer, 0, aa);
    //            }
                int len = 0;
                while((len = br.read(buffer,0,buffer.length)) != -1) { 
            
                 pw.write(buffer, 0, len);
                 pw.flush();
             }
    //            BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
    //            if(br2.readLine().equals("OK")){
                    os.close();
                    pw.close();
                    s.close();
    //            }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    //服务端package test;import java.io.*;
    import java.net.*;
    public class SocketServer {    public void start()
        {
            try{
                ServerSocket ss = new ServerSocket(10000);
                System.out.println("等待客户端连接");
                int i = 1;
                while(true){
                    Socket s = ss.accept();
                    System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
                    InceptFileThread ifThread = new InceptFileThread(s, i);
                    ifThread.start();
                    i++;
                }
            } catch (IOException e){
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args)
        {
            SocketServer ss = new SocketServer();
            ss.start();
        }
    }class InceptFileThread extends Thread {    private Socket s;
        private int fileNumber;
        
        public InceptFileThread(Socket s, int fileNumber){
            this.s = s;
            this.fileNumber = fileNumber;
        }
        
        public void run(){
            try{
                InputStream is = s.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                PrintWriter pw = new PrintWriter(s.getOutputStream());
                System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
                String fileSizeStr = br.readLine();
                System.out.println("文件长度"+fileSizeStr);
                long fileSize = Long.valueOf(fileSizeStr).longValue();
                String fileName = br.readLine();
                System.out.println("文件名称"+fileName);
                StringBuilder filePath = new StringBuilder();
                filePath.append("C://file")
                 .append(fileNumber);
                File fileCatalog = new File(filePath.toString());
                if(!fileCatalog.exists())
                    fileCatalog.mkdirs();
                filePath.append("//").append(fileName);
                File file = new File(filePath.toString());
                FileWriter fos = new FileWriter(file);
                final char[] buffer = new char[1024];
                long count = fileSize/1024;
                if(fileSize%1024 != 0)
                    count += 1;
                System.out.println("开始接收文件");
    //            for(long i=0; i<count; i++){
    //                int aa = is.read(buffer, 0, 1024);
    //                fos.write(buffer, 0, aa);
    //            }
                int len = 0;
             while((len = br.read(buffer,0,buffer.length)) != -1) { 
    fos.write(buffer, 0, len);
    fos.flush();
             }
                fos.close();
                is.close();
                System.out.println("文件"+fileNumber+"上传完毕");
               // pw.println("OK");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
      

  8.   

    测试14楼朋友帮我改好的程序,有一个新问题,如果上传rar压缩文件,那传上去的文件实际大小要不原来的文件小,而且文件是被破坏了的