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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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接收
                }
        }

}

求帮忙...

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 下次记得用&lt;&gt;把代码粘贴进去.

查看全部评分

2 个回复

倒序浏览
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,端口进行访问---->如果本机测试, 将服务器地址设置为本机
回复 使用道具 举报

如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马