java.net.SocketException : Socket is closed TCP Connection

标签 java sockets tcp

经过一些调试,我认为错误发生在下面这个方法中。该方法基本上将一个 ID(字符串)发送到服务器,服务器在收到此 ID 后查找一条记录并将其发送回客户端。 ID 显示在用户选择的 GUI JList 中,因此每次用户单击 JList 中的不同 ID 时,ListSelectionListener 事件都会激活此方法。客户端从服务器接收到记录后,会将其显示在 JTextField 中。当用户第一次单击 JList 中的 ID 时,一切都会按预期进行。但是当您单击列表中的另一条记录时,我收到异常:

java.net.SocketException: Socket is closed

编辑:现在我得到:

java.net.SocketException: Software caused connection abort: recv failed

客户端程序:

    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);
        }
    }


}

最佳答案

关闭输入/输出流即关闭套接字。您需要在套接字上使用 shutdownInput 方法,仅关闭输入流:

//do sth with fromSocket ... and close it 
socket.shutdownInput();
socket.shutdownOutput();

关于java.net.SocketException : Socket is closed TCP Connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16381146/

相关文章:

java - Eclipse RCP 4 + JavaFX - 如何加载保存为 FXML 的场景

c - 多客户端 UDP 聊天

qt - 客户端套接字发送但静默服务器套接字不接收

java - 如何使用注释反序列化时对 Json 进行排序?

java - 基本的java : scanning files,数组

c++ - 如何通过linux套接字发送图像数据

c - 基于TCP的打洞

networking - 从 google tcp 负载均衡器检测 redis master 的健康检查

java - 更改 android.R.layout.simple_list_item_2 中的文本颜色

angular - 是什么决定了Socket IO的Angular区域