java - 为多个客户端打开多个服务器套接字端口

标签 java sockets

我正在尝试在服务器套接字上打开多个端口,以便我可以连接多个客户端。每次我创建一个线程并启动它(我知道将调用覆盖的运行方法)我打开一个端口并监听一个客户端。

但问题是,当我运行客户端套接字项目并尝试连接到我在服务器中打开的端口时,它显示 java.net.connectException : connection refused:connect。 我还注意到发生了一件奇怪的事情。每次运行“服务器代码”时,控制台窗口中的输出都不同

过去 3 天我一直在研究这个问题,但我想我一无所获。

注意:这个问题对我来说是独一无二的,因为我在这个论坛的任何地方都没有发现这个特殊问题所以请善待,因为我是 java 和套接字编程的新手,虽然我已经在 c++ 上编码了一段时间了.

服务器套接字

import java.io.*;
import java.net.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.*;
public class TryThreads extends Thread
{
    private int Portnumber;
    private static String inputLine;
    public TryThreads(int portNumber)
    {
        Portnumber = portNumber;
        setDaemon(true);
    }
    public static void main(String[] args)
    {
        //create three threads
        Thread first = new TryThreads(63400);
        Thread second = new TryThreads(63401);


        first.start();
        second.start();
        //third.start();

        System.out.println("ending main");
        return;
    }
    public void run()
    {

        try
        {
            System.out.println("one socket port opened");
            ServerSocket serverSocket = new ServerSocket(Portnumber);
            System.out.println("one socket port opened");
            while (true)
            {
                System.out.println("ending main2");
                //System.out.println("one socket port opened");
                Socket clientSocket = serverSocket.accept();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                while((inputLine = bufferedReader.readLine()) != null)
                System.out.println(inputLine);
            }

        }
        catch(IOException e)
        {
            System.out.println(e);
        }
    }
}

客户端套接字

import java.io.*;
import java.net.Socket;
public class client
{
    private static PrintWriter printWriter;
    public static void main(String[] args)
    {
        BufferedReader in = null;
        try
        {
            Socket socket = new Socket("localhost",63400);
            printWriter = new PrintWriter(socket.getOutputStream(),true);
            printWriter.println("Hello Socket");
            printWriter.println("EYYYYYAAAAAAAA!!!!");
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }
}

最佳答案

在您的 TryThreads 构造函数中,使用:

setDaemon(false);

您已将服务器线程设置为守护线程,因此它们会在 main 退出时立即终止,因此您的服务器会在您启动时立即停止。

参见 Thread.setDaemon() :

The Java Virtual Machine exits when the only threads running are all daemon threads.


顺便说一句,在纠正上述问题后,请注意您的实现将导致服务器接收到“连接重置”SocketException,这将使您的服务器线程脱离循环并阻止它接受额外的异常(exception)。您可以在退出之前通过执行 socket.close() 在客户端修复此问题以确保正常关闭,但您仍然希望在服务器端修复它,因为您不能假设客户端会乖一点。

关于java - 为多个客户端打开多个服务器套接字端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21948363/

相关文章:

java - 在Java中将列表中的元素分组到不重复的子列表中

java - 如何添加一个旋转样式的进程对话框 5 秒

sockets - Dart 将 TCP ServerSocket 客户端传递给 Isolate

sockets - 如何获得连接的客户端的IP地址?

java - 为什么来自多个套接字的输入无法正确更新 UI?

javascript - Express - socket.io - session 。将用户 ID 称为套接字 ID

Java正则表达式搜索两个文件名

java - 您是否总是需要关闭新的 PDDocument 对象?

java - 如何将 BufferedReader 的内容放入字符串中?

python - 从 zmq.error.ZMQError : Address already in use 恢复