Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自客户端get的第一个字符串';由服务器发送和显示。之后,服务器不再';你不明白吗?_Java_Sockets_Serversocket - Fatal编程技术网

Java 来自客户端get的第一个字符串';由服务器发送和显示。之后,服务器不再';你不明白吗?

Java 来自客户端get的第一个字符串';由服务器发送和显示。之后,服务器不再';你不明白吗?,java,sockets,serversocket,Java,Sockets,Serversocket,所以我决定尝试创建一个简单的聊天室类型的程序。我已经完成了大部分工作,当我发送消息时,它会在服务器上输出。。除了我只能发送一条消息,之后服务器上什么也没有发生 i、 e: 在客户端输入:“你好,世界!” 服务器上的输出:“你好,世界!” 然后我尝试发送另一条消息: 客户端输入:“服务器先生,为什么你这么随意?” 服务器上的输出:null(它没有说null,只是什么都不做) 这可能是什么原因 客户: public class ClientSocket { final static int

所以我决定尝试创建一个简单的聊天室类型的程序。我已经完成了大部分工作,当我发送消息时,它会在服务器上输出。。除了我只能发送一条消息,之后服务器上什么也没有发生

i、 e: 在客户端输入:“你好,世界!”

服务器上的输出:“你好,世界!”

然后我尝试发送另一条消息: 客户端输入:“服务器先生,为什么你这么随意?”

服务器上的输出:null(它没有说null,只是什么都不做)

这可能是什么原因

客户:

public class ClientSocket {

    final static int PORT = 5921;

    public static void main(String[] args) throws IOException
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 200);
        JPanel panel = new JPanel();
        final JTextField field = new JTextField(20);
        JLabel l = new JLabel("Enter a message and see it on the server...");

        panel.add(field);
        panel.add(l);
        frame.add(panel);

        frame.setVisible(true);

        final Socket sock = new Socket("90.231.151.132", PORT);
        final PrintStream ps = new PrintStream(sock.getOutputStream());

        field.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                String txt = field.getText();

                ps.println(txt);

                ps.close();

                field.setText("");

            }
        });

    }
}
服务器:

public class ServerSocketTest
{

    final static int PORT = 5921;

    public static void main(String[] args) throws Exception
    {
        ServerSocketTest t = new ServerSocketTest();
        t.run();
    }

    public void run() throws Exception
    {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 200);
        JPanel panel = new JPanel();
        final JTextArea field = new JTextArea(5, 20);
        JButton button = new JButton("Close connection");
        field.setEditable(false);
        JLabel l = new JLabel("Messages coming from the client is displayed here..");

        panel.add(field);
        panel.add(l);
        panel.add(button);
        frame.add(panel);

        //frame.add(l);

        frame.setVisible(true);

        final ServerSocket servSock = new ServerSocket(PORT);
        while(true){
        Socket sock = servSock.accept();
        InputStreamReader ir = new InputStreamReader(sock.getInputStream());
        BufferedReader br = new BufferedReader(ir);

        String r = br.readLine();

        br.close();

        System.out.println(r);

        field.append(r);

        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent arg0)
            {
                try {
                    servSock.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        }
    }    
}
发件人:

getOutputStream()抛出IOException

关闭返回的OutputStream将关闭关联的套接字。


当您关闭流时,您也在关闭套接字。服务器端实现也存在同样的问题。因此,要么您需要再次打开插座,要么实际上不关闭它。

Hmm。。我猜PrintStream就是OutputStream?我从客户端删除了.close(),从服务器删除了br.close()。还是同样的问题吗?我应该做些别的事情吗?(我最近刚开始学习套接字,我对官方教程(oracle one)一无所知)。英语不是我的母语,很抱歉有任何误解。另外,您需要在循环中从套接字(
br.readLine();
)读取。您发布的示例应用程序只读取了一行,然后就完成了。哦,对了,现在可以正常工作了:D按照您所说的做了,并在br.readLine()上执行了一个while循环。谢谢