使用readUTF()方法从DataInputStream读取时的java.io.EOFException

时间:2014-09-15 12:56:31

标签: java multithreading sockets eofexception

我正在制作一个使用客户端套接字和服务器套接字的Messenger程序,但是当运行DataInputStream.readUTF()方法时,我一直遇到问题。我得到一个java.io.EOFException。 对我糟糕的编程和非常命名的变量感到抱歉。 我的客户的代码大多就在这里。

import java.awt.CardLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.ScrollPane;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GUI extends JFrame implements ActionListener{
private InetAddress inet;
private Socket s = new Socket();enter code here
private DataOutputStream output;
private DataInputStream input;
private JButton send;
private JTextArea tarea;
private BufferedReader br;
private JTextField tf;
private JTextField ip;
private JTextField port;
private JButton connect;
private JPanel one;
private JPanel two;
private CardLayout cardlayout;
private JPanel cards;
private JTextField uname;
private JScrollPane scroll;
private Thread listen;
String a;
                                            //contructor
    public GUI() {
    super("Messenger v2.0");
    cards = new JPanel(new CardLayout());
    tarea = new JTextArea(10,30);
    scroll = new JScrollPane(tarea);
    tf = new JTextField("type your message here", 20);
    send = new JButton("Send");
    ip = new JTextField("ip", 5);
    port = new JTextField("port", 5);
    connect = new JButton("Connect");
    uname = new JTextField("Type your username", 13);

    one = new JPanel();
    one();
    two = new JPanel();
    two();
    cards.add(one, "1");
    cards.add(two, "2");
    first();
}//end constructor



                                            //one method
public void one(){
    one.add(ip);
    one.add(port);
    one.add(uname);
    one.add(connect);

}//end one method
                                        //two method



public void two(){
    two.add(scroll);
    two.add(tf);
    two.add(send);

}//end two method
                                        //first method



public void first(){
    add(cards);
    cardlayout = (CardLayout) cards.getLayout();
    cardlayout.show(cards, "1");

    connect.addActionListener(this);

}//end first method
                                        //second method



public void second(){
    cardlayout.show(cards, "2");
    setSize(400, 300);
}//end second method
                                        //action performed



@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == connect){
        second();
        String ip = this.ip.getText();
        String port = this.port.getText();
        try {
            connect();
        } catch (NumberFormatException | IOException e1) {
            e1.printStackTrace();
        }
        second();
    }
    else if(e.getSource() == send){
        try {
            send(tf.getText());
        } catch (Exception e1) {

        }
    }

}//end actionperformed
                                        //connect method





public void connect() throws NumberFormatException, IOException{
    String z = ip.getText();
    inet = InetAddress.getByName(z);;
    s = new Socket(inet, Integer.parseInt(port.getText()));
    input = new DataInputStream(s.getInputStream());
    this.output = new DataOutputStream(this.s.getOutputStream());
    String g;
    g = uname.getText() + " has joined the chat";
    send(g);
                                        //thread to listen


listen = new Thread(){

    public void run(){
            while(true){
            if(s.isInputShutdown() == false){
        try {
            a = input.readUTF();
            if(a.equals("DISSCONNECT_SESSION") || a.equals("-1") || a.equals(-1) ||       a.equals(null)){

                input.close();
                break;
            }
            write(a);
            a = null;
            }
         catch (IOException e) {

            e.printStackTrace();
        }
            }else{
                break;
            }
            }
    }
};

listen.start();



}//end connect() method
                                        //send(String) method



private void send(String text) throws IOException {
    output.writeUTF(text);
    write(text);
}//end send(String) method
                                            //write method



public void write(String message){

    tarea.setText(tarea.getText() + "\n" + message );
}//end write(String message) method
}//end class

我的大多数服务器代码都是。

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class The_Server {
DataInputStream input;
DataOutputStream output;
Seconday_Thread st;
String help2;
The_Main tm;
private ServerSocket ss;
private Socket s;
private ArrayList<Socket> cs = new ArrayList<Socket>();
private ArrayList<DataOutputStream> outputs = new ArrayList<DataOutputStream>();
String name;
int counter;
public void createServer(String a) throws IOException{
    int b = Integer.parseInt(a);
    ss = new ServerSocket(b);
         counter = 0;
            while (true){
                s = ss.accept();
            cs.add(counter, s);
            output = new DataOutputStream(cs.get(counter).getOutputStream());
            outputs.add(counter, output);
            input = new DataInputStream(cs.get(counter).getInputStream());
            name = input.readUTF();

            send("has joined", name);
            counter++;
            st = new Seconday_Thread(input, name); // this thread is     DataInputStream.readUTF() in a while loop
            st.start();

        }
}
public void send(String text, String name) {
    int counter_num_2 = 0;
    while(true){
                if(outputs.get(counter_num_2).equals(null)){
                    break;
                }
                else{
            if(counter_num_2 == 40){
                break;
            }

            else if(cs.get(counter_num_2).isClosed()){

            }
            else if(cs.get(counter_num_2).isClosed() && counter_num_2 == 39){
                counter = 0;
                break;
            }
            else{
        try {
             help2 = name + " " + text;
             tm = new The_Main();
             tm.sendToServer(name, text);
            outputs.get(counter_num_2).writeUTF(help2);
            outputs.get(counter_num_2).flush();
        } catch (Exception e) {
            try {
                cs.get(counter_num_2).close();
            } catch (IOException e1) {

            }
        }
        counter_num_2++;
            }
    }
    }
}
}

有人可以看看代码并发现错误,我花了很多时间并且无法弄明白。

1 个答案:

答案 0 :(得分:0)

DataStreams使用EOFException来检测文件结束条件。您应该使用异常,而不是检查流中的特定字符串以关闭连接。