2

ユーザーがテキストを入力できるGUIクライアントがあり、サーバーがタイムスタンプとともにテキストを送り返す単純なクライアントサーバーアプリケーションを作成しています。
ここに画像の説明を入力してください

問題は、[エコー]ボタンをクリックするたびに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();
            }
        });
    }
//------------------------------------------------------------------------------
}

その問題を解決するのを手伝ってくれませんか。

4

1 に答える 1

1

サーバーの実行()内では、whileループが必要です。これは、クライアントが「この接続を閉じる」と言った後にのみ中断します。現在起こっていることは、サーバーがデータを待機し、クライアントがデータを受信して​​終了することです(readline)。

あなたがそれを考えるならば、例外は正しいです:)。

于 2013-01-11T11:39:28.487 に答える