黑马程序员技术交流社区

标题: Socket网络编程问题。 [打印本页]

作者: 高庆亮    时间: 2011-11-16 13:00
标题: Socket网络编程问题。
本帖最后由 高庆亮 于 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();
        }
}
}
最后为什么输出不了信息呢?哪的问题呢?
作者: 宋文轩    时间: 2011-11-16 13:05
oos.writeObject(o);
在这句后面写上s1.shutdownOutput() 来关闭客户端写入流。否则服务端会认为客户端没有将数据写入完成,会一直在那等待客户端写数据。
作者: 高庆亮    时间: 2011-11-16 13:11
宋文轩 发表于 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
高庆亮 发表于 2011-11-16 13:11
我的   File f1 = new File("D:\\Program Files\\eclipse中文\\Turing\\u\\src\\g.java");目录下装的是
c ...

是13个字节的意思?
作者: 宋文轩    时间: 2011-11-16 13:16
本帖最后由 宋文轩 于 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();
        }
}

作者: 高庆亮    时间: 2011-11-16 13:45
宋文轩 发表于 2011-11-16 13:16
前面你用fis读取那个java文件,返回的是一个int值,值是你读取这个文件的字节数,你将这个int值用socket的o ...

我没明白你的意思!自己的流是怎么回事啊?我用Object不的好使么?是不是我上面的File和Object有冲突了啊?
作者: 宋文轩    时间: 2011-11-16 14:20
高庆亮 发表于 2011-11-16 13:45
我没明白你的意思!自己的流是怎么回事啊?我用Object不的好使么?是不是我上面的File和Object有冲突了啊 ...

FileInputStream的 read()方法 返回的是读取到的字节数 。OjbectInputStream和ObjectOutputStream是用来对象序列化的,不是用来读取文件的。建议从头看IO流视频。
作者: 高庆亮    时间: 2011-11-16 18:18
文轩我这又出现个问题!你在帮我看下、我找半天了没找到哪错了。
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)

我运行后结果是出来了,可是又出现了这个错误是怎么回事啊?




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