Java 服务器客户端聊天程序

Java 服务器客户端聊天程序,java,sockets,server,client,chat,Java,Sockets,Server,Client,Chat,我正在通过控制台创建服务器客户端聊天程序。当我运行该程序时,它只接受输入和无限量的输入 服务器代码 import java.net.*; import java.io.*; public class Server { static final int PORT_NUM=4458; public static void main(String args []) { try { ServerSocket ss=new ServerSocket(POR

我正在通过控制台创建服务器客户端聊天程序。当我运行该程序时,它只接受输入和无限量的输入

服务器代码

import java.net.*;
import java.io.*;
public class Server {
    static final int PORT_NUM=4458;
    public static void main(String args []) {
     try {
            ServerSocket ss=new ServerSocket(PORT_NUM);
            Socket s=ss.accept();
            System.out.println("Server is listening...");
            String str1="";
            String str2="";

            DataInputStream din=new DataInputStream(s.getInputStream());
            DataOutputStream dout=new DataOutputStream(s.getOutputStream());
            BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
                    while(!str1.equals("STOP")) {
                        str1=din.readUTF();
                        System.out.println("Client says: "+str1);
                        str2=br.readLine();
                        dout.writeUTF(str2);
                        dout.flush();
                    }
                    System.out.println("Connection closed");
                    din.close();
                    dout.close();
                    s.close();
                    ss.close();
        }
     catch(Exception e) {
         System.out.println(e.getMessage());
     }
     }
}
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String args []) {
     try {
        Socket s=new Socket("localhost",4458);
        DataInputStream din=new DataInputStream(s.getInputStream());
        DataOutputStream dout=new DataOutputStream(s.getOutputStream());
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        String str1="";
        String str2="";
        while(!str1.equals("STOP")) {
            str1=br.readLine();
            dout.writeUTF(str1);
            dout.flush();
            str2=din.readUTF();
            System.out.println("Client says: "+str2);
        }
        System.out.println("Connection closed");
        din.close();
        dout.close();
        s.close();
     }
     catch(Exception e) {
         System.out.println(e.getMessage());
     }
    }
}
客户端代码

import java.net.*;
import java.io.*;
public class Server {
    static final int PORT_NUM=4458;
    public static void main(String args []) {
     try {
            ServerSocket ss=new ServerSocket(PORT_NUM);
            Socket s=ss.accept();
            System.out.println("Server is listening...");
            String str1="";
            String str2="";

            DataInputStream din=new DataInputStream(s.getInputStream());
            DataOutputStream dout=new DataOutputStream(s.getOutputStream());
            BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
                    while(!str1.equals("STOP")) {
                        str1=din.readUTF();
                        System.out.println("Client says: "+str1);
                        str2=br.readLine();
                        dout.writeUTF(str2);
                        dout.flush();
                    }
                    System.out.println("Connection closed");
                    din.close();
                    dout.close();
                    s.close();
                    ss.close();
        }
     catch(Exception e) {
         System.out.println(e.getMessage());
     }
     }
}
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String args []) {
     try {
        Socket s=new Socket("localhost",4458);
        DataInputStream din=new DataInputStream(s.getInputStream());
        DataOutputStream dout=new DataOutputStream(s.getOutputStream());
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        String str1="";
        String str2="";
        while(!str1.equals("STOP")) {
            str1=br.readLine();
            dout.writeUTF(str1);
            dout.flush();
            str2=din.readUTF();
            System.out.println("Client says: "+str2);
        }
        System.out.println("Connection closed");
        din.close();
        dout.close();
        s.close();
     }
     catch(Exception e) {
         System.out.println(e.getMessage());
     }
    }
}
还有一个疑问是,我在EclipseIDE上运行这个程序,只有一个控制台。因为有两个不同的代码,所以必须有两个控制台,通过一个控制台,我将代表服务器端提供输入,通过另一个控制台,我将代表客户端提供输入。我该怎么做才能做到这一点


我无法理解我在哪里得到了无限循环。我该怎么办请建议我。

至于无限循环,我似乎不知道它为什么会发生。我对Eclipse不太熟悉,但NetBeans有一个特性,可以通过右键单击并选择Run file来使用main方法运行.java文件。也许Eclipse有类似的特性?同样,您可以有两个Eclipse项目并分别运行它们,然后切换到您想要访问的控制台。更好的是,您可以在IDE之外编写代码,然后使用两个命令提示运行代码:一个用于服务器,另一个用于客户端。这样,您将能够“实时”查看消息。 下面的代码适用于我。我在IDE之外键入它,并使用命令提示符执行代码(首先是服务器)。 服务器代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Server {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int port = 12345;
        String stop = "STOP";
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Waiting for client connection..");
            Socket socket = serverSocket.accept();
            System.out.println("Connection received from " + socket.getInetAddress().getHostName());
            String message = "";
            Scanner scanner = new Scanner(System.in);
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            
            boolean closed = false;
            while (!closed){
                System.out.print("Enter message: ");
                message = scanner.nextLine();
                if (message.equalsIgnoreCase(stop)){
                    closed = true;
                    output.writeObject(stop);
                    System.out.println("Session ended.");
                }
                else{
                    output.writeObject(message);
                    System.out.println("Client typing...");
                    try {
                        message = (String) input.readObject();
                        System.out.println("Client says: " + message);
                        if (message.equalsIgnoreCase(stop)){
                            closed = true;
                        }
                    } catch (ClassNotFoundException ex) {
                        //Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error: " + ex.getMessage());
        }
    }
    
}
客户端代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter server address: ");
        String address = scanner.nextLine();
        System.out.print("Enter server port: ");
        int port = scanner.nextInt();
        scanner.nextLine();//get rid of new line left by nextInt();
        try {
            Socket socket = new Socket(address, port);
            System.out.println("Connected to server. Waiting for message");
            String message = "";
            String stop = "STOP";
            boolean closed = false;
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            while (!closed){
                try {
                    System.out.println("Server typing...");
                    message = (String) input.readObject();
                    System.out.println("Server says: " + message);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (message.equalsIgnoreCase(stop)){
                    closed = true;
                }
                else{
                    System.out.print("Enter message: ");
                    message = scanner.nextLine();
                    if (message.equalsIgnoreCase(stop)){
                        closed = true;
                        output.writeObject(stop);
                        System.out.println("Session ended.");
                    }
                    else{
                        output.writeObject(message);
                    }
                }
            }
            System.out.println("Session ended.");
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error: " + ex.getMessage());
        }
    }
}

我希望这能有所帮助。

至于无限循环,我似乎无法找到它发生的原因。我对Eclipse不太熟悉,但NetBeans有一个特性,可以通过右键单击并选择Run file来使用main方法运行.java文件。也许Eclipse有类似的特性?同样,您可以有两个Eclipse项目并分别运行它们,然后切换到您想要访问的控制台。更好的是,您可以在IDE之外编写代码,然后使用两个命令提示运行代码:一个用于服务器,另一个用于客户端。这样,您将能够“实时”查看消息。 下面的代码适用于我。我在IDE之外键入它,并使用命令提示符执行代码(首先是服务器)。 服务器代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Server {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int port = 12345;
        String stop = "STOP";
        try {
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("Waiting for client connection..");
            Socket socket = serverSocket.accept();
            System.out.println("Connection received from " + socket.getInetAddress().getHostName());
            String message = "";
            Scanner scanner = new Scanner(System.in);
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            
            boolean closed = false;
            while (!closed){
                System.out.print("Enter message: ");
                message = scanner.nextLine();
                if (message.equalsIgnoreCase(stop)){
                    closed = true;
                    output.writeObject(stop);
                    System.out.println("Session ended.");
                }
                else{
                    output.writeObject(message);
                    System.out.println("Client typing...");
                    try {
                        message = (String) input.readObject();
                        System.out.println("Client says: " + message);
                        if (message.equalsIgnoreCase(stop)){
                            closed = true;
                        }
                    } catch (ClassNotFoundException ex) {
                        //Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error: " + ex.getMessage());
        }
    }
    
}
客户端代码:

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter server address: ");
        String address = scanner.nextLine();
        System.out.print("Enter server port: ");
        int port = scanner.nextInt();
        scanner.nextLine();//get rid of new line left by nextInt();
        try {
            Socket socket = new Socket(address, port);
            System.out.println("Connected to server. Waiting for message");
            String message = "";
            String stop = "STOP";
            boolean closed = false;
            ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
            ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
            while (!closed){
                try {
                    System.out.println("Server typing...");
                    message = (String) input.readObject();
                    System.out.println("Server says: " + message);
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
                }
                if (message.equalsIgnoreCase(stop)){
                    closed = true;
                }
                else{
                    System.out.print("Enter message: ");
                    message = scanner.nextLine();
                    if (message.equalsIgnoreCase(stop)){
                        closed = true;
                        output.writeObject(stop);
                        System.out.println("Session ended.");
                    }
                    else{
                        output.writeObject(message);
                    }
                }
            }
            System.out.println("Session ended.");
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Error: " + ex.getMessage());
        }
    }
}

我希望这会有所帮助。

您有两个主要方法,可以在Eclipse中作为两个不同的程序运行它们。假设您在Eclipse中都打开了,您可以右键单击服务器代码并选择run。然后将窗口更改为客户端并重复。控制台将在底部的控制台窗口中设置选项卡


对于循环,请记住以大写字母键入“STOP”。您还可以使用“equalsIgnoreCase()”,这样“STOP”和“STOP”都可以工作。

您有两个主要方法,可以在Eclipse中作为两个不同的程序运行它们。假设您在Eclipse中都打开了,您可以右键单击服务器代码并选择run。然后将窗口更改为客户端并重复。控制台将在底部的控制台窗口中设置选项卡

对于循环,请记住以大写字母键入“STOP”。您还可以使用“equalsIgnoreCase()”,这样“STOP”和“STOP”都可以工作