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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高庆亮 黑马帝   /  2011-11-16 13:00  /  2203 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 高庆亮 于 2011-11-16 13:01 编辑

public class Person {
       
        public static void main(String[] args) {
       
        Person p = new Person();      
        }
public Person(){
        try {
                //得到文件对象
                File f1 = new File("D:\\Program Files\\eclipse中文\\Turing\\u\\src\\g.java");
                 //创建输入,字节流
            FileInputStream fis = new FileInputStream(f1);
                  Object o = fis.read();
         
                Socket s1 = new Socket("127.0.0.1",9999);
                ObjectOutputStream oos=new ObjectOutputStream(s1.getOutputStream());
                oos.writeObject(o);
         
        } catch (Exception e) {
                e.printStackTrace();
        }
}
}

public class Server {
        public static void main(String[] args) {
                Server server = new Server();
        }
public Server(){
        //服务器端在监听9999端口
        System.out.println("我是服务器我在9999监听........");
        try {
                ServerSocket ss = new ServerSocket(9999);
             Socket        s = ss.accept();
           //接收客户端发来的信息
                        ObjectInputStream ois= new ObjectInputStream(s.getInputStream());
                        System.out.println("客户端发来的消息为:"+ois.readObject().toString());
               
        } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
}
}
最后为什么输出不了信息呢?哪的问题呢?

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
oos.writeObject(o);
在这句后面写上s1.shutdownOutput() 来关闭客户端写入流。否则服务端会认为客户端没有将数据写入完成,会一直在那等待客户端写数据。
回复 使用道具 举报
宋文轩 发表于 2011-11-16 13:05
oos.writeObject(o);
在这句后面写上s1.shutdownOutput() 来关闭客户端写入流。否则服务端会认为客户端没有 ...

我的   File f1 = new File("D:\\Program Files\\eclipse中文\\Turing\\u\\src\\g.java");目录下装的是
class g()
{
}
可是最后输出的这么是 13 呢?
回复 使用道具 举报
高庆亮 发表于 2011-11-16 13:11
我的   File f1 = new File("D:\\Program Files\\eclipse中文\\Turing\\u\\src\\g.java");目录下装的是
c ...

是13个字节的意思?
回复 使用道具 举报
本帖最后由 宋文轩 于 2011-11-16 13:38 编辑

前面你用fis读取那个java文件,返回的是一个int值,值是你读取这个文件的字节数,你将这个int值用socket的outputStream写给服务端,所以最后服务端得到的其实就只是这个字节数,13个字节是没错的,因为中间有个空格  换行的时候还有换行符 \r\n 所以最后打印就是13.
如果想输出文件信息到控制台,我该了一下你的代码 你看一下
public Person(){
   public static void main(String [] args){
                try {
               
             Socket s1 = new Socket("127.0.0.1",9999);//建立socket
             File f1 = new File("D:\\Program Files\\eclipse中文\\Turing\\u\\src\\g.java");
             FileInputStream fis=new FileInputStream(f1);
                         OutputStream os=s1.getOutputStream();
                         byte [] b=new byte[1024*5];
                         int len=0;
                         while((len=fis.read(b))!=-1){//读写文件。
                                 os.write(b,0,len);
             }
         
        } catch (Exception e) {
                e.printStackTrace();
        }
         }
}
public Server(){
        //服务器端在监听9999端口
        System.out.println("我是服务器我在9999监听........");
        try {
                ServerSocket ss = new ServerSocket(9999);
             Socket        s = ss.accept();
           //接收客户端发来的信息
                        InputStream is=s.getInputStream();
                                                byte[] b=new byte[1024];
                                                int len=0;
                                                while((len=is.read(b))!=-1){
                                                        System.out.println("客户端发来的消息为:"+new String(b,0,len,"GBK");
                                                }
        } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
        }
}

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
宋文轩 发表于 2011-11-16 13:16
前面你用fis读取那个java文件,返回的是一个int值,值是你读取这个文件的字节数,你将这个int值用socket的o ...

我没明白你的意思!自己的流是怎么回事啊?我用Object不的好使么?是不是我上面的File和Object有冲突了啊?
回复 使用道具 举报
宋文轩 黑马帝 2011-11-16 14:20:37
7#
高庆亮 发表于 2011-11-16 13:45
我没明白你的意思!自己的流是怎么回事啊?我用Object不的好使么?是不是我上面的File和Object有冲突了啊 ...

FileInputStream的 read()方法 返回的是读取到的字节数 。OjbectInputStream和ObjectOutputStream是用来对象序列化的,不是用来读取文件的。建议从头看IO流视频。
回复 使用道具 举报
高庆亮 黑马帝 2011-11-16 18:18:56
8#
文轩我这又出现个问题!你在帮我看下、我找半天了没找到哪错了。
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at com.itcast.examQuestions_9.Server.<init>(Server.java:22)
        at com.itcast.examQuestions_9.Server.main(Server.java:10)

我运行后结果是出来了,可是又出现了这个错误是怎么回事啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马