【问题标题】:Client/Server Socket Exception issue [duplicate]客户端/服务器套接字异常问题 [重复]
【发布时间】:2016-02-24 04:29:07
【问题描述】:

所以我仍在尝试解决这个客户端/服务器概念。我终于有了一个有点工作的程序,除了我得到这个错误。我环顾网络,看看我是否可以尝试自己解决这个问题,但对于我的生活,我无法弄清楚。有人可以看看客户端代码,看看我在哪里犯了错误,并指出我正确的方向。谢谢!

~乔什

java.net.SocketException: Socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at Contact$IncomingReader.run(Contact.java:104)
at java.lang.Thread.run(Thread.java:745)

客户代码

public class Contact{

JTextArea incoming;
JTextField outgoing;
BufferedReader reader;
PrintWriter writer;
Socket sock;
JPanel mainP;
JScrollPane scroll;
JButton sendB;

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


public void go(){

    JFrame frame = new JFrame("Client");
    mainP = new JPanel();
    incoming = new JTextArea(15,50);
    incoming.setLineWrap(true);
    incoming.setWrapStyleWord(false);
    incoming.setEditable(false);
    scroll = new JScrollPane(incoming);
    scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
    outgoing = new JTextField(20);
    sendB = new JButton("Send");
    sendB.addActionListener(new SendButtonListener());
    mainP.add(scroll);
    mainP.add(outgoing);
    mainP.add(sendB);
    Networking();

    Thread readerThread = new Thread(new IncomingReader());
    readerThread.start();

    frame.setLocationRelativeTo(null);
    frame.getContentPane().add(BorderLayout.CENTER, mainP);
    frame.setSize(400,400);
    frame.setVisible(true);
}

private void Networking(){
    try{
        sock = new Socket("127.0.0.1",5000);
        InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
        reader = new BufferedReader(streamReader);
        writer = new PrintWriter(sock.getOutputStream());
        System.out.println("Connection Established");
    }catch(IOException ex){
        ex.printStackTrace();
    }
}


public class SendButtonListener implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        try{
            writer.println(outgoing.getText());
            writer.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
        outgoing.setText("");
        outgoing.requestFocus();
    }
}

public class IncomingReader implements Runnable{
    @Override
    public void run() {
        String message;
        try{
            while((message = reader.readLine()) != null){
                System.out.println("read " + message);
                incoming.append(message + "\n");
            }

        }catch(Exception ex){
                ex.printStackTrace();
        }

    }

}
}

再次感谢!

【问题讨论】:

    标签: java sockets server client-server socketexception


    【解决方案1】:

    这个异常意味着关闭了套接字,然后继续使用它。

    writer.close();
    

    你在这里关闭了它。关闭套接字的输入流或输出流都会关闭套接字。请参阅 Javadoc。

    【讨论】:

    • 当我注释掉 writer.close();并运行 2 个客户端,现在消息没有发送到服务器。我让系统读出发送的内容以查看是否发送。我将查看 oracles 站点上的 Javadoc,看看我能做些什么。感谢 EJP 关注此内容。
    • 调用 writer.flush() 因为你正在使用 PrintWriter。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2021-03-31
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多