Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单服务器/客户端程序获取错误:java.net.ConnectException:连接被拒绝_Java_Client Server_Connectexception - Fatal编程技术网

简单服务器/客户端程序获取错误:java.net.ConnectException:连接被拒绝

简单服务器/客户端程序获取错误:java.net.ConnectException:连接被拒绝,java,client-server,connectexception,Java,Client Server,Connectexception,我试着编写一个简单的messenger,就像书中的例子一样(Java如何编写第9版Paul Deitel Harvey Deitel,第27.6部分)。在我完成之后,我试着测试它。它可以在本地主机(127.0.0.1)上工作,也可以在连接同一调制解调器的计算机上工作(我指的是ips,如192.168.0.1等),但当我想在跨internet的某些计算机上测试它时,客户端代码出现连接拒绝错误。 我想当我的客户(我在城市的某个地方的朋友)尝试连接服务器(我在城市的某个地方)时,当他输入我的ip连接我

我试着编写一个简单的messenger,就像书中的例子一样(Java如何编写第9版Paul Deitel Harvey Deitel,第27.6部分)。在我完成之后,我试着测试它。它可以在本地主机(127.0.0.1)上工作,也可以在连接同一调制解调器的计算机上工作(我指的是ips,如192.168.0.1等),但当我想在跨internet的某些计算机上测试它时,客户端代码出现连接拒绝错误。 我想当我的客户(我在城市的某个地方的朋友)尝试连接服务器(我在城市的某个地方)时,当他输入我的ip连接我时,他连接到我的调制解调器,我的调制解调器不向我发送信息(很难用母语解释你不能深刻理解的事情,所以我很抱歉) 任何帮助对我都很重要

这是服务器代码

//:D
//hello every Body:! this is my first program which use some networks !!! :-khatkeif
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.ServerSocket;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.EOFException;
public class Server extends JFrame
{
    JTextField enteredText;//input message from user
    JTextArea displayArea;//display information to user
    ObjectInputStream input;//input object from cilent
    ObjectOutputStream output;//output Object to client
    ServerSocket server;//server Socket
    Socket connection;//connecton to cilent
    public Server()//constructor
    {
        super("Server");
        setLayout(new BorderLayout(5,5));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new JLabel("Server Messenger"),BorderLayout.NORTH);
        enteredText= new JTextField("entered message here");
        enteredText.setEditable(false);
        enteredText.addActionListener(new TextHandler());
        add(enteredText,BorderLayout.SOUTH);
        displayArea= new JTextArea();
        displayArea.setEditable(false);
        add(new JScrollPane(displayArea),BorderLayout.CENTER);
        setSize(500,500);
        setVisible(true);
    }
    public void runServer()
    {
        try
        {
            server = new ServerSocket(12345,10);//create server Socket
            while(true)
            {
                waitForConnection();//wait util a client want to connect
                openStreams();//open streams for send/get data
                processConnection();//recive message from client
            }
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
    public void waitForConnection() throws IOException
    {
        displayMessage("waiting for client");
        connection=server.accept();//alow server for connection
        displayMessage("connect to "+connection.getInetAddress().getHostName());        
    }
    public void openStreams() throws IOException//open stream that help me to send and recive message
    {
        displayMessage("setting I/O");
        output= new ObjectOutputStream(connection.getOutputStream());//create output to send message
        output.flush();//send headers to client
        input = new ObjectInputStream(connection.getInputStream());//create input from client message
        displayMessage("Got I/O");
    }
    public void processConnection() throws IOException//recive message from client & alow server to send message to client
    {
        try
        {
            displayMessage("connected successfully");
            setTextEditable(true);//alow server to send message to client
            String reciveMessage = (String)input.readObject();//recive message form client
            while(!reciveMessage.equals("TERMINATE"))//if client send this string,make process connection finish
            {
                displayMessage(connection.getInetAddress().getHostName()+">>> "+reciveMessage);//display clinet message in display erea
                reciveMessage=(String)input.readObject();//read next message
            }
        }
        catch(ClassNotFoundException cnfe)
        {
            cnfe.printStackTrace();
        }
        displayMessage(connection.getInetAddress().getHostName()+" disconnect`");
        close();
    }
    public void close() throws IOException//close every thing
    {
        sendMessage("TERMINATE");
        input.close();
        output.close();
        connection.close();
        setTextEditable(false);
        displayMessage("connection terminated");
    }
    public void setTextEditable(final boolean val)//set text field editable
    {
        SwingUtilities.invokeLater
        (
            new Runnable()
            {
                public void run()
                {
                    enteredText.setEditable(val);
                }
            }
        );

    }
    public void displayMessage(final String message)//display message in displayArea
    {
        SwingUtilities.invokeLater(
            new Runnable()
            {
                public void run()
                {
                    displayArea.append(message+"\n");
                }
            }
        );
    }
    public void sendMessage(String message) throws IOException//send message to client
    {
        output.writeObject(message);
        output.flush();
        displayMessage("Me>>> "+message);
        enteredText.setText("");
    }
    private class TextHandler implements ActionListener//when user press enter a text in enteredText send to client
    {
        public void actionPerformed(ActionEvent ev) 
        {
            try
            {
                sendMessage(ev.getActionCommand()); 
            }
            catch(IOException ioe)
            {
                ioe.printStackTrace();
            }
        }
    }
}
这是主要的

//:D
public class ServerRun
{
    public static void main(String[] args)
    {
        Server server = new Server();
        server.runServer();
    }
}
让我们来看看客户机代码:D

//:D
//this is client side
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.InetAddress;
public class Client extends JFrame
{
    JTextField enteredText;//user input message
    JTextArea displayArea;//display information
    ObjectOutputStream output;//send message to server
    ObjectInputStream input;//recive message from server;
    Socket connection;//connection to server
    String serverInfo;//server name
    JButton closeB;
    JPanel downPanel;
    public Client ()
    {
        super("Client");
        setLayout(new BorderLayout(5,5));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(new JLabel("Client Messenger"),BorderLayout.NORTH);
        enteredText= new JTextField("Enter message Here");
        setTextEditable(false);
        enteredText.addActionListener(
            new ActionListener()
            {               
                public void actionPerformed(ActionEvent ev) 
                {
                    try
                    {
                        sendMessage(ev.getActionCommand());
                    }               
                    catch(IOException ioe)
                    {
                        ioe.printStackTrace();
                    }
                }
            }
        );
        closeB= new JButton("close");
        closeB.addActionListener(
            new ActionListener()
            {
                public void actionPerformed(ActionEvent ev)
                {
                    try
                    {
                        close();
                    }
                    catch(IOException ioe)
                    {
                        ioe.printStackTrace();
                    }
                }
            }
        );
        downPanel= new JPanel(new BorderLayout(5,5));
        downPanel.add(enteredText,BorderLayout.CENTER);
        downPanel.add(closeB,BorderLayout.EAST);
        add(downPanel,BorderLayout.SOUTH);
        displayArea= new JTextArea();
        displayArea.setEditable(false);
        add(new JScrollPane(displayArea),BorderLayout.CENTER);
        setSize(500,500);
        setVisible(true);
    }
    public void runClient(String host)//run client program
    {
        try
        {
            connectToServer(host);
            openStreams();
            processConnection();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
        }
    }
    public void connectToServer(String host) throws IOException//connect to server
    {
        displayMessage("connceting to " + host);
        connection = new Socket(InetAddress.getByName(host),12345);//create connection to server 
    }
    public void openStreams() throws IOException // open streams for recive/send messages
    {
        output= new ObjectOutputStream( connection.getOutputStream());//create output for send messages
        output.flush();//send headers
        input = new ObjectInputStream(connection.getInputStream());//create input for recive messages
        displayMessage("connected to "+connection.getInetAddress().getHostName());
    }
    public void processConnection()throws IOException //recive message util server trminate
    {
        try
        {
            setTextEditable(true);//alow user to send message
            String reciveMessage=(String) input.readObject();
            while(!reciveMessage.equals("TERMINATE"))
            {
                displayMessage(connection.getInetAddress().getHostName()+">>> "+reciveMessage);
                reciveMessage=(String)input.readObject();
            }
            displayMessage("connection lost");
        }
        catch(ClassNotFoundException cnfe)
        {
            displayMessage("server message is not clear");
        }
    }
    public void close() throws IOException//close every thing
    {
        sendMessage("TERMINATE");
        input.close();
        output.close();
        connection.close();
        System.exit(0);
    }
    public void sendMessage(String message) throws IOException//send message to server
    {
        output.writeObject(message);//send message to server
        output.flush();//send headers
        displayMessage("Me>>> "+message);//displate sent message to user
        enteredText.setText("");
    }
    public void displayMessage(final String message)
    {
        SwingUtilities.invokeLater(
            new Runnable()
            {
                public void run()
                {
                    displayArea.append(message+"\n");
                }
            }
        );
    }
    public void setTextEditable(final boolean val)
    {
        SwingUtilities.invokeLater(
            new Runnable()
            {
                public void run()
                {
                    enteredText.setEditable(val);
                }
            }
        );
    }
}
主要是:

//:D
import javax.swing.JOptionPane;
public class ClientRun
{
    public static void main(String args[])
    {
        Client client = new Client();
        client.runClient(JOptionPane.showInputDialog(null,"please enter host IP:"));
    }
}

再次感谢

问题是您试图访问一台没有公共IP的计算机。唯一具有“真实”IP地址的是路由器或电缆调制解调器(取决于配置)。为了让远程计算机访问服务器正在运行的计算机,最好的选择是为您使用的服务器端口(
12345
)设置端口转发,并确保流量重定向到您的计算机

设置端口转发的方法对于不同的路由器是不同的,你必须在谷歌上搜索你的路由器并使用短语“端口转发”。 一旦一切设置完毕,客户端将不得不使用路由器的公共IP地址(您可以在路由器设置中查找)。然后它会这样:客户端会点击路由器,路由器会将流量转发到您的本地计算机和您的服务器套接字,然后应该这样做。一旦建立了联系,你就可以出发了


希望这能有所帮助。

前言:这很可能不是代码的问题,而是网络设置的问题。(看起来@Dimony抢先回答了我,希望这和他的想法一样)

您的朋友无法连接到服务器的最可能原因是他无法通过您的调制解调器。为了让某人连接到您的服务器(从代码上看,端口看起来是
12345
),您需要更改路由器/调制解调器中的一些设置(您通常可以通过转到192.168.1.1或192.168.0.1进行连接)并添加“端口转发规则”。这将允许网络“外部”(即世界其他地区)的连接连接到该端口上的服务器

您需要向调制解调器/路由器添加“端口转发”规则,该规则将端口
12345
上的所有流量重定向到您托管服务器的本地ip(您的计算机ip;可通过控制台/终端中的
ipconfig
ifconfig
cmd找到)。然后你需要获得你的“外部IP”,可以通过谷歌搜索“what's my IP”找到。这是您的网络与世界其他地区的“地址”。这是你需要给你朋友的IP

您的朋友需要使用您提供给他的外部IP以及服务器运行的端口,您的路由器应该将他的连接转发到您的服务器,并且应该可以工作

您可能需要进一步研究的主题有:“外部IP与内部IP”和“端口转发”

希望这有帮助