异常信息:(客户端发出信息,第一次服务端接收正常,再发服务端就抛出这个异常了,我换成Data类型就可以了,但是我要传的是对象,所以要用Object类型。烦请高手看下。)
java.io.StreamCorruptedException: invalid stream header: 74000161
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at com.nothing.Lab.S$Clients.run(S.java:55)
at java.lang.Thread.run(Thread.java:619)服务端:(第二次接收时抛异常)package com.nothing.Lab;import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class S {

public ServerSocket serverSocket = null;
public ObjectInputStream ois = null;
public ObjectOutputStream oos = null;
public boolean started = false, bConnect = false;

public static void main(String[] args){
new S().go();
}

public void go(){
try {
serverSocket = new ServerSocket(8888);
started = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
while(started){
Socket s = serverSocket.accept();
System.out.println("a clients in");
Clients c = new Clients(s);
bConnect = true;
new Thread(c).start();
}
}catch(IOException e){
e.printStackTrace();
}
}

public class Clients implements Runnable{ Socket s;
String str = "";
public Clients(Socket s){
this.s = s;
}
@Override
public void run() {
// TODO Auto-generated method stub
try{
while(bConnect){
ois = new ObjectInputStream(s.getInputStream()); //第二次接收时抛异常
str = ois.readObject().toString();
System.out.println(str);
}
}catch(ClassNotFoundException e1){
e1.printStackTrace();
}catch(IOException e){
System.out.println("quit");
e.printStackTrace();
}finally{

try {
if(ois != null)
ois.close();
if(s != null)
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}
}
客户端:package com.nothing.Lab;import java.awt.BorderLayout;public class C extends JFrame { public Socket socket = null;
public ObjectInputStream ois = null;
public ObjectOutputStream oos = null;
private JPanel contentPane;
private JTextField textField; /**
 * Launch the application.
 */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
C frame = new C();
frame.go();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} /**
 * Create the frame.
 */
public C() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 308, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);

textField = new JTextField();
contentPane.add(textField, BorderLayout.SOUTH);
textField.setColumns(10);

JTextArea textArea = new JTextArea();
contentPane.add(textArea, BorderLayout.CENTER);

textField.addActionListener(new EnterDown());
}

public void go(){
try{
socket = new Socket("127.0.0.1", 8888);
oos = new ObjectOutputStream(socket.getOutputStream());
System.out.println("connection");
}catch(IOException e){
e.printStackTrace();
}

}

public class EnterDown implements ActionListener{
public void actionPerformed(ActionEvent e){
try {

String str = textField.getText();
System.out.println("c:"+str);
oos.writeObject(new String("a"));
// oos.flush();
// oos.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}

public class recv implements Runnable{ @Override
public void run() {
// TODO Auto-generated method stub

}

}}

解决方案 »

  1.   

    上个问题已经搞定了 ois = new ObjectInputStream(s.getInputStream());  语句放的位置有问题。
    现在有一新的小问题
    现在在客户端退出
    str = ois.readObject().toString();这句还是会抛IO异常。
    我看网上大多的解决办法都是把打印异常的语句去掉,换成打印“客户端退出”
    但是我想要一种更完美点的办法,如果各位知道的话,讲下,最后给出案例,谢谢!
      

  2.   

     ObjectInputStream 换成其他的流试试看-------------------------------
     java菜鸟学堂QQ群144648357
      

  3.   

    楼上的哥们,换成什么都一样,因为程序在readObject()方法时阻塞,等待接收客户端传过来的数据,现在客户端突然断开了,所以读取为空,自然就抛异常了。
    上面我也说过了。其它大多是把打印异常去掉,remove下,再打印“客户端退出”。
    而我想要一种更完善的解决办法!谢谢!
      

  4.   

    请问java.io.StreamCorruptedException怎么解决的? ois = new ObjectInputStream(s.getInputStream()); 语句放的位置有什么问题?应该怎么改?我也遇到了这个问题
      

  5.   

    把S类中关于 输入、输出流的声明转到子类client里面就可以了!
      

  6.   

    哥们,您这异常“java.io.StreamCorruptedException: invalid stream header:”是怎么解决的,可否分享下。谢谢了。
      

  7.   

    是客户端的代码稍微有点小问题,抱歉,好久没来了,我不知道这有人要拍我!
    重新贴下吧!package com.nothing.lab;
     
    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.border.EmptyBorder;
     
    public class C extends JFrame {
     
        public Socket socket = null;
        public ObjectInputStream ois = null;
        public ObjectOutputStream oos = null;
        private JPanel contentPane;
        private JTextField textField;
     
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        C frame = new C();
                        frame.go();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
     
        /**
         * Create the frame.
         */
        public C() {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 308, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);
             
            textField = new JTextField();
            contentPane.add(textField, BorderLayout.SOUTH);
            textField.setColumns(10);
             
            JTextArea textArea = new JTextArea();
            contentPane.add(textArea, BorderLayout.CENTER);
             
            textField.addActionListener(new EnterDown());
        }
         
        public void go(){
            try{
                socket = new Socket("127.0.0.1", 8888);
                System.out.println("connection");
            }catch(IOException e){
                e.printStackTrace();
            }
             
        }
         
        public class EnterDown implements ActionListener{
            public void actionPerformed(ActionEvent e){
                try {
                     
                    String str = textField.getText();
                    oos = new ObjectOutputStream(socket.getOutputStream()); //移到这里
                    oos.writeObject(str);
    //                oos.flush();
    //                oos.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
        }
         
        public class recv implements Runnable{
     
            @Override
            public void run() {
                // TODO Auto-generated method stub
                 
            }
             
        }
     
    }