Примеры применения сервера-клиента-чата на JAVA

1

Я долгое время искал примеры для приложения Server-client-chat, но я не могу понять их. Многие из них используют класс и создают из него графический интерфейс, и я не хочу копировать прямо из него. Многие примеры не объясняют, как вы отправляете сообщения от клиента на сервер, а затем отправляет сообщение всем остальным клиентам.

Я использую NetBeans, и мне было интересно, есть ли хорошие баны или примеры, которые могут мне помочь?

  • 1
    Извлечь необходимый код и поместить его в App.java в main . Кроме того, это не сайт для обучения учебникам или примерам, а конкретные вопросы программирования.
Теги:
netbeans
server
client
chat

2 ответа

0
Лучший ответ

Здесь идет программа multiThreading :) сервер имеет два класса, а клиент - один. Надеюсь, вам понравится!

ГЛАВНЫЙ КЛАСС СЕРВЕР:

    import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Main {

    public static void main(String[] args) throws IOException {
        int MAXCLIENTS = 20;
        int port = 4444;
        ServerSocket server = null;
        Socket clientSocket = null;
        // An array of clientsConnected instances
        ClientThread[] clientsConnected = new ClientThread[MAXCLIENTS];

        try {
            server = new ServerSocket(port);
            System.out.println("listening on port: " + port);
        } catch (IOException e) {// TODO Auto-generated catch block
            e.printStackTrace();

        }

        while (true) {
            try {
                clientSocket = server.accept();

            } catch (IOException e) {
                e.printStackTrace();
                if (!server.isClosed()){server.close();}
                if (!clientSocket.isClosed()){clientSocket.close();}
            }

            System.out.println("Client connected!");

            for (int c = 0; c < clientsConnected.length; c++){
                if (clientsConnected[c] == null){
                    // if it is empty ( null) then start a new Thread, and pass the socket and the object of itself as parameter
                    (clientsConnected[c] = new ClientThread(clientSocket, clientsConnected)).start();
                    break; // have to break, else it will start 20 threads when the first client connects :P
                }
            }
        }

    }



}

СЕРВЕРНЫЙ КЛИЕНТ КЛИЕНТА:

    import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;


public class ClientThread extends Thread{

    private ClientThread[] clientsConnected;
    private Socket socket = null;
    private DataInputStream in = null;
    private DataOutputStream out = null;
    private String clientName = null;

    //Constructor
     public ClientThread(Socket socket, ClientThread[] clientsConnected){
        this.socket = socket;
        this.clientsConnected = clientsConnected;
    }

    public void run(){
        try {
            // Streams :)
            in = new DataInputStream(socket.getInputStream());
            out = new DataOutputStream(socket.getOutputStream());

            String message = null;

            clientName = in.readUTF();

            while (true){
                message = in.readUTF();

                for (int c = 0; c < clientsConnected.length; c++){
                    if (clientsConnected[c]!= null && clientsConnected[c].clientName != this.clientName){ //dont send message to your self ;)
                        clientsConnected[c].sendMessage(message, clientName); // loops through all the list and calls the objects sendMessage method.
                    }
                }

            }

        } catch (IOException e) {
            System.out.println("Client disconnected!");
            this.clientsConnected = null;
        }
    }
    // Every instance of this class ( the client ) will have this method.
    private void sendMessage(String mess, String name){
        try {
            out.writeUTF(name + " says: " + mess);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

И НАКОНЕЦ КЛИЕНТА:

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class Main  
{
   public static void main(String[] args) throws IOException {

       Main m = new Main();
       m.connect();
   }

   public void connect() throws IOException{
     //declare a scanner so we can write a message
       Scanner keyboard = new Scanner(System.in);


       // localhost ip
       String ip = "127.0.0.1";
       int port = 4444;
       Socket socket = null;

       System.out.print("Enter your name: ");
       String name = keyboard.nextLine();

       try {

       //connect
       socket = new Socket(ip, port);

       //initialize streams
       DataInputStream in = new DataInputStream(socket.getInputStream());
       DataOutputStream out = new DataOutputStream(socket.getOutputStream());

       //start a thread which will start listening for messages
       new ReceiveMessage(in).start();

       // send the name to the server!
       out.writeUTF(name);

       while (true){
           //Write messages :)
           String message = keyboard.nextLine();
           out.writeUTF(message);
       }

       }
       catch (IOException e){
           e.printStackTrace();
            if (!socket.isClosed()){socket.close();}
       }
   }

   class ReceiveMessage extends Thread{

       DataInputStream in;

       ReceiveMessage(DataInputStream in){
           this.in = in;
       }

       public void run(){
           String message;
           while (true){
               try {
                    message = in.readUTF();
                    System.out.println(message);

                } catch (IOException e) {
                e.printStackTrace();
                }

           }
       }

   }

}

Я запустил сервер в eclipse и начал два клиента из CMD, выглядит так:

Изображение 174551

  • 0
    Большое спасибо!! Надеюсь, я пойму больше с этим и как он работает с многопоточностью! Большое спасибо за то, что потратили время на это. Я сделаю это, затем попробуйте реализовать GUI! Еще раз спасибо, ты молодец !!
  • 0
    Звучит как хорошая идея! Добро пожаловать :)
Показать ещё 28 комментариев
0

Вот супер простой, который я сделал сейчас, с некоторыми комментариями о том, что происходит. Клиент, подключенный к серверу, может набирать сообщения, которые сервер распечатает. Это не чат-программа, так как сервер получает сообщения, а клиент отправляет их. Но, надеюсь, вы лучше поймете это лучше :)

Сервер:

    import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class Main {

    public static DataInputStream in;
    public static DataOutputStream out;

    public static void main(String[] args) throws IOException {


    int port = 4444;
    ServerSocket server = null;
    Socket clientSocket = null;

    try {

    //start listening on port
    server = new ServerSocket(port);

    System.out.println("Listening on port: " + port);

    //Accept client
    clientSocket = server.accept();

    System.out.println("client Connected!");

    //initialize streams so we can send message
    in = new DataInputStream(clientSocket.getInputStream());
    out = new DataOutputStream(clientSocket.getOutputStream());

    String message = null;

        while (true) {
            // as soon as a message is being received, print it out!
            message = in.readUTF();
            System.out.println(message);
        }

    }
    catch (IOException e){
        e.printStackTrace();
        if (!server.isClosed()){server.close();}
        if (!clientSocket.isClosed()){clientSocket.close();}
    }

    }

}

Клиент:

    import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class Main  
{
   public static void main(String[] args) throws IOException {

       //declare a scanner so we can write a message
       Scanner keyboard = new Scanner(System.in);


       // localhost ip
       String ip = "127.0.0.1";
       int port = 4444;
       Socket socket = null;

       try {

       //connect
       socket = new Socket(ip, port);

       //initialize streams
       DataInputStream in = new DataInputStream(socket.getInputStream());
       DataOutputStream out = new DataOutputStream(socket.getOutputStream());


       while (true){
           System.out.print("\nMessage to server: ");
           //Write a message :)
           String message = keyboard.nextLine();
           //Send it to the server which will just print it out
           out.writeUTF(message);
       }

       }
       catch (IOException e){
           e.printStackTrace();
            if (!socket.isClosed()){socket.close();}
       }
   }
}
  • 0
    Спасибо за пример :) Вопрос в том, запустят ли я 2 экземпляра клиентов, смогут ли они слышать друг друга? Имеется в виду, что если я сначала запустлю client1, а затем client2, будет ли client1 слышать, что client2 отправляет на сервер?
  • 0
    Пожалуйста, извините, но этот сервер принимает только одного клиента. Если предполагается, что сервер обрабатывает несколько клиентов, вам следует использовать многопоточность.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню