2015-11-21 103 views
0

所以我仍然试图解决这个客户端/服务器的概念。我终于有一个有点工作的程序,除了我得到这个错误。我环顾了网络,看看我能否尝试解决自己的问题,但对于我来说,我无法弄清楚。有人可以看看客户端代码,看看我犯了什么错误,并指出我朝着正确的方向。谢谢!客户端/服务器套接字异常问题

再次

〜乔希

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

    } 

} 
} 

谢谢!

回答

0

这个例外意味着关闭了插座,然后继续使用它。

writer.close(); 

你在这里关闭它。关闭套接字的输入流或输出流会关闭套接字。看到Javadoc。

+0

当我注释掉writer.close();并运行2个客户端,现在该消息没有被发送到服务器。我有系统读出发送的内容,看它是否被发送,而不是。我会在oracles网站上看看Javadoc,看看我能做些什么。谢谢EJP看这个。 –

+0

由于您使用的是PrintWriter,所以请调用writer.flush()。 –

相关问题