【问题标题】:Creating a client-server application to echo what the user sends创建一个客户端-服务器应用程序来回显用户发送的内容
【发布时间】:2013-01-11 11:35:25
【问题描述】:

我正在创建一个简单的客户端服务器应用程序,其中有一个 GUI 客户端,用户可以在其中输入一些文本,服务器会将文本连同时间戳一起发回。

问题是每当我点击 Echo 按钮时,我都会收到 Connection Reset 错误消息。我不知道为什么会这样。
这是代码:

服务器

package echo;
import java.net.*;
import java.io.*;
import java.util.*;
import java.text.*;

public class Server extends Thread{

    final int PORT = 444;
    ServerSocket serverSocket;
    Socket socket;
    InputStreamReader ir;
    BufferedReader b;
    PrintStream p;
    Date currentTime;
    Format fmt;

//------------------------------------------------------------------------------    
    public static void main(String[] args) {
        Server s = new Server();
        s.start();
    }
//------------------------------------------------------------------------------
    public void setupConnection(){
        try{
            serverSocket = new ServerSocket(PORT);
            socket = serverSocket.accept();

            ir = new InputStreamReader(socket.getInputStream());
            b = new BufferedReader(ir);

            p = new PrintStream(socket.getOutputStream());
            fmt = DateFormat.getDateTimeInstance();

        }catch(Exception e){
            e.printStackTrace();
        }
    }
//------------------------------------------------------------------------------

    public Server(){


    }

//------------------------------------------------------------------------------
    @Override
    public void run(){
        setupConnection();
        if(socket!=null){
            try {
                String message = b.readLine();
                if(message!=null){
                    p.println(fmt.format(new Date()) + " " + message);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

客户

package echo;
import java.net.*;
import java.io.*;

import javax.swing.*;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.*;

public class Client extends JFrame{

    final int PORT = 444;
    Socket s;

    InputStreamReader ir;
    BufferedReader b;
    PrintStream p;

    JTextArea textArea;
    JTextField field;
    JScrollPane pane;
    JButton echo;


//------------------------------------------------------------------------------
    public static void main(String[] args) {
        new Client();
    }
//------------------------------------------------------------------------------
    public Client(){
        setupConnection();
        setupGUI();
        addListeners();
    }
//------------------------------------------------------------------------------

    public void setupConnection(){
        try {
            s = new Socket("localhost",PORT);
            ir = new InputStreamReader(s.getInputStream());
            b = new BufferedReader(ir);
            p = new PrintStream(s.getOutputStream());

            p.println("User Logged In");

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

//------------------------------------------------------------------------------    
    public void setupGUI(){
        setLayout(new GridBagLayout());
        textArea = new JTextArea(30,30);
        field = new JTextField(10);
        pane = new JScrollPane(textArea);
        echo = new JButton("Echo");

        GridBagConstraints gbc = new GridBagConstraints();
        textArea.setBorder(BorderFactory.createTitledBorder("Replies from server: "));
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 5;
        gbc.gridheight = 5;
        add(pane,gbc);

        gbc.gridy = 5;
        gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(field,gbc);

        field.setBorder(BorderFactory.createTitledBorder("Enter text here:"));
        gbc.gridy = 6;
        gbc.gridheight = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        add(echo,gbc);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
//------------------------------------------------------------------------------
    public void addListeners(){
        echo.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                String message = field.getText();
                field.setText("");
                p.println(message);
                try {
                    String reply = b.readLine();
                    if(reply!=null){
                        textArea.append(reply);
                    }
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                System.out.println();
            }
        });
    }
//------------------------------------------------------------------------------
}

你能帮我解决这个问题吗?

【问题讨论】:

  • 从 0 到 1023 的端口被保留,因此请尝试使用高于此的数字。
  • 还要检查 Windows 防火墙或任何其他可能阻止传入连接的东西,你永远不知道
  • @B11 taxeeta 给出了正确答案:)

标签: java sockets networking serversocket


【解决方案1】:

在服务器 run() 内部,您需要有一个 while 循环,该循环仅在您的客户端说“关闭此连接”后才会中断。现在发生的是您的服务器正在等待数据,客户端接收数据并退出(readline)。

这个例外是正确的,如果你想的话:)。

【讨论】:

  • 嘿,谢谢你,我自己也想通了。我要删除问题,但现在你回答了,我会接受它:)
  • 当然,伙计.. :) 谢谢
  • 新问题是:我必须按两次 Echo 按钮才能让消息回显!请告诉我为什么:)
  • 在尝试之前或 setupConnection 之前,您的 while (notExited) 在哪里
  • 我没有更新这里的代码,但正如你所说,我确实合并了它!
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多