Java 为什么这个套接字是空的?

Java 为什么这个套接字是空的?,java,sockets,null,connection,serversocket,Java,Sockets,Null,Connection,Serversocket,我正在创建一个多客户端聊天服务器,我很有信心它会正常工作。如果我错了,我会纠正我的错误。我的问题是,客户端连接到的套接字上为空,因此无法创建连接,因为我使用了ifSocket!=空,所以我不会出错,但我会很快解释我的布局。服务器从一个名为LaunchServer的初学者类开始,该类使用类对象ClientConnector作为Minecraft,然后启动方法runServer。以下是该类的代码: public class LaunchServer { public static void

我正在创建一个多客户端聊天服务器,我很有信心它会正常工作。如果我错了,我会纠正我的错误。我的问题是,客户端连接到的套接字上为空,因此无法创建连接,因为我使用了ifSocket!=空,所以我不会出错,但我会很快解释我的布局。服务器从一个名为LaunchServer的初学者类开始,该类使用类对象ClientConnector作为Minecraft,然后启动方法runServer。以下是该类的代码:

public class LaunchServer
{
    public static void main(String[] args)
    {
        System.out.println("[Info] Running");
        ClientConnector Minecraft = new ClientConnector();
        Minecraft.runServer();
    }
}
这相当简单。这就引出了ClientConnector类。这里我们从runServer方法开始。我们马上就有一个试抓拦网。在该块中,我们打印一条消息,表明服务器正试图连接到端口1337。然后,我们创建一个名为ServerSocket的新ServerSocket。然后,我们向控制台发送一条消息,说明我们已绑定到端口,正在等待连接。如果为true,则创建一个新套接字,该套接字等于ServerSocket.accept;天哪,去他妈的。这是密码。你知道它是干什么的

import java.util.ArrayList;
import java.net.*;
import java.io.*;

public class ClientConnector
{

public static ArrayList<Socket> Connections = new ArrayList<Socket>();

public static void runServer()
{
    try
    {   
        System.out.println("[Info] Attempting to bind to port 1337.");
        @SuppressWarnings("resource")
        ServerSocket serversocket = new ServerSocket(1337);
        System.out.println("[Info] Bound to port 1337.");
        System.out.println("[Info] Waiting for client connections...");
        while(true)
        {
            Socket socket = serversocket.accept();
            new ClientHandler(socket).start();
            Connections.add(socket);
        }

    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}
}
这将带我们进入处理程序类:

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


public class ClientHandler extends Thread
{
Socket Socket;

public ClientHandler(Socket socket)
{
    socket = Socket;
    System.out.println("[Info] Client connected on port 1337.");
}

public void run()
{
    while(true)
    {
        for(int i = 0; i < ClientConnector.Connections.size(); i++)
        {

            try
            {
                if(Socket != null)//This stays null...
                {
                    ObjectOutputStream Output = new //These can't be created... 
                    ObjectOutputStream(Socket.getOutputStream());
                    ObjectInputStream Input = new ObjectInputStream(Socket.getInputStream());
                    whileChatting(Input, Output);
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
}

public static void sendMessage(String message, String returnedMessage, ObjectOutputStream out)
{
    try
    {

        if(!message.isEmpty())
        {
            out.writeObject("\247c[Server]\247d " + message);
            out.flush();
            System.out.println("[Chat] Sent: " + message);
        }
        else
        {
            out.writeObject(returnedMessage);
            System.out.println("[Chat] Sent: " + returnedMessage);
        }
        out.flush();
        System.out.println("[Info] Fluching remaining data to stream.");
        System.out.println("\n[Server] " + message);
    }
    catch(IOException ioException)
    {
        System.out.println("[Warning] Error: ioException @ sendMessage line 76.");
    }
 }

public static void whileChatting(ObjectInputStream input, ObjectOutputStream output) throws IOException
{
    String message = "";
    do
     {
         try
         {
             message = (String) input.readObject();
             System.out.println("\n" + message);
             sendMessage("", message, output); 
         }
         catch(ClassNotFoundException classNotFoundException)
         {
             System.out.println("[Warning] Error: ClassNotFoundException @ whileChatting line 1-7.");
             System.out.println("\n idk wtf that user sent!");
         }
     }while(!message.equals("/stop"));
 }


}
阅读run方法。在这里,您将看到null问题


连接会被接受然后传递给hander类吗?如何接受空连接?我的问题是如何解决此问题?

问题是由于未推荐的命名约定,您出现了逻辑错误。您不应该像套接字变量那样用关键字命名变量,每个变量都应该有一个可区分的名称。e、 不是socket1、socket2而是serverSocket、clientSocket,因为这将使您和其他人更容易阅读和修复您的代码

改变

Socket Socket;

在你的构造器中

socket = Socket;

最后,在运行方法中进行更改

if(Socket != null)


问题是,由于未推荐的命名约定,您出现了一个逻辑错误。您不应该像套接字变量那样用关键字命名变量,每个变量都应该有一个可区分的名称。e、 不是socket1、socket2而是serverSocket、clientSocket,因为这将使您和其他人更容易阅读和修复您的代码

改变

Socket Socket;

在你的构造器中

socket = Socket;

最后,在运行方法中进行更改

if(Socket != null)


ClientHandler类中的变量名有一个输入错误-您编写了Socket Socket,这是所有错误的原因。看看构造函数,你把变量名搞乱了ClientHandler类中的变量名有一个输入错误-你写了Socket Socket,这是所有错误的原因。看看构造器,你已经把变量名+1搞得一团糟了——这是另一个有人忽视Java风格约定而被咬的例子。这里有一个教训…实际上,成员变量应命名为socket,构造函数代码应为this.socket=socket。这不是服务器套接字。@EJP:说得好,我会解决的。虽然我给它起的名字不仅仅是插座,我希望能帮助区分他的名字。像connectedSocket这样的东西可能更适合+1,这是另一个忽略Java风格约定而被咬的例子。这里有一个教训…实际上,成员变量应命名为socket,构造函数代码应为this.socket=socket。这不是服务器套接字。@EJP:说得好,我会解决的。虽然我给它起的名字不仅仅是插座,我希望能帮助区分他的名字。不过,像connectedSocket这样的东西更合适