异常信息:(客户端发出信息,第一次服务端接收正常,再发服务端就抛出这个异常了,我换成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
}
}}
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
}
}}
现在有一新的小问题
现在在客户端退出
str = ois.readObject().toString();这句还是会抛IO异常。
我看网上大多的解决办法都是把打印异常的语句去掉,换成打印“客户端退出”
但是我想要一种更完美点的办法,如果各位知道的话,讲下,最后给出案例,谢谢!
java菜鸟学堂QQ群144648357
上面我也说过了。其它大多是把打印异常去掉,remove下,再打印“客户端退出”。
而我想要一种更完善的解决办法!谢谢!
重新贴下吧!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
}
}
}