繁体   English   中英

JAVA聊天应用无法通过互联网运行

[英]JAVA Chat app not working over internet

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

我已经读过几个在互联网上问过的类似问题,但是每个问题都有不同的步骤(无作用),但是我并没有获得所有步骤。

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

我是该领域的菜鸟,昨天在JAVA学习了网络,昨天晚上做了应用程序。 帮助我以简单的语言通过Internet运行我的应用程序。 如果在没有端口转发和静态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();
            }
        }
    }
}

客户端:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM