【问题标题】:Connection Refused - Java Client/Server连接被拒绝 - Java 客户端/服务器
【发布时间】:2014-12-14 19:25:59
【问题描述】:

我正在尝试创建一个 java 推送服务器模型以在我自己的机器上进行测试,这不会用于连接外部客户端,因为服务器和客户端将在同一台机器上。在客户端连接到他/她指定的端口后,他们应该发送一条他们选择的消息,该消息将被发送回给他们,以及连接到同一端口的任何其他客户端。

我遇到的问题是我在尝试此操作时收到java.net.ConnectException: Connection refused: connect。下面是客户端和服务端。

编辑:我已经花时间确保必要的端口也打开了,甚至禁用了我的防火墙,但无济于事。

服务器:

class MainServer {
    // port that oir server is going to operate on
    final static int port = 1234;
    public static void main(String[] args) {
        // this is going to model the server for the moment
        System.out.println("Server has been started...");
        Buffer<Messages> store = new Buffer<Messages>(10);
        new Writer(store).start();
        try {
            ServerSocket serve = new ServerSocket(port);
            while(true) {
                // wait for server request
                Socket socket = serve.accept();
                // start thread to service request
                new ServerThread(socket,store).start();
            }
        } catch(IOException e) {e.printStackTrace();}
    }
}

class ServerThread extends Thread {
    Socket socket;
    Buffer<Messages> buffer;

    public ServerThread(Socket s, Buffer<Messages> b) {
        socket = s;buffer = b;
    }

    public void run() {
        try {
            DataInputStream in = new DataInputStream(socket.getInputStream());
            int port = in.readInt();
            System.out.println("Port: "+port);
            Messages ms = new Messages(port);
            // Read message as string from user
            String message = in.readUTF();
            int k = in.readInt();

            while(k != -1) {
                // Add message to array
                // read next message
                ms.add(message);
                message = in.readUTF();
            }
            // close connection
            socket.close();
            // add message to buffer
            buffer.put(ms);

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

class Writer extends Thread {
    Buffer<Messages> buffer;

    public Writer(Buffer<Messages> m) {buffer = m;}

    public void run() {
        while(true) {
            Messages dp = buffer.get();
            dp.write();
        }
    }
}

class Buffer <E> {
    /**
     * Producer & Consumer Buffer
     */

    private int max;
    private int size = 0;
    private ArrayList<E> buffer;
    private Semaphore empty; //control consumer
    private Semaphore full; // control producer
    private Lock lock = new ReentrantLock();

    public Buffer(int s) {
        buffer = new ArrayList<E>();
        max = s;
        empty = new Semaphore(0);
        full = new Semaphore(max);
    }

    // add data to our array
    public void put(E x) {
        try {
            full.acquire();
        } catch(InterruptedException e) {}
        // sync update to buffer
        lock.lock();
        try {
            buffer.add(x);
            size++;
            empty.release();
        } finally {lock.unlock();}
    }

    public E get() {
        try {
            empty.acquire();
        } catch(InterruptedException e) {}
        // sync uodate on buffer
        lock.lock();
        try {
            E temp = buffer.get(0);
            buffer.remove(0);
            size--;
            full.release();
            return temp;
        } finally {lock.unlock();}
    }
}

final class Messages {

    private final int port;
    private final ArrayList<String> data = new ArrayList<String>();

    public Messages(int p) {port = p;}
    void add(String message) {
        data.add(message);
    }
    void write() {
        try {

            Socket socket;
            socket = new Socket(InetAddress.getLocalHost(),port);
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            // write message
            out.write(data.size());

            for(String k : data) {out.writeUTF(k);}
            out.flush();
            socket.close();
        } catch(IOException e) {e.printStackTrace();}
    }
}

客户:

class Client {

    final static int nPort = 1234;
    static int serverPort;

    public static void main(String[] args) {
        // this class and those present in it
        // will model the client for assignment 8
        Scanner in = new Scanner(System.in);

        System.out.println("Please enter the messageboard number: ");
        serverPort = in.nextInt();


        System.out.println("Please type your message: ");
        String msg = in.next();
        Listener lis = new Listener(serverPort);
        lis.start();
        boolean go = true;

        while(go) {
            try {
                Thread.sleep(2000);
            } catch(InterruptedException e) {}
            write(serverPort, msg);
            System.out.println("Continue: 0/1");
            int x = in.nextInt();
            if(x == 0)go = false; 
        }
        System.exit(0);
    }

    static void write(int port, String msg) {
        try {

            Socket socket;
            socket = new Socket(InetAddress.getLocalHost(),port);
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            // send message to port
            out.writeInt(port);
            out.writeUTF(msg);
            // write sentinal after message has been written and close socket
            out.writeInt(-1);
            out.flush();
            socket.close();
        } catch(IOException e) {System.out.println(e);}
    }
}

class Listener extends Thread {

    private int port;
    volatile boolean go;

    public Listener(int p) {p = port;}

    public void run() {

        try {
            ServerSocket serversock = new ServerSocket(port);
            while(go) {
                Socket socket = serversock.accept();
                DataInputStream in = new DataInputStream(socket.getInputStream());
                // Read the message
                while(in.available() > 0) {
                    String k = in.readUTF();
                    System.out.print(k+" ");
                }
                System.out.println();
                socket.close();
            }
        } catch(IOException e) {go = false;}
    }
}

【问题讨论】:

  • “连接被拒绝”意味着没有人在另一边监听。当您运行客户端时,您确定您的服务器已启动并在同一个端口上侦听?
  • 非常肯定,我先运行服务器,然后连接我的客户端。当我收到Connection refused 时,服务器仍在运行。就端口而言,我再次确定它们在同一个端口上。

标签: java multithreading concurrency client-server


【解决方案1】:

原来我在 Listener 课上的作业有误。我有p = port 而不是port = p

解决了。由于我自己的愚蠢。

【讨论】:

  • 我强烈建议您现在养成使用与实例变量名称相同的参数名称并写this.port = port;的习惯,这样您就再也不会遇到这个问题了。
  • 如果您用解决方案回答了自己的问题,您应该在将来为其他人取消超时后接受它! :)
  • 我必须等两天才能做到这一点。
【解决方案2】:

您要连接的主机名是localhost,因此您假设服务器在同一台机器上。如果你需要连接到不同的机器,你需要指定你希望它连接的主机。

【讨论】:

  • 我在帖子中确实指定了服务器在同一台机器上运行,它不会满足外部客户端的需求。
  • @Zy0n Connection refused 表示服务器没有在您尝试连接的端口上侦听。
  • 问题已经解决,请参考我的回答。
【解决方案3】:

尝试改变

 socket = new Socket(InetAddress.getLocalHost(),port);
 socket = new Socket(*IP OF SERVER (127.0.0.1 如果同一台机器)*, 端口);

【讨论】:

  • 试过了,恐怕也没有运气,是的,服务器和客户端在同一台机器上。
  • 尝试使用telnet连接服务器,如果在端口上连接到服务器,则说明客户端工作不正常。如果没有,那就是服务器。您也可以尝试更改端口。
猜你喜欢
  • 1970-01-01
  • 2014-01-10
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多