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