gpt4 book ai didi

java - 为什么这个套接字为空?

转载 作者:行者123 更新时间:2023-11-29 07:58:22 24 4
gpt4 key购买 nike

我正在创建一个多客户端聊天服务器,我非常有信心它会工作(如果我错了请纠正我),我有一个问题,即客户端连接到的套接字为空,因此连接可以'不会被创建,因为我使用 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 block 。在该 block 中,我们打印一条消息,表明服务器正在尝试连接到端口 1337。然后我们创建一个名为 serversocket 的新 ServerSocket。然后我们向控制台发送一条消息,说我们已经绑定(bind)到端口并且我们正在等待连接。当为真时,我们创建一个新的 Socket 套接字等于 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"));
}


}

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

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

最佳答案

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

改变

Socket Socket;

Socket connectedSocket;

在你的构造函数中

socket = Socket;

connectedSocket = socket;

然后最后,在您的 run() 方法中更改

if(Socket != null)

if(connectedSocket != null)

关于java - 为什么这个套接字为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16115836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com