gpt4 book ai didi

java.lang.NullPointerException 和 java.net.SocketException

转载 作者:行者123 更新时间:2023-11-30 11:27:53 28 4
gpt4 key购买 nike

我正在尝试用 Java 编写套接字程序。此处客户端发送一个字符串,该字符串应由服务器反转并发送回客户端。服务器是多线程服务器。这是客户端代码:

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

class ClientSystem
{
public static void main(String[] args)
{
String hostname = "127.0.0.1";
int port = 1234;

Socket clientsocket = null;
DataOutputStream output =null;
BufferedReader input = null;

try
{
clientsocket = new Socket(hostname,port);
output = new DataOutputStream(clientsocket.getOutputStream());
input = new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
}
catch(Exception e)
{
System.out.println("Error occured"+e);
}

try
{
while(true)
{
System.out.println("Enter input string ('exit' to terminate connection): ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputstring = br.readLine();
output.writeBytes(inputstring+"\n");

//int n = Integer.parseInt(inputstring);
if(inputstring.equals("exit"))
break;

String response = input.readLine();
System.out.println("Reversed string is: "+response);

output.close();
input.close();
clientsocket.close();
}
}
catch(Exception e)
{
System.out.println("Error occured."+e);
}
}
}

服务器端代码如下:

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

public class ServerSystem
{
ServerSocket server = null;
Socket clientsocket = null;
int numOfConnections = 0, port;

public ServerSystem(int port)
{
this.port = port;
}

public static void main(String[] args)
{
int port = 1234;
ServerSystem ss = new ServerSystem(port);
ss.startServer();
}

public void startServer()
{
try
{
server = new ServerSocket(port);
}
catch(Exception e)
{
System.out.println("Error occured."+e);
}

System.out.println("Server has started. Ready to accept connections.");

while(true)
{
try
{
clientsocket = server.accept();
numOfConnections++;
ServerConnection sc = new ServerConnection(clientsocket, numOfConnections, this);
new Thread(sc).start();
}
catch(Exception e)
{
System.out.println("Error occured."+e);
}
}
}

public void stopServer()
{
System.out.println("Terminating connection");
System.exit(0);
}
}

class ServerConnection extends Thread
{
BufferedReader br;
PrintStream ps;
Socket clientsocket;
int id;
ServerSystem ss;

public ServerConnection(Socket clientsocket, int numOfConnections, ServerSystem ss)
{
this.clientsocket = clientsocket;
id = numOfConnections;
this.ss = ss;

System.out.println("Connection "+id+" established with "+clientsocket);
try
{
br = new BufferedReader(new InputStreamReader(clientsocket.getInputStream()));
ps = new PrintStream(clientsocket.getOutputStream());
}
catch(Exception e)
{
System.out.println("Error occured."+e);
}
}

public void run()
{
String line, reversedstring = "";

try
{
boolean stopserver = false;
while(true)
{
line = br.readLine();
System.out.println("Received string: "+line+" from connection "+id);
//long n = Long.parseLong(line.trim());

if(line.equals("exit"))
{
stopserver = true;
break;
}
else
{
int len = line.length();
for (int i=len-1; i>=0; i--)
reversedstring = reversedstring + line.charAt(i);
ps.println(""+reversedstring);
}
}
System.out.println("Connection "+id+" is closed.");
br.close();
ps.close();
clientsocket.close();

if(stopserver)
ss.stopServer();
}
catch(Exception e)
{
System.out.println("Error occured."+e);
}
}
}

当我输入字符串时,服务器端代码出现 java.lang.NullPointerException,当我尝试重新输入字符串时,出现 java.net.SocketException: Socket closed 异常。

客户端输出:

Enter input string ('exit' to terminate connection): 
usa
Reversed string is: asu
Enter input string ('exit' to terminate connection):
usa
Error occured.java.net.SocketException: Socket closed

服务器端输出:

Server has started. Ready to accept connections.
Connection 1 established with Socket[addr=/127.0.0.1,port=3272,localport=1234]
Received string: usa from connection 1
Received string: null from connection 1
Error occured.java.lang.NullPointerException

我尝试了很多,但我不知道从哪里得到这些异常。

最佳答案

这 3 行是 client 代码中的罪魁祸首:

output.close();
input.close();
clientsocket.close();

将它们放在 while 循环之外,并放在 finally block 中:

try {
while(true) {
// client code here
}
} catch (Exception e) {
e.printStackTrace(); // notice this line. Will save you a lot of time!
} finally {
output.close(); //close resources here!
input.close();
clientsocket.close();
}

问题是,正如最初那样,您关闭了所有资源,但在下一次迭代中,您想要再次使用它们,而不是初始化它们...

旁注

正确处理异常,包括正确记录它们。始终使用像 log4j

这样的日志记录框架
LOG.error("Unexpected error when deionizing the flux capacitor",e);

,或 printStackTrace() 方法

e.printStackTrace();

如果您发布堆栈跟踪,请不要忘记在您的代码中包含行号....

编辑

对于相反的问题:

else
{
int len = line.length();

reversedString=""; //this line erases the previous content of the reversed string

for (int i=len-1; i>=0; i--) { //always use brackets!!!
reversedstring = reversedstring + line.charAt(i);
}
ps.println(""+reversedstring);
}

发生了什么事? reversedString 随着每次迭代不断增长,而没有被删除...这就是为什么我喜欢在我需要的最严格的范围内声明我的变量。

编辑

要使 exit 命令不会杀死服务器,这可以是一个(非常简单的)解决方案:

在 ServerConnection 类中:

while(true)
{
line = br.readLine();
System.out.println("Received string: "+line+" from connection "+id);

if(line.equals("exit"))
{
break; //just stop this connection, don't kill server
}
else if(line.equals("stop"))
{
stopserver = true; //stop server too
break;
}
else
{
int len = line.length();
for (int i=len-1; i>=0; i--) {
reversedstring = reversedstring + line.charAt(i);
}
ps.println(""+reversedstring);
}
}

这里发生了什么?有一个新的“命令”stop,它使服务器停止,exit只是退出客户端,但不会停止服务器本身...

关于java.lang.NullPointerException 和 java.net.SocketException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19124905/

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