2 liuzhen6835 liuzhen6835 于 2015.07.16 09:39 提问

Java中的Socket编程关于多次输入输出的问题,希望给出解决方法

实现了多线程,这是服务端的代码:需求是接受客户端发送的数字,根据数字选择相应的case,当是1的时候要向服务端发送一个user的对象,ObjectInputStream ois=new ObjectInputStream(s.getInputStream());这句话的异常是java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281),

public void run()
    {
        ObjectOutputStream oos=null;
        int choice=0;
        try
            {
                InputStream is=s.getInputStream();
                choice=is.read();
                System.out.println("接受成功"+choice);
            } catch (IOException e1)
            {
                e1.printStackTrace();
            }
        switch (choice)
        {
            case 1:
                try
                  {
                      System.out.println("进入登录验证");
                      ObjectInputStream ois=new ObjectInputStream(s.getInputStream());_**
                        /* ObjectInputStream ois=new ObjectInputStream(s.getInputStream());这句话的异常是java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281),所以我就找到readFully(ObjectInputStream.java:2281)他的解释是
    void readFully(byte[] b, int off, int len) throws IOException {
        int n = 0;
        while (n < len) {
        int count = read(b, off + n, len - n);
        if (count < 0) {
            throw new EOFException();
        }
        n += count;
        }
    }_**
                */      
                      Object obj=ois.readObject();
                        OutputStream os=s.getOutputStream();
                        if(obj instanceof User)
                            {
                                User user=(User)obj;
                                String job=login(user);
                                os.write(job.getBytes());
                            }
                            os.close();
                            ois.close();
                     }
                    catch (Exception e1)
                        {
                            e1.printStackTrace();
                        } 

2个回答

yuke198907
yuke198907   2015.07.16 13:37
myMSDN1314
myMSDN1314   2015.07.18 10:46

InputStream is=s.getInputStream();
choice=is.read();
因为你在读取choice的时候,如果只输入一个字节,那么s就读到了最后一个字节,即文件末尾

System.out.println("进入登录验证");
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
这里又从s中读取,所有抛出了EOFException异常,当输入过程中意外到达文件或流的末尾时,抛出此异常。

解决方法,new一个新的输入流,重新读取User信息
或者s中包含choice和User的信息

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Socket(网络编程)面试题
Java网络面试 1、什么是TCP协议?UDP协议?区别? TCP:传输控制协议,面向连接,可靠。保证数据传输成功。 UDP:不可靠。传输速度快。占系统资源少。 2、TCP三次握手? A——》B  通信请求以及序列号作为起始数据段。 B——》A  收到请求,序列号作为起始数据段。 A——》B  收到请求 Java网络编程 服务端套接字:ServerSocket。a
Java Socket输入输出时需注意
1、对协议中出现的各种结构体,现用现设,不要觉得头晕,一步一步来; 2、输入,输出BufferInputStream/BufferOutputStream ,在使用输入时,若文件交大,可以用inputStream.available来定义最大输入量; 3、输入,若端口socket.getInputStream.若文件FileInputStream表示; 4、把输入存入byte数组,先定义一个
编写程序实现多次通信 (socket和多线程)
编写程序实现多次通信 (socket和多线程)
Socket编程面试题
1、TCP和UDP的区别: 1)TCP提供面向连接的传输,通信前要先建立连接(三次握手机制);UDP提供无连接的传输,通信前不需要建立连接。 2)TCP提供可靠的传输(有序,无差错,不丢失,不重复);UDP提供不可靠的传输。 3)TCP面向字节流的传输,因此它能将信息分割成组,并在接收端将其重组;UDP是面向数据报的传输,没有分组开销。 4)TCP提供拥塞控制和流量控制机制
TCP的socket编程中常见问题及注意事项
TCP的socket编程中常见问题及注意事项
Java面试之Socket编程
Java网络编程的问题.在java中如何进行socket编程。
Java学习材料(499篇文章)
CLASSPATH详解;JAVA SOCKET编程;JAVA 编程技术中汉字问题。
java中输入输出流的知识总结 以及小例子程序
处理流(包在其他管道上的管道) 缓冲流: BufferedReader(Reader in) BufferedReader(Reader in,int sz)//sz为自定义缓冲区的大小 BufferedWriter(Writer out) BufferedInputStream(InputStream in) BufferedOutputStream(OutputStream
Java的简单输入输出问题
最近正在学Java,了解了一些Java的输入输出的基本语法。。。1.在Java中如何输入以空格隔开的数字呢? 由于一开始输入的数据都是被当成字符串来处理的,所以我们就相当于处理一个字符串,来获得所需要的数据。 可以用scanner()方法来进行输入,具体如下:import java.util.Scanner;//导入Scanner类 public class Main
java socket编程实例(出自《java大学教程》)
java大学教程源码中关于socket编程的三个实例