1

チャットがクライアント ウィンドウに実装されているマルチクライアント チャット アプリケーションを作成しようとしています。私は同じサーバーとクライアントのコードを試しました。2 つの問題があります。 A. コードは機能すると思いますが、サーバーからクライアントへの接続は正常ですが、クライアント間で情報が転送されません。B. 2 つ以上のクライアントの場合にプライベートな 1 対 1 のチャットを実装する方法が必要です。クラスを使用して、確立される接続ごとに返される Socket オブジェクトの情報を格納しましたが、わかりません。それを実装する方法。

サーバーコードは次のとおりです。

import java.io.*;
import java.net.*;

class ClientInfo {

Socket socket;
String name;

public ClientInfo(Socket socket, String name) {
    this.socket = socket;
    this.name = name;
}
}

public class server {

private ObjectInputStream input[] = null;
private ObjectOutputStream output[] = null;
private String value = null;
private static ServerSocket server;
private Socket connection = null;

private static int i = -1;

public static void main(String args[]) {
    try {
        server = new ServerSocket(1500, 100);
        while (true) {
            System.out.println("Waiting for connection from client");
            Socket connection = server.accept();
            i++;
            System.out.println("Connection received from " + (i + 1) + " source(s)");
            //System.out.println(i);

            new ClientInfo(connection, "Client no:" + (i + 1));
            innerChat inc = new server().new innerChat(connection);

        }
    } catch (Exception e) {
        System.out.println("Error in public static void main! >>>" + e);
    }
}// end of main!!!

class innerChat implements Runnable {

    private Socket connection = null;

    public innerChat(Socket connection) {
        this.connection = connection;
        Thread t;
        t = new Thread(this);
        t.start();
    }

    public void run() {
        try {
            output[i] = new ObjectOutputStream(connection.getOutputStream());
            output[i].flush();
            input[i] = new ObjectInputStream(connection.getInputStream());
        } catch (Exception e) {
        }
    }
}
}

クライアントコードは

import java.net.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.*;
import java.awt.event.*;

 public class ChatappClient {

private static int port = 1500;
JFrame window = new JFrame("Chat");
JButton sendBox = new JButton("Send");
JTextField inputMsg = new JTextField(35);
JTextArea outputMsg = new JTextArea(10, 35);
private ObjectInputStream input;
private ObjectOutputStream output;

public static void main(String[] args) throws Exception {
    ChatappClient c = new ChatappClient();
    c.window.setVisible(true);
    c.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    c.run();
}

    public ChatappClient() {

    inputMsg.setSize(40, 20);
    sendBox.setSize(5, 10);
    outputMsg.setSize(35, 50);
    inputMsg.setEditable(true);
    outputMsg.setEditable(false);
    window.getContentPane().add(inputMsg, "South");
    window.getContentPane().add(outputMsg, "East");
    window.getContentPane().add(sendBox, "West");
    window.pack();
    sendBox.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                output.writeObject(inputMsg.getText());
                outputMsg.append("\n" + "Client>>>" + inputMsg.getText());
                output.flush();
            } catch (IOException ie) {
                outputMsg.append("Error encountered! " + ie);
            }
            inputMsg.setText("");
        }
    });
    inputMsg.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            try {
                output.writeObject(inputMsg.getText());
                outputMsg.append("\n" + "Client>>>" + inputMsg.getText());
                output.flush();
            } catch (IOException ie) {
                outputMsg.append("Error encountered! " + ie);
            }
            inputMsg.setText("");
        }
    });
}

private void run() throws IOException {
    Socket clientSocket = new Socket("127.0.0.1", port);
    output = new ObjectOutputStream(clientSocket.getOutputStream());
    output.flush();
    input = new ObjectInputStream(clientSocket.getInputStream());
    outputMsg.append("I/O Success");
    String value = null;
    while (true) {
        try {
            value = (String) input.readObject();
        } catch (Exception e) {
        }
        outputMsg.append(value + "\n");
    }
}
}
4

1 に答える 1