1

我正在创建一个多客户端聊天服务器,我非常有信心它会工作(如果我错了,请纠正我),我的问题是客户端连接到的套接字上为空,因此无法创建连接因为我使用 if(Socket != null) 所以我不会出错,但我会很快解释我的布局。服务器从一个名为 (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() 开始。我们马上就有了一个 try catch 块。在该块中,我们打印一条消息,表明服务器正在尝试连接到端口 1337。然后我们创建一个名为 serversocket 的新 ServerSocket。然后我们向控制台发送一条消息,说我们已经绑定到端口并且我们正在等待连接。如果是真的,我们创建一个新的 Socket 套接字,它等于 ServerSocket.accept(); OMG 去他的。这是代码。你知道它的作用...

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"));
 }


}

阅读运行方法。在那里你会看到空问题

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

4

1 回答 1

5

问题是由于不推荐的命名约定,您遇到了逻辑错误。您不应该使用关键字命名变量,例如您的Socket变量,并且每个变量都应该有一个可区分的名称。例如不是socket1, socket2,而是serverSocket, clientSocket因为这将使您和其他任何人更容易阅读和修复您的代码。

改变

Socket Socket;

Socket connectedSocket;

在你的构造函数中

socket = Socket;

connectedSocket = socket;

然后最后,在你的run()方法改变

if(Socket != null)

if(connectedSocket != null)
于 2013-04-20T02:22:08.957 回答