1

我已经使用 java 中的小程序开发了简单的文本聊天应用程序。它由两个文件组成。

  1. server.java-> 访问服务器部分
  2. client.java-> 访问客户端部分

打开两个小程序后,服务器和客户端之间可以进行聊天。

Here's my server side code:

    Serverfile.java

    import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class serverfile extends JFrame {
    private JTextField usertext;
    private JTextArea chatwindow;
    private ObjectOutputStream output;
    private ObjectInputStream input;
    private ServerSocket server;
    private Socket connection;

    public serverfile(){
    super("server messaging system");    
    usertext= new JTextField();
    usertext.setEditable(false);
    usertext.addActionListener( new ActionListener(){
    public void actionPerformed(ActionEvent event){
    sendmessage(event.getActionCommand());
    usertext.setText("");
      }
    }
    );
    add(usertext,BorderLayout.SOUTH);
    chatwindow= new JTextArea();
    add(new JScrollPane(chatwindow));
    setSize(300,250);
    setVisible(true);
    }

   public void startrunning(){
   try{
   server= new ServerSocket(6789,100);
   while(true){
   try{
   waitForConnection();
   setupstream();
   whilechatting();
   }catch(Exception e){
   System.out.println("you have an error in coversation with client");
   }finally{
   closecrap();
   }
   }
   }
   catch(Exception e){
   System.out.println("you have an error in connecting with client");
   }
   }
   private void waitForConnection() throws IOException{

   showmessage("waiting for someone to connect");
   connection= server.accept();
   showmessage("now connected to"+connection.getInetAddress().getHostName());
   }

   private void setupstream() throws IOException{

   output= new ObjectOutputStream(connection.getOutputStream());
   output.flush();
   input= new ObjectInputStream(connection.getInputStream());
   showmessage("\n streams are setup");
   }

   private void whilechatting()throws IOException{

   String message = "\n you are now connected";
   sendmessage(message);
   ableToType(true);
   do{
   try{
   message = (String)input.readObject();
   showmessage("\n"+message);
   catch(Exception e){
   System.out.println("\n error in reading message");
   }
   }while(!message.equals("CLIENT-END"));
   }

   private void closecrap(){

   showmessage("\nclosing connection");
   ableToType(false);
   try{
   output.close();
   input.close();
   connection.close();
   }catch(Exception e){
   System.out.println("\n error in closing server");

   }
   }

   private void sendmessage(String message){

   try{
   output.writeObject("SERVER-"+message);
   output.flush();
   }catch(Exception e){
   chatwindow.append("\n error in sending message from server side");
   }
   }

   private void showmessage(final String text){

   SwingUtilities.invokeLater( new Runnable(){
   public void run(){
   chatwindow.append(text);
   }
    }
   );
    }

   private void ableToType(final boolean tof){

   SwingUtilities.invokeLater( new Runnable(){
    public void run(){
    usertext.setEditable(tof);
    }
    }
    );
    }
    }


    Server.java-> which access serverfile code:

    import javax.swing.JFrame

     public class server {
      public static void main(String args[]){
      serverfile obj1= new serverfile();
      obj1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     obj1.startrunning();
         }    
           }

我的客户端代码:

    Clientfile.java

    import java.net.*;
    import java.io.*;
    import java.awt.*;
     import java.awt.event.*;
      import javax.swing.*;

        public class clientfile extends JFrame {
          private JTextField usertext;
          private JTextArea chatwindow;
          private ObjectOutputStream output;
           private ObjectInputStream input;
          private String message="";
            private String serverIP;
            private ServerSocket server;
               private Socket connection;

             public clientfile(String host){
              super("client messaging system");  
             serverIP=host;
            usertext= new JTextField();
 usertext.setEditable(false);
 usertext.addActionListener( new ActionListener(){
 public void actionPerformed(ActionEvent event){
     sendmessage(event.getActionCommand());
     usertext.setText("");
      }
 }
 );
 add(usertext,BorderLayout.SOUTH);
 chatwindow= new JTextArea();
 add(new JScrollPane(chatwindow));
 setSize(300,250);
 setVisible(true);
}

        public void startrunning(){
            try{
       connecttoserver();
         setupstream();
          whilechatting();
        }catch(Exception e){
         System.out.println("you have an error in coversation with server");
            }
           finally{
           closecrap();
               }
               }
            private void connecttoserver() throws IOException{
          showmessage("attempting connection");
          connection= new Socket(InetAddress.getByName(serverIP),6789);
         showmessage("connected to"+connection.getInetAddress().getHostName());
           }
             private void setupstream() throws IOException{
             output= new ObjectOutputStream(connection.getOutputStream());
          output.flush();
            input= new ObjectInputStream(connection.getInputStream());
        showmessage("\n streams are good to go");
              }

          private void whilechatting()throws IOException{
         ableToType(true);
            do{
           try{
           message = (String)input.readObject();
             showmessage("\n"+message);
        }catch(Exception e){
          System.out.println("\n error in writing message");
            }
        }while(!message.equals("SERVER - END"));
             }

        private void closecrap(){
       showmessage("\nclosing....");
         ableToType(false);
              try{
        output.close();
        input.close();
         connection.close();
         }catch(Exception e){
          System.out.println("\n error in closing client");
       }
          }
         private void sendmessage(String message){
           try{
          output.writeObject("CLIENT-"+message);
           output.flush();
           }catch(Exception e){
           chatwindow.append("\n error in sending message from client side");
             }
               }
            private void showmessage(final String m){
             SwingUtilities.invokeLater( new Runnable(){
             public void run(){
            chatwindow.append(m);
           }
              }
                 );
                       }

               private void ableToType(final boolean tof){
           SwingUtilities.invokeLater( new Runnable(){
               public void run(){
               usertext.setEditable(tof);
              }
            }
               );
               }
              }



    Client.java-> access client file code

           import javax.swing.JFrame;

          public class client {
           public static void main(String args[]){
         clientfile obj2= new clientfile("127.0.0.1");
          obj2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            obj2.startrunning();
              }        
                 }

我想知道的是如何在两台不同的计算机上访问聊天?可能吗?

我想要一台计算机上的 server.java 和另一台计算机上的 client.java。如果有人有任何解决方案,请告诉我。随意问的问题。

4

2 回答 2

1

是的,它可以在两个主机上运行服务器和客户端。
以某种方式更改您的client课程以接受服务器的 IP - 通过命令行参数、键盘输入等 - 而不是硬编码“127.0.0.1”,即 localhost

import javax.swing.JFrame;

public class client {
    public static void main(String args[]){
        clientfile obj2= new clientfile(args[0]); // taken from command line args
        obj2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        obj2.startrunning();
    }        
}

java client 192.168.0.3192.168.0.3需要替换为运行服务器的主机的私有 IP 的地方运行客户端。
主机运行服务器的IP可以ipconfig在windows或者ifconfigLinux/Ubuntu下执行。

于 2013-03-31T14:02:26.380 回答
1

假设您的服务器程序正在使用 ip 的系统上运行110.10.9.8(只是一个示例)在客户端代码行connection= new Socket(InetAddress.getByName(serverIP),6789);中,替换InetAddress.getByName(serverIP)110.10.9.8. 要知道服务器系统的 IP,只需在 goole 中输入“我的 IP 是什么”。请记住,它的动态 IP 会在您的调制解调器或路由器每次重新启动时发生变化。所以每次都要找IP。如果您想拥有类似于静态 IP 的内容,请访问

于 2013-03-31T14:02:52.447 回答