黑马程序员技术交流社区

标题: 请大家帮我看看,怎么情况?--服务端和客户端问题 [打印本页]

作者: smile_joe    时间: 2013-4-30 22:09
标题: 请大家帮我看看,怎么情况?--服务端和客户端问题
本帖最后由 smile_joe 于 2013-5-1 14:17 编辑

创建一个服务器,对外提供端口,多个客户端可同时访问,并可以上传文件到指定目录
但是我的怎么到中途就不执行了,找死我了,找不到哪里出了问题,请帮忙看看---------我头大休息下
万分感谢...................
---------------------------------------------------------------------------------服务端
package cn.joe.Tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Test_Server {
        public static void main(String[] args) throws Exception {
                ServerSocket ss = new ServerSocket(6666);// 创建服务器收发对象
                while (true) { // 循环运行
                        final Socket s = ss.accept();// 得到链接

                        new Thread() {// 多线程,每一个客户端新一个线程
                                public void run() {
                                        try {
                                                // 输入输出流
                                                InputStream is = s.getInputStream();
                                                OutputStream os = s.getOutputStream();
                                                BufferedReader br = new BufferedReader(
                                                                new InputStreamReader(is));// 包装
                                                PrintStream ps = new PrintStream(os);// 包装
                                                // 接收文件名检查文件是否存在,把结果返回给客户端
                                                String filename = br.readLine();
                                                long filelength = Long.parseLong(br.readLine());

                                                File f = new File("E:/devlop", filename);// 读取后指定到此文件
                                                if (f.exists() && f.length() == filelength) {
                                                        ps.print("文件已存在");
                                                        return;// 退出方法
                                                } else {
                                                        ps.print(f.length());
                                                }

                                                String ip = s.getInetAddress().getHostAddress();// 获取链接此接口ip字符串
                                                System.out.println(ip
                                                                + (f.exists() ? "断点续传" : " 正在上传 ") + filename);// 输出信息
                                                long start = System.currentTimeMillis();
                                                // 定义指向文件读取网络写入文件
                                                FileOutputStream fos = new FileOutputStream(f, true);
                                                byte[] b = new byte[1024];
                                                int len;
                                                while ((len = is.read(b)) != -1)
                                                        // 读取客户段
                                                        fos.write(b, 0, len);
                                                fos.close();
                                                s.close();// 释放

                                                long end = System.currentTimeMillis();
                                                System.out.println(ip + " 上传完毕 " + filename + ".耗时: "
                                                                + (start - end) + " 毫秒.");
                                        } catch (IOException e) {
                                                e.printStackTrace();
                                        }
                                }

                        }.start();
                }
        }
}
-----------------------------------------------------------------------------------------------客户端
package cn.joe.Tcp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Test_Client {
        public static void main(String[] args) throws Exception {
                Socket s = new Socket("192.168.0.3", 6666);// 指定服务器ip,端口进行访问
                // 获取输入输出流
                InputStream is = s.getInputStream();
                OutputStream os = s.getOutputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));// 包装
                PrintStream ps = new PrintStream(os);// 包装
                // 指定文件
                File f = getFile();
                // 发送文件到服务器
                ps.println(f.getName());
                ps.println(f.length());
                // 接收结果,判断是否存在
                String result = br.readLine();
                if ("存在".equals(result)) {
                        System.out.println("上传文件已经存在");
                        return;
                }
                // 指向文件,读取文件写入网络,因为要读取非文本文件使用字节流
                FileInputStream fis = new FileInputStream(f);
                long filelength = Long.parseLong(result);// 服务端已完成的大小
                fis.skip(filelength);// 跳过上次完成的字节数
                byte[] b = new byte[1024];
                int len;
                while ((len = fis.read(b)) != -1)
                        // 读取文件
                        os.write(b, 0, len); // 写入
                fis.close();
                s.close();
                System.out.println("上传完毕");
        }

        // 对接收文件进行判断
        private static File getFile() {
                System.out.println("请输入一个文件路径:");
                Scanner sc = new Scanner(System.in);
                while (true) {
                        File file = new File(sc.nextLine());// 指定文件
                        if (!file.exists())// 判断路径
                                System.out.println("输入的路径不存在");
                        else if (file.isDirectory())
                                System.out.println("暂时不支持文件夹上传,谢谢");
                        else
                                // if(file.isFile() && file.length()<1024*1024*100)
                                return file;// 如果是文件,并且大小小于100M接收
                }
        }

}

求帮忙...
作者: breeze    时间: 2013-4-30 23:52
1. 你在服务器端判断文件是否已经存在时反馈给客户端的输出语句写成了ps.print(), 导致客户端的br.readLine()得不到一行
2. 如果你想在本机测试, 将客户端里Socket指向服务器端的Ip改为本机ip
3. 看下面纠正后的代码(只写了错误的部分)
----------------服务器端----------------------
if (f.exists() && f.length() == filelength) {
         ps.println("文件已存在"); //--------->错出在这里, 你没有输出隔行, 应该是ps.println();
         return;// 退出方法
       } else {
         ps.println(f.length());  //------->还有这里, 应该是ps.println();
       }

-----------------客户端 -----------------------
Socket s = new Socket(InetAddress.getLocalHost(), 6666);// 指定服务器ip,端口进行访问---->如果本机测试, 将服务器地址设置为本机
作者: 曹睿翔    时间: 2013-5-1 07:04

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢




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