0

デバッグを行ったところ、以下のこの方法でエラーが発生したと思います。このメソッドは基本的に ID (文字列) をサーバーに送信し、サーバーはこの ID を受信した後、クライアントに送信するレコードを検索します。ID はユーザーが選択する GUI JList に表示されるため、ユーザーが JList 内の別の ID をクリックするたびに、このメソッドは ListSelectionListener イベントによってアクティブ化されます。クライアントがサーバーからレコードを受信すると、それを JTextField に表示します。ユーザーが最初に JList の ID をクリックすると、すべてが期待どおりに機能します。しかし、リスト内の別のレコードをクリックすると、例外が発生します。

java.net.SocketException: ソケットが閉じられています

編集:今私は得ています:

java.net.SocketException: ソフトウェアが原因で接続が中止されました: recv に失敗しました

クライアント プログラム:

    import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


public class ClientGUI extends JFrame implements ListSelectionListener{

    //gui components
    JList jlist = null;
    String requestID = null; //Assigned to selected ID in JList. 
    JScrollPane scpane = null;
    JTextField field = null;
    JPanel pane = null;
    DefaultListModel<String> listModel = null;
    ArrayList<String> idList = null;

    //client stuff:
    Socket sock1 = null;
    Socket sock2 = null;
    ObjectInputStream in = null;
    ObjectOutputStream out = null;

    public ClientGUI() throws ClassNotFoundException{
        //get List of IDs from Server1
        try{
            sock1 = new Socket("FahadAhmed-PC", 8889); 
            in = new ObjectInputStream(sock1.getInputStream());
            idList = new ArrayList<String>(29);
            ArrayList<Customer> custList = null;
            custList = (ArrayList<Customer>) in.readObject();
            for(Customer c : custList){
                idList.add(c.getID());
            }

            in.close();
            sock1.close();

            sock2 = new Socket("FahadAhmed-PC", 8888); 
            ArrayList streams = new ArrayList(3); 
            streams.add(out = new ObjectOutputStream(sock2.getOutputStream()));
            streams.add(in = new ObjectInputStream(sock2.getInputStream()));

        }catch(UnknownHostException e) {
            System.err.println("Don't know about host: FahadAhmed-PC");
            System.exit(1);
        }catch(IOException e){
            System.err.println(e);
            System.exit(1);
        }

        //Setup GUI
        jlist = new JList(idList.toArray());
        jlist.setVisibleRowCount(10);
        scpane = new JScrollPane(jlist);
        jlist.addListSelectionListener(this);
        pane = new JPanel(new BorderLayout());
        pane.setPreferredSize(new Dimension(300, 300));
        field = new JTextField(29);
        field.setEditable(false);
        pane.add(scpane, BorderLayout.PAGE_START);
        pane.add(field, BorderLayout.PAGE_END);

        this.setContentPane(pane);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String args[]) throws ClassNotFoundException{
        ClientGUI gui = new ClientGUI();
    }


    @Override
    public void valueChanged(ListSelectionEvent arg0) {
        if(!arg0.getValueIsAdjusting())
            try {
                System.out.println(jlist.getSelectedValue().toString());
                getRecord(jlist.getSelectedValue().toString());
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }       
    }

    private void getRecord(String getID) throws ClassNotFoundException {
        try{

            //System.out.println(getID + "sent to getRecord method");
            out.writeObject(getID);

            String rec = (String) in.readObject();

            field.setText(rec);
            //in.close();
            //sock2.shutdownInput();
            out.flush();
            //sock2.shutdownOutput();
            //out.close();

        }catch(UnknownHostException e) {
            System.err.println("Don't know about host: FahadAhmed-PC");
            System.exit(1);
        }catch(IOException e){
            System.err.println(e);
            System.exit(1);
        }
    }


}
4

2 に答える 2

1

入力ストリームまたは出力ストリームのいずれかを閉じると、ソケットが閉じられます。ここで何かを閉じる理由はわかりませんが、ここには別の問題があります。ソケットの寿命の間、両端で同じものObjectInputStreamを使用する必要があります。ObjectOutputStreamそうしないと、2 つのピアが同期しなくなり、 のようなものが表示されるようになりStreamCorruptedException: invalid type codeます。

于 2013-05-05T05:22:53.290 に答える