黑马程序员技术交流社区

标题: 引用构造函数出现了问题! [打印本页]

作者: 王康    时间: 2012-2-17 14:54
标题: 引用构造函数出现了问题!
本帖最后由 王康 于 2012-2-17 16:02 编辑

package com.me;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
* 上传图片客户端
* @author 黑马_王康
*
*/
public class PicThreadClient implements Runnable{
        private Socket s;
       
        PicThreadClient(Socket s){
                this.s = s;
        }
       
        String ip = s.getInetAddress().getHostAddress();
       
        @Override
        public void run() {
                try {
                        int count = 1;
                        System.out.println(ip+"....connected");
                        InputStream in = s.getInputStream();
                       
                        File file = new File(ip+"("+(count)+")"+".jpg");
                       
                        while(file.exists()){
                                file = new File(ip+"("+(count++)+")"+".jpg");
                        }
                       
                        FileOutputStream fos = new FileOutputStream(file);
                       
                        byte[] buf = new byte[1024];
                        int len = 0;
                        while((len=in.read(buf))!=-1){
                                fos.write(buf,0,len);
                        }
                        s.shutdownOutput();
                        OutputStream out = s.getOutputStream();
                        out.write("恭喜,上传成功!".getBytes());
                       
                        fos.close();
                        s.close();
                       
                } catch (IOException e) {
                        throw new RuntimeException(ip+"上传失败!");
                }
        }
}



package com.me;

import java.net.ServerSocket;
import java.net.Socket;

/**
* 上传图片服务端
* @author 黑马_王康
*
*/
public class PicThreadServer {

        /**
         * @param args
         */
        public static void main(String[] args) throws Exception{
                ServerSocket ss = new ServerSocket(10010);
               
                while(true){
                        Socket s = ss.accept();
                       
                        new Thread(new PicThreadClient(s)).start(); //此处引用了PicThreadClient类的构造函数PicThreadClient(s),并传递了Socket的对象.
                        //编译时出现如下错误:
                        /*D:\Workspaces\test\src\com\me>javac PicThreadServer.java
                        PicThreadServer.java:17: 找不到符号
                        符号: 类 PicThreadClient                                //为什么找不到这个类
                        位置: 类 com.me.PicThreadServer
                                                new Thread(new PicThreadClient(s)).start();
                                                               ^
                        1 错误
                        */
        }
               
        }

}

作者: 王康    时间: 2012-2-17 14:57
应该怎么指定要调用的指定类的构造函数呢?
作者: 刘基军    时间: 2012-2-17 15:31
你先编译生成PicThreadClient.class,应该就可以了。
作者: 王康    时间: 2012-2-17 16:00
本帖最后由 王康 于 2012-2-17 16:01 编辑

我是先编译的PicThreadClient.java
但是不行
作者: b_boywindy    时间: 2012-2-17 16:17
大哥 客户端怎么 实现了 Runnable  服务器 才是 多线程   客户端只连接一次 不需要就不连接了  
作者: 王康    时间: 2012-2-17 16:19
本帖最后由 王康 于 2012-2-17 16:23 编辑

我现在问的是怎么调用不到PicThreadClient类的构造函数
顺便回答你的问题:
因为我所有的客户短执行的都是相同的动作,所以只要在服务端new 客户端的线程就行了.
作者: 刘基军    时间: 2012-2-17 16:31
王康 发表于 2012-2-17 16:19
我现在问的是怎么调用不到PicThreadClient类的构造函数
顺便回答你的问题:
因为我所有的客户短执行的都是相 ...

你是不是用的命令行cmd编译的?
作者: 刘基军    时间: 2012-2-17 17:01
如果是的话(包的影响),参考编译运行的步骤:
1.cmd输入: javac -d . picThreadClient.java     //会在当前目录下生成:com/me/picThreadClient.class
2.cmd输入: javac -d . picThreadServer.java   //会在当前目录下生成:picThreadServer.class于com/me/下
3.cmd输入: java com.me.picThreadServer    //开始运行

作者: 王康    时间: 2012-2-17 17:52
是包的影响,但是 我用是在 D:\Workspaces\test\src\com\me> 目录下直接进行:
1,   javac PicThreadClient.java  //会在当前目录下生成:com/me/picThreadClient.class

2,   cmd输入: javac picThreadServer.java   //这时会出错

3,   运行时因该推到D:\Workspaces\test\src>目录下执行:

在这样的情况下,第二步 应该怎么操作 javac 来编译:PicThreadServer.java 类呢?

cmd输入: java com.me.picThreadServer    //开始运行

作者: 刘基军    时间: 2012-2-17 18:19
1.建议将PicThreadClient.java和PicThreadServer.java两个文件,拷贝到其他路径下(如D:\)进行编译运行,查看效果。
2.看结构D:\Workspaces\test\src\com\me>,这应该是使用高级工具编写代码的吧,难道那个工具不能进行编译运行吗?
作者: 王康    时间: 2012-2-18 09:34
不加包好操作,现在遇到这样的问题,就是想着怎么解决,我还是搞不出来.
用javac操作
作者: 邱纲    时间: 2012-2-18 10:08
我不知道你为什么这样写代码,难道编译时没有报错吗,一个.java文件中,只能有一个类的类名前面可以加public,其余的类都不可以。
而且导入包都会放在最上面,另外就是你客户端的Socket怎么可能用服务端的Socket呢,而且还没有指定ip地址和端口号,这样的代码怎么可能上传的了图片,问题太多了,我给段代码你看一下,希望对你有所帮助。这段代码是我练习时写的

/**
* 需求:上传图片
*/
import java.io.*;
import java.net.*;
class TcpClient3 {
        public static void main(String[] args) throws Exception{
        Socket s = new Socket("127.0.0.1",10000);
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:\\ruoxi\\ruoxi.jpg"));
        BufferedOutputStream bosOut = new BufferedOutputStream(s.getOutputStream());
        byte[] buf = new byte[1024];
        int len = 0;
        while((len=bis.read(buf)) != -1){
                bosOut.write(buf, 0, len);
                bosOut.flush();
        }
        s.shutdownOutput();
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String str = br.readLine();
        System.out.println(str);
        bis.close();
        s.close();
        }
}
/*
* 服务端:
*  这个服务端有个局限性,当A客户端连接 上以后。被服务器端获取到,服务端开始执行具体流程。
*  这时B客户端连接,只有等待
*  因为服务端还没有处理完A客户端的请求,还没有在循环回来执行下次accept方法。所以暂时获取不到B客户端对象
*  那么为了可以让多个客户端同时并发访问服务端。服务端最好就是将每个客户端封装到一个单独线程中,这样,就
*  可以同时处理多个客户端的请求。参见:TcpCopyPic2.java
*/
class TcpServer3{
        public static void main(String[] args) throws Exception{
                ServerSocket ss = new ServerSocket(10000);
                Socket s = ss.accept();
                BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
                 BufferedOutputStream bosOut = new BufferedOutputStream(new FileOutputStream("Copy_ruoxi.jpg"));
                 byte[] buf = new byte[1024];
                 int len = 0;
                 while((len = bis.read(buf)) != -1){
                        bosOut.write(buf,0,len);
                 }
                    PrintWriter out = new  PrintWriter(s.getOutputStream(),true);
                    out.println("复制图片成功");
                 bosOut.close();
                 s.close();
                 ss.close();
        }
}

作者: 王康    时间: 2012-2-18 13:55
邱纲 发表于 2012-2-18 10:08
我不知道你为什么这样写代码,难道编译时没有报错吗,一个.java文件中,只能有一个类的类名前面可以加publi ...

我这是两个不同的类,只不过我给他帖在一起了.
我客户端哪里用服务端的socket了?
你没有看清楚吧?


作者: 刘基军    时间: 2012-2-20 10:35
王康 发表于 2012-2-18 09:34
不加包好操作,现在遇到这样的问题,就是想着怎么解决,我还是搞不出来.
用javac操作 ...

1.将PicThreadClient.java和PicThreadServer.java两个文件,拷贝到D:\下,
2.cmd打开至:d:\
3.cmd输入: javac -d . picThreadClient.java     //会在当前目录下生成:com/me/picThreadClient.class
4.cmd输入: javac -d . picThreadServer.java   //会在当前目录下生成:picThreadServer.class于com/me/下
5.cmd输入: java com.me.picThreadServer    //开始运行
这样还是不行吗?




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