JAVA聊天应用程序无法在互联网上工作

时间:2016-11-03 07:48:30

标签: java sockets

我在Java中创建了一个聊天应用程序,当我在不同的终端上打开服务器和客户端但同一台计算机时,它工作。今天我把它交给我的朋友通过互联网进行测试并且它无法正常工作(连接超时,是的,我正在使用muiltithreads)。我允许在防火墙和我的朋友中使用端口(我使用的是4242)。但仍然无法正常工作。

我在网上看过几个类似的问题,但每个人都有不同的步骤(没有工作),而且我也没有完成所有步骤。

有人说路由器隐藏了我的IP地址所以我需要启用端口转发(我不知道如何)。没有它必须有一种方法。许多软件都是这样的,但不需要我们启用端口转发。将使用移动热点而不是调制解调器工作(我是如此DUMB!)。

我是这个领域的菜鸟,昨天在JAVA学习网络,昨天晚上做了应用程序。帮我用简单的语言在互联网上运行我的应用程序。如果它没有端口转发和静态IP地址工作,将不胜感激。如果您需要查看我的代码,请告诉我。

服务器端:

   import java.io.*;
import java.net.*;
import java.util.*;

class DailyAdviceS
{
    ArrayList<PrintWriter> Clients=new ArrayList<PrintWriter>();
    Socket sock;
    public static void main(String args[])
    {
        DailyAdviceS ad= new DailyAdviceS();
        ad.go();
    }
    private void go()
    {
        try
        {
            ServerSocket server= new ServerSocket(4242);
            InetAddress ip;
            ip = InetAddress.getLocalHost();
            System.out.println("Current IP address : " + ip.getHostAddress());
            while(true)
            {
                sock=server.accept();
                PrintWriter writer = new PrintWriter(sock.getOutputStream());
                Clients.add(writer);
                Thread foundR= new Thread(new nodeR(sock));
                foundR.start();
                System.out.println("got a connection");
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    private void SendAll(String Chat,String name)
    {
        Iterator it=Clients.iterator();
        while(it.hasNext())
        {
            try
            {
                PrintWriter writer= (PrintWriter)it.next();
                writer.println(name+" /t "+Chat);
                writer.flush();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    }
    class nodeR implements Runnable                     //recieve message from clients
    {
        private String hostName; 
        private BufferedReader reader;
        public nodeR(Socket s)
        {
            try
            {
                String hostName = s.getInetAddress().getHostName();
                System.out.println(hostName);
                InputStreamReader in= new InputStreamReader(s.getInputStream());
                reader = new BufferedReader(in);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
        public void run()
        {
            String Message;
            try
            {
                String Name=InetAddress.getLocalHost().getCanonicalHostName();  
                SendAll(Name+" Ready","");
                while(true)
                {
                    while ((Message=reader.readLine())!=null) 
                    {
                        SendAll(Message,Name);
                    }
                }

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

CLient Side:

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

class DailyAdvice
{
    private JTextArea ar= new JTextArea(100,100);
    private JTextField field = new JTextField(17);
    private JButton button;
    private Socket chat;
    private InputStreamReader stream;
    private BufferedReader reader;
    private PrintWriter writer;

    public static void main(String args[])
    {
        DailyAdvice ad= new DailyAdvice();
        ad.setnw();
        ad.go();

        }
    private void go()
    {
        JFrame frame= new JFrame("Chat with RedHead");
        JPanel panel= new JPanel();
        ar.setLineWrap(true);
        ar.setWrapStyleWord(true);
        ar.setEditable(false);
        JScrollPane scroll= new JScrollPane(ar);
        scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        panel.add(field);

        DefaultCaret caret = (DefaultCaret) ar.getCaret();
        caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

        button= new JButton("Send");
        panel.add(button);
        frame.getRootPane().setDefaultButton(button);
        frame.add(scroll,BorderLayout.CENTER);
        frame.add(panel,BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.setBounds(50,50,300,300);
        frame.setVisible(true);
        Runnable r= new Recieve();
        Thread send= new Thread(new Send());
        Thread recieve= new Thread(r);
        send.start();
        recieve.start();

    }
    private void setnw()
    {
        try
        {
            chat = new Socket("122.176.8.153",4242);
            stream= new InputStreamReader(chat.getInputStream());
            reader= new BufferedReader(stream);
            writer = new PrintWriter(chat.getOutputStream());
            System.out.println("connection established");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    class Send implements Runnable
    {
        public void run()
        {
            button.addActionListener(new timetosend());

        }
        class timetosend implements ActionListener
        {
            public void actionPerformed(ActionEvent ev)
            {
                try
                {
                    String msg =field.getText();
                    writer.println(msg);
                    writer.flush();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
                field.setText("");
            }
        }
    }
    class Recieve implements Runnable
    {
        public void run()
        {
            try
            {
                String input;
                while ((input= reader.readLine())!=null)
                {
                    String[] result=input.split("/t");
                    ar.append(result[0]+" : "+result[1]+'\n');
                }
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果通过互联网访问,请确保您的应用程序未使用专用IP连接到您的服务器。您可以从当前分配给您的PC的站点检查您的PC的公共IP,并可以在您的客户端应用程序中使用它。
并且还要确保在交换机/路由器中配置端口转发端口,如果您的ISP不允许,您可以使用PC上的任何端口转发软件来执行此操作。

http://www.get-myip.com/

相关问题