JAVA 上的服务器-客户端-聊天应用程序示例

Exampels on a Server-Client-Chat applikation on JAVA

我 "googeling" 很长时间以来一直在研究服务器-客户端-聊天应用程序的示例,但我无法真正理解它们。他们中的许多人都在使用 class 并从中创建 GUI,我不想直接从中复制。很多示例都没有真正解释您如何将消息从客户端发送到服务器,然后将消息发送到所有其他客户端。

我正在使用 NetBeans,我想知道是否有一些好的教程或示例可以帮助我解决这个问题?

这是我刚才做的一个非常简单的例子,其中包含一些关于正在发生的事情的评论。连接到服务器的客户端可以键入服务器将打印出的消息。这不是聊天程序,因为服务器接收消息,而客户端发送消息。但希望你能更好地理解它:)

服务器:

    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();}
       }
   }
}

多线程程序来了:)服务器有两个类,客户端有一个。希望你喜欢!

主服务器CLASS:

    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
                }
            }
        }

    }



}

服务器客户端CLASS:

    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启动了两个客户端,如下所示: