2016-07-26 49 views
1

我已经做了一个基本的聊天应用程序,它可以在同一台PC上运行良好,但我希望它可以在不同的机器上运行。java聊天应用程序不能在其他机器上工作

为了简单起见,我省略了GUI代码。我从一个单独的应用程序接收IP,名称和端口,并将其传递给客户端的构造函数。我输入了运行服务器的机器的IP和端口。

客户

public class ClientGui extends JFrame implements Runnable, KeyListener, ActionListener 
{ 
    private JPanel contentPane; 
    private Socket socket; 
    private String name , ip; 
    private int port; 
    private JTextField input; 
    private JTextArea console; 

    private JButton send; 
    private String message; 
    private DateFormat format; 
    private BufferedReader in; 
    private PrintWriter out; 
    private String reply; 

    public ClientGui(String name, String ip, int port) 
    { 
     format = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); 

     this.name = name; 
     this.ip = ip; 
     this.port = port; 

     new Thread(this).start(); 
    } 

    public void run() 
    { 
     try { 
      socket = new Socket(ip, port); 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      out = new PrintWriter(socket.getOutputStream(), true); 

      while (true) { 
       out.println(name); 
       reply = in.readLine(); 

       if (reply.equals("NAME")) { 
        name = JOptionPane.showInputDialog("Name taken , Enter another"); 
       } else { 
        input.setEditable(true); 
        setTitle(name); 
        break; 
       } 
      } 

      while (true) { 
       reply = in.readLine(); 

       if (reply.startsWith("MESSAGE")) { 
        log(reply.substring(7)); 
       } 
      } 
     } catch (Exception e) { 
      try { 
       out.close(); 
       in.close(); 
       socket.close(); 
      } catch (Exception e2) { 
       dispose(); 
       System.exit(0); 
      } 
      dispose(); 
      System.exit(0); 
     } 
    } 
} 

服务器

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.HashSet; 

public class Server implements Runnable 
{ 
    private static ArrayList<PrintWriter> writers; 
    private static HashSet<String> names; 
    private Socket socket; 
    private String name; 
    private String message; 

    public Server(Socket socket) 
    { 
     this.socket = socket; 
    } 

    public void run() 
    { 
     PrintWriter temp = null; 

     try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { 
      try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) { 
       while (true) { 
        name = in.readLine(); 

        if (names.contains(name)) { 
         out.println("NAME"); 
        } else { 
         out.println("NAMEACCEPTED"); 
         names.add(name); 
         break; 
        } 
       } 

       writers.add(out); 
       temp = out; 

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

        for (PrintWriter writer : writers) { 
         writer.println("MESSAGE" + name + " : " + message); 
        } 
       } 
      } 
     } catch (Exception e) { 
      try { 
       names.remove(name); 
       writers.remove(temp); 
       socket.close(); 
      } catch (Exception ignored) { 
      } 
     } 
    } 

    public static void main(String[] args) 
    { 
     writers = new ArrayList<>(); 
     names = new HashSet<>(); 
     ServerSocket server = null; 

     try { 
      int port = Integer.parseInt(args[0]); 
      server = new ServerSocket(port); 
     } catch (Exception e) { 
      System.out.println("Enter a valid port"); 
      System.exit(0); 
     } 

     while (true) { 
      try { 
       System.out.println("Waiting for clients...."); 
       new Thread(new Server(server.accept())).start(); 
       System.out.println("Client Received"); 
      } catch (Exception e) { 
       System.out.println("Server can't accept clients"); 
       break; 
      } 
     } 
    } 
} 
+0

您是否验证了网络作品位?客户端是否连接到服务器? –

+0

是的,当客户端和服务器在同一台机器上时,确实如此 –

+1

检查是否没有阻止联网的防火墙,并检查是否绑定到正确的网络接口。如果绑定到0.0.0.0,它应该监听所有网络接口。问题很可能不是您的代码,而是您的代码的网络位或您的计算机的设置。 –

回答

0

对不起添麻烦了所有

的问题是与端口我是使用时,我打开开关,它的工作在不同的机器

感谢所有帮助

1

我认为这可能是因为 1)你有没有这两种设备 2)上安装了JRE分辩,版本你不在同一个网络中,或者你没有转发你的IP

你有没有试过在虚拟盒子中使用它?

(客户端1 == vbox1,服务器计算机==,客户机程序== vbox2)

希望,这有助于

+0

我已经尝试了另一个Java聊天应用程序(不是我的代码),它运行在所有计算机上都很好 –

+0

好。你确定,你的服务器有足够的可用空间吗? –