0

こんにちは、小さなクライアント サーバーまたはサーバー クライアント チャット メッセージ アプリケーションを実験として作成し、Java ソケットに関する知識と経験を積もうとしています。メッセージの送受信で問題が発生しています。私は接続を取得し、スレッドは実行されているように見えますが、互いにメッセージを送受信しません。接続すると接続が自動的に閉じるかどうかはわかりませんが、何か間違ったことをしていることはわかっていますが、見つけられないようです。あなたが私を助けることができれば、それは素晴らしいことです. コードは以下です


サーバ:

public class ServerGUI extends JFrame implements KeyListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
/*private JButton sendButton = new JButton("send");
private JButton connectButton = new JButton("Connect");
private JButton disconnectButton = new JButton("Disconnect");*/
private JTextField textMessage = new JTextField();
private JLabel connectMessageLabel = new JLabel("Waiting for Client");
private JTextArea messageTextArea = new JTextArea();
private JPanel buttonPanel = new JPanel();
private JPanel messageLabelPanel = new JPanel();
private JPanel messageTextAreaPanel = new JPanel();
private JPanel content = new JPanel();
private static String thisName= "<Me> ";
private static String friendLabel= "<My Friend> ";
private static JFrame serverFrame = new JFrame();
private int port= 0;
private String clientMessage=null;
private String myMessage=null;
private ServerSocket listenSocket;
private Socket connection;
private InputStream inStream;
private DataInputStream inDataStream;
private OutputStream outStream;
private DataOutputStream outDataStream;
private Thread runChatServer;

//----------------------------------------------------------------------------------------------
//-------------------------serverGui------------------------------------------------------------
@SuppressWarnings("deprecation")
public ServerGUI(int port){
    this.port = port;
    messageLabelPanel.setLayout(new GridLayout(1, 1, 1, 1));
    messageLabelPanel.add(connectMessageLabel);
    buttonPanel.setLayout(new GridLayout(1, 1, 1, 1));
    //buttonPanel.add(connectButton);
    //buttonPanel.add(sendButton);
    buttonPanel.add(textMessage);
    textMessage.addKeyListener(this);
    textMessage.setForeground(Color.BLACK);
    messageTextAreaPanel.setLayout(new BorderLayout(1, 1));
    messageTextAreaPanel.add(buttonPanel, BorderLayout.SOUTH);
    messageTextAreaPanel.add(messageLabelPanel,BorderLayout.NORTH);
    messageTextAreaPanel.add(new JScrollPane(messageTextArea),BorderLayout.CENTER);
    messageTextArea.setDisabledTextColor(Color.BLACK);
    messageTextArea.enable(false);
    content.setLayout(new GridLayout(1, 1, 1, 1));
    content.add(messageTextAreaPanel);
    content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    serverFrame.setContentPane(content);
    serverFrame.pack();
    serverFrame.setSize(450,550);
    serverFrame.setLocationRelativeTo(null);
    serverFrame.setVisible(true);
    serverFrame.setTitle("Chat Server");
    serverFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    startServer();
}

//-----------------------------------------------------------------------------------------------------
//-------------------------------keyPressed------------------------------------------------------------
public void startServer(){
    System.out.println("startServer");
    try{
        listenSocket = new ServerSocket(port);
        System.out.println("Waiting for client");
        connection = listenSocket.accept();
        System.out.println("Client Found");
        connectMessageLabel.setText("Client Found");
        runChatServer = new Thread(serverListeningAndChatting);
        runChatServer.start();
    }
    catch (Exception ex){

        System.out.println("No Connection Found");
        connectMessageLabel.setText("No Connection Found");
    }
}
//-----------------------------------------------------------------------------------------------------
//-------------------------------listening------------------------------------------------------------
public void listening(){
    System.out.println("listening");
    try{
        inStream = connection.getInputStream();
        inDataStream = new DataInputStream(inStream);
        clientMessage = inDataStream.readUTF();
        if (clientMessage!= null){
            messageTextArea.append(clientMessage + "\n");
            clientMessage = null;
        }
    }catch(Exception ex){System.out.println(ex);}
}
//-----------------------------------------------------------------------------------------------------
//-------------------------------sendMessage------------------------------------------------------------
public void sendMessage(){
    System.out.println("sendMessage");
    try{
        outStream = connection.getOutputStream();
        outDataStream = new DataOutputStream(outStream);

        if (myMessage!=null){
            outDataStream.writeUTF(myMessage);
            myMessage=null;
        }
    }catch(Exception ex){System.out.println("Message Failed");}
}
//-----------------------------------------------------------------------------------------------------
//-------------------------------keyPressed------------------------------------------------------------
public void keyPressed(KeyEvent e) {
    if(e.getKeyChar() == KeyEvent.VK_ENTER){
        myMessage = friendLabel+ textMessage.getText();
        messageTextArea.append(thisName+textMessage.getText() +"\n");
        textMessage.setText("");
    }
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}

//-----------------------------------------------------------------------------------------------------
//-------------------------------main------------------------------------------------------------
public static void main (String args[]){
    new ServerGUI(8901);
}

//-----------------------------------------------------------------------------------------------------
//-------------------------------run------------------------------------------------------------
public Runnable serverListeningAndChatting = new Runnable(){
    public void run() {
        while (true){
            System.out.println("Running");
            listening();
            sendMessage();
        }
    }
};

}

クライアント:

public class ClientGUI extends JFrame implements KeyListener{
/**
 * 
 */
private static final long serialVersionUID = 1L;
private JTextField textMessage = new JTextField();
private JLabel connectMessageLabel = new JLabel("Connection failed or no Server is available");
private JTextArea messageTextArea = new JTextArea();
private JPanel buttonPanel = new JPanel();
private JPanel messageLabelPanel = new JPanel();
private JPanel messageTextAreaPanel = new JPanel();
private JPanel content = new JPanel();
private static String thisName= "<Me> ";
private static String friendLabel= "<My Friend> ";
private static JFrame clientFrame = new JFrame();
private int port =0;
private String remoteMachine =null;
private String clientMessage=null;
private String myMessage=null;
private Socket connection;
private InputStream inStream;
private DataInputStream inDataStream;
private OutputStream outStream;
private DataOutputStream outDataStream;
private Thread runChatClient;
//-----------------------------------------------------------------------------------------------------
//-------------------------------ClientGUI------------------------------------------------------------

@SuppressWarnings("deprecation")
public ClientGUI(String remoteMachine, int port){
    this.port= port;
    this.remoteMachine = remoteMachine;
    messageLabelPanel.setLayout(new GridLayout(1, 1, 1, 1));
    messageLabelPanel.add(connectMessageLabel);
    buttonPanel.setLayout(new GridLayout(1, 1, 1, 1));
    //buttonPanel.add(connectButton);
    //buttonPanel.add(sendButton);
    buttonPanel.add(textMessage);
    textMessage.addKeyListener(this);
    textMessage.setForeground(Color.BLACK);
    messageTextAreaPanel.setLayout(new BorderLayout(1, 1));
    messageTextAreaPanel.add(buttonPanel, BorderLayout.SOUTH);
    messageTextAreaPanel.add(messageLabelPanel,BorderLayout.NORTH);
    messageTextAreaPanel.add(new JScrollPane(messageTextArea),BorderLayout.CENTER);
    messageTextArea.setDisabledTextColor(Color.BLACK);
    messageTextArea.enable(false);
    content.setLayout(new GridLayout(1, 1, 1, 1));
    content.add(messageTextAreaPanel);
    content.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    clientFrame.setContentPane(content);
    clientFrame.pack();
    clientFrame.setSize(450,550);
    clientFrame.setLocationRelativeTo(null);
    clientFrame.setVisible(true);
    clientFrame.setTitle("Chat Client");
    clientFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    startClient();

}

//-----------------------------------------------------------------------------------------------------
//-------------------------------startClient------------------------------------------------------------
public void startClient(){
    System.out.println("startClient");
    try{
        System.out.println("Connecting to Server");
        connection = new Socket(remoteMachine, port);
        System.out.println("Server Found");
        connectMessageLabel.setText("Server Found");
        runChatClient = new Thread(clientListeningAndChatting);
        runChatClient.start();
    }
    catch (Exception ex){
        System.out.println("No Connection Found");
        connectMessageLabel.setText("No Connection Found");
    }

}
//-----------------------------------------------------------------------------------------------------
//-------------------------------keyPressed------------------------------------------------------------
public void keyPressed(KeyEvent e) {
    if(e.getKeyChar() == KeyEvent.VK_ENTER){
        myMessage = friendLabel+ textMessage.getText();
        messageTextArea.append(thisName+textMessage.getText() +"\n");
        textMessage.setText("");
    }
}

//-----------------------------------------------------------------------------------------------------
//-------------------------------listening------------------------------------------------------------
public void listening(){
    System.out.println("listening");
    try{
        inStream = connection.getInputStream();
        inDataStream = new DataInputStream(inStream);
        clientMessage = inDataStream.readUTF();
        if (clientMessage!= null){
            messageTextArea.append(clientMessage + "\n");
            clientMessage = null;
        }
    }catch(Exception ex){System.out.println("Disconnected");}
}
//-----------------------------------------------------------------------------------------------------
//-------------------------------sendMessage------------------------------------------------------------
public void sendMessage(){
    System.out.println("sendMessage");
    try{
        outStream = connection.getOutputStream();
        outDataStream = new DataOutputStream(outStream);
        if (myMessage!=null){
            outDataStream.writeUTF(myMessage);
            myMessage=null;
        }
    }catch(Exception ex){System.out.println("Message Failed");}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
//-----------------------------------------------------------------------------------------------------
//-------------------------------main------------------------------------------------------------
public static void main (String args[]){
    new ClientGUI(null, 8901);
}

//-----------------------------------------------------------------------------------------------------
//-------------------------------run------------------------------------------------------------
public Runnable clientListeningAndChatting = new Runnable(){

    public void run() {
        System.out.println("Running");
        while (true){
            listening();
            sendMessage();
        }
    }
};
}
4

1 に答える 1

4

ステートメント

listenSocket.accept();

はブロッキング呼び出しです は をブロックしていEDTます。これおよびその他のネットワークアクセス呼び出しは、SwingWorkerによって処理される必要があります。Swing はシングル スレッドであるため、イベントを処理できないため、クライアントとサーバー間でメッセージを交換できません。

SwingWorker以上を使用Thread— GUI インタラクション タスクを処理します。

于 2013-01-28T22:57:14.917 に答える