黑马程序员技术交流社区

标题: 网络编程:客户端上传文件到服务端问题 [打印本页]

作者: 薛飞飞    时间: 2012-4-9 22:43
标题: 网络编程:客户端上传文件到服务端问题
从客户端往服务端传送文件:为什么启动客户端并输入路径后服务端没反应....

运行程序代码:

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Service {
        public static void main(String[] args) throws IOException {
               
                ServerSocket serverSocket = new ServerSocket(8888);
               
                while(true){
                        Socket socket = serverSocket.accept();
                        new Thread(new Server(socket));
                }
        }       
}

客户端代码:import java.io.BufferedReader;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class Client {               
        public static void main(String[] args) throws IOException {
               
                // 读键盘,用户输入一个文件路径,绝对路径
                System.out.println("请输入文件的绝对路径:");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                String line = br.readLine();
               
                File file = new File(line);
                if(!file.exists()) {
                        System.out.println("文件不存在");
                        return;
                }
                String filename = file.getName();
               
                //建立客户端,并向服务端发送文件(文件名,文件内容)
                Socket clientSocket = new Socket("127.0.0.1",8888);               
                OutputStream out = clientSocket.getOutputStream();
                //发送文件名
                out.write(filename.getBytes());
                //发送换行符,将文件名和文件内容的数据隔开
                out.write("\r\n\r\n".getBytes());
                //发送文件内容的数据
                InputStream in = new FileInputStream(file);
                int len;
                byte[] byts = new byte[1024];
                while((len=in.read(byts))!=-1){
                        out.write(byts, 0, len);
                }
                //阻塞读取结果
                InputStream inputStream = clientSocket.getInputStream();
                len = inputStream.read(byts);
                String s = new String(byts,0,len);
                System.out.println(s);
               
                clientSocket.close();
        }
}

服务器代码:import java.io.File;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
class Server implements Runnable{
                       
        private Socket socket;
       
        public Server(Socket socket){
                this.socket = socket;
        }
        public void run() {
                try{
                        Thread.sleep(100);
                        InputStream in = socket.getInputStream();
                        int pos = 0;
                        byte[]  byts = new byte[1024];
                        while(true) {
                                int ch = in.read();
                                //当读到"\r\n\r\n"时就中断读取,并获取此时读取\r之前的字符个数
                                if(ch=='\r'&&(ch=in.read())=='\n'&&(ch=in.read())=='r'&&(ch=in.read())=='\n') {
                                        break;
                                }
                                byts[pos++] = (byte)ch;
                        }
                        //在服务端创建文件           1. 获得文件名
                        String filename = new String(byts,0,pos);
                        //在服务端创建文件        2.约定存放文件的目录d:\\upload
                        File uploadDir = new File("d:\\upload");
                        File target = new File(uploadDir,filename);
                        //创建文件        先创建目录,再创建文件
                        target.getParentFile().mkdirs();
                        target.createNewFile();
                       
                        //读取文件数据
                        OutputStream out = new FileOutputStream(target);
                        int len;
                        byts = new byte[1024];
                        //因为读取文件数据时,客户端可能会暂时停止发送,这时用!=-1判断就不准了!
                        while(true) {
                                len=in.read(byts);
                                out.write(byts, 0, len);
                                if(len<1024) {
                                        break;
                                }
                        }
                        System.out.println("上传结束");
                        out.close();
                       
                        //通知客户端上传结束
                        OutputStream outputStream = socket.getOutputStream();
                        outputStream.write("上传完毕".getBytes());
                }catch(Exception e){
                        e.printStackTrace();
                }finally{
                        if(socket!=null){
                                try {
                                        socket.close();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                }
        }

}
作者: 薛飞飞    时间: 2012-4-10 19:48
靠,一天了,都没人能回答我的问题吗...
作者: 刘少伟    时间: 2012-4-10 22:59
本帖最后由 刘少伟 于 2012-4-10 23:36 编辑

1、Service里new了一个线程,要让它运行。
new Thread(new Server(socket)).start();
2、Server里,判断\r\n\r\n的地方,第三个判断少了个“\”
这样运行,上传是成功的。你试试、




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2