【问题标题】:open multiple server socket ports for multiple clients为多个客户端打开多个服务器套接字端口
【发布时间】:2014-02-22 01:21:58
【问题描述】:

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

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

过去 3 天我一直在做这件事,但我猜我什么也没取得。

注意:这个问题对我来说是独一无二的,因为我在这个论坛上的任何地方都没有发现这个特殊问题,所以请善待我,因为我是 java 和 socket 编程的新手,尽管我已经在 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);
        }
    }
}

【问题讨论】:

  • 很抱歉,这个问题很明显,但是您是否确认单独打开两个端口时它们都可以工作?
  • 您确实意识到您不需要“多个端口”来处理多个客户端,是吗?
  • 当我只有一个端口和一个客户端没有使用线程时端口确实打开了,在我使用线程后,它进入运行块但不进入运行块的while块
  • 我不知道你在上一条评论中想说什么,但基本上......你是怎么做的不是你写服务器的方式。你只使用一个端口。
  • 这不是我现在的动力,是的,我不知道一个端口可以处理多个客户端,我当然想了解这一点。

标签: java sockets


【解决方案1】:

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

setDaemon(false);

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

Thread.setDaemon():

当唯一运行的线程都是守护线程时,Java 虚拟机退出。


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

【讨论】:

  • 哈,错过了。不错的收获。
  • 我的问题已经解决了,但部分是:P。端口已经打开,客户端将其消息发送到服务器,正确地说,连接已重置。
  • 但我仍然不明白为什么线程不应该设置为守护线程,我完全不明白你答案的最后一部分
  • @user3085866 我回答的最后一部分试图防止您最终看到的确切“连接重置”问题。在客户端,在程序结束前执行socket.close()。在服务器中,修复您的循环,使其在收到 SocketException 时不会退出。
  • @user3085866 守护线程是可以工作但您不介意在主线程退出时停止的线程。非守护线程适用于您不想在主线程退出时停止的线程,例如您的服务器线程(您希望它们在main 返回后继续运行,因此它们不应该成为守护进程)。查看stackoverflow.com/questions/2213340/… 以获得更好的解释。
【解决方案2】:

通常,当您想使用 PrintWriter 编写消息时,您需要在完成后刷新它 (printwriter.flush())。这样可以确保发送消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2017-02-25
    相关资源
    最近更新 更多