【问题标题】:Connect To a Socket Multiple Times多次连接到一个套接字
【发布时间】:2012-12-16 09:25:49
【问题描述】:

好的,所以当我第一次连接时,一切正常。但是当我再次连接时(不停止服务器程序)它说“连接被拒绝:连接”。我以为是因为我只接受一次连接,所以我使用摇摆计时器每 10 毫秒触发一次动作事件,每次动作事件触发时,它都会将 clientSocket 设置为 serverSocket.accept() (clientSocket = serverSocket.accept( );) 所以这里是代码:

package org.code;

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

public class MainClass {
    public static void main(String[] args) {
            new MainClass();
    }


    Socket server = null;
    PrintWriter out = null;

    public MainClass() {
            try {
                    server = new Socket("192.168.0.104", 4444);
                    out = new PrintWriter(server.getOutputStream(), true);

                    out.println("start");

                    out.close();
                    server.close();
            } catch(Exception ex) {ex.printStackTrace();}
    }
}

还有:

package org.code;

import java.io.*;
import java.net.*;
import javax.swing.*;

public class MainClass {
    public static void main(String[] args) {
            new MainClass();
    }

    ServerSocket serverSocket = null;

    Socket clientSocket = null;

    BufferedReader in;

    public MainClass() {
            JFrame frame = new JFrame("Minecraft Server Manager v0.1 Server");
            frame.setSize(500,500);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);

            try {
                    serverSocket = new ServerSocket(4444);

                    clientSocket = serverSocket.accept();

                    in = new BufferedReader(new            InputStreamReader(clientSocket.getInputStream()));

                    String inputLine;

                    while((inputLine = in.readLine()) != null) {
                            System.out.println(inputLine);
                            if(inputLine.equals("start")) {
                                    System.out.println("Good");
                            }
                            if(inputLine.equals("stop")) {
                                    System.out.println("Bad");
                            }
                    }

                    clientSocket.close();
                    serverSocket.close();
            } catch(Exception ex) {System.err.println("Error: " + ex.getMessage());}
    }
}

【问题讨论】:

  • 这里的问题到底是什么?

标签: java sockets serversocket reconnect


【解决方案1】:

您的代码会在每次请求后关闭 ServerSocket(并且也会停止)。

这更有可能奏效。 (我没有测试过,但是有了这个你就得到了场景)

// in your main 
serverSocket = new ServerSocket(4444);

try {
    while (true) { 
        clientSocket = serverSocket.accept();

        Thread t = new ClientSocketThread(clientSocket);
        t.start();
    }
} finally {
    serverSocket.close();
}


class ClientSocketThread extends Thread {
    final Socket clientSocket;

    ClientSocketThread(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    public void run() {
        InputStream in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        try
            String inputLine;

            while((inputLine = in.readLine()) != null) {
                System.out.println(inputLine);
                if(inputLine.equals("start")) {
                     System.out.println("Good");
                }
                if(inputLine.equals("stop")) {
                     System.out.println("Bad");
                }
            }
         } finally {
            in.close()
            clientSocket.close();
         }
    }
}

【讨论】:

  • 谢谢!这是一个懒惰的错误,哈哈。我打算费力制作另一个程序来检查服务器是否打开,如果没有,打开它。
【解决方案2】:

是的,当前实现的问题是它只等待第一个客户端,然后服务器停止。检查Writing the Server Side of a Socket,尤其是最后一个条目“支持多个客户端”。通常支持多个客户端的模式如下:

while (true) {
    accept a connection;
    create a thread to deal with the client;
}

【讨论】:

    【解决方案3】:

    您的服务器程序(顺便说一句,与客户端程序具有完全相同的类名,这不是很明智),只接受一个连接。

    一旦它完成了与第一个客户的对话,它就结束了。您认为它仍在侦听,因为框架仍然可见,但主要方法已结束。

    如果你想接受多个连续的连接,你应该有一个循环。如果你想要多个并行连接,你应该产生线程。

    【讨论】:

      【解决方案4】:
      clientSocket.close();
      serverSocket.close();
      

      问题就在这里。此刻关闭服务器套接字是没有意义的,因为您已经完成了一个客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多