尝试将字符串编码/解码为 UTF-8 后引发 Java 服务器线程空指针异常错误

标签 java string multithreading encoding utf-8

我正在尝试创建一个程序,其中客户端和服务器相互发送文本消息(以 utf-8 字符串格式),类似于两部手机相互发送文本消息的方式。最终我需要创建四行(两行用于在服务器端编码/解码 utf-8 字符串)(两行用于在客户端编码/解码 utf-8 字符串)该程序使用两个线程,一个用于客户端,一个用于服务器.

Mac 终端错误的屏幕截图(命令提示符)

enter image description here

在更改以下代码行之前没有错误:

                        String MessageFromClientEncodedUTF8 = "";
                        BufferedReader BufReader1 = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));  
                        socket = serverSocket.accept();    
                        InputStream is = socket.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        BufferedReader br = new BufferedReader(isr);
                        String MessageFromClientDecodedFromUTF8 = BufReader1.readLine();
                        System.out.println("The message is currently encoded UTF-8");
                        byte[] bytes = MessageFromClientEncodedUTF8.getBytes("UTF-8"); 
                        String MessageFromClientDecodedUTF8 = new String(bytes, "UTF-8");
                        System.out.println("Message received from client (decoded utf-8): "+ MessageFromClientDecodedUTF8);

共有三个文件:主函数文件、服务器文件、客户端文件。当主函数文件运行时,如果存在“-l”命令行参数,则运行服务器文件,否则运行客户端。

服务器文件(DirectMessengerServer.java):

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerServer
{
    private static Socket socket;
    boolean KeepRunning = true;
    void ServerRun(String[] args)
    {
        Thread Server = new Thread () 
        {
            public void run ()
            {   
                System.out.println("Server thread is now running");
                try
                {
                    System.out.println("Try block begins..");
                    int port_number1= Integer.valueOf(args[1]);
                    System.out.println("Port number is: " + port_number1);
                    ServerSocket serverSocket = new ServerSocket(port_number1);
                    //SocketAddress addr = new InetSocketAddress(address, port_number1);
                    System.out.println( "Listening for connections on port: " + ( port_number1 ) );

                    while(KeepRunning)
                    {
                        //Reading the message from the client
                        String MessageFromClientEncodedUTF8 = "";
                        BufferedReader BufReader1 = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));  
                        socket = serverSocket.accept();    
                        InputStream is = socket.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is);
                        BufferedReader br = new BufferedReader(isr);
                        String MessageFromClientDecodedFromUTF8 = BufReader1.readLine();
                        System.out.println("The message is currently encoded UTF-8");
                        byte[] bytes = MessageFromClientEncodedUTF8.getBytes("UTF-8"); 
                        String MessageFromClientDecodedUTF8 = new String(bytes, "UTF-8");
                        System.out.println("Message received from client (decoded utf-8): "+ MessageFromClientDecodedUTF8);
                        //Shut down with zero-length message
                        if(MessageFromClientDecodedFromUTF8.equals(""))
                        {
                            KeepRunning=false;
                            System.out.println("Shutting down");
                            System.exit(0);
                            socket.close();
                            serverSocket.close();
                        }
                        if(MessageFromClientDecodedFromUTF8.equals(null))
                        {
                            KeepRunning=false;
                            System.out.println("Shutting down");
                            System.exit(0);
                            socket.close();
                            serverSocket.close();
                        }
                        if(MessageFromClientDecodedFromUTF8=="")
                        {
                            KeepRunning=false;
                            System.out.println("Shutting down");
                            System.exit(0);
                            socket.close();
                            serverSocket.close();
                        }
                        if(MessageFromClientDecodedFromUTF8==null)
                        {
                            KeepRunning=false;
                            System.out.println("Shutting down");
                            System.exit(0);
                            socket.close();
                            serverSocket.close();
                        }
                        if(MessageFromClientDecodedFromUTF8=="\n")
                        {
                            KeepRunning=false;
                            System.out.println("Shutting down");
                            System.exit(0);
                            socket.close();
                            serverSocket.close();
                        }






                        //creating message to server send from standard input


                        String newmessage = "";
                        try {
                            // input the message from standard input
                            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
                            String line = "";

                            System.out.println( "Standard input (press enter then control D when finished): " );

                            while( (line= input.readLine()) != null && KeepRunning==true )      
                            {
                                newmessage += line + " \n ";
                            }
                            }
                        catch ( Exception e ) {
                            System.out.println( e.getMessage() );
                        }
                        //Writing return message back to client
                        String returnMessage = newmessage;
                        OutputStream os = socket.getOutputStream();
                        OutputStreamWriter osw = new OutputStreamWriter(os);
                        BufferedWriter bw = new BufferedWriter(osw);
                        bw.write(returnMessage + "\n");
                        System.out.println("Message sent to client: "+returnMessage);
                        bw.flush();




                    }
                }
                catch ( Exception e )
                {
                    e.printStackTrace();

                }  
                finally
                {
                    //Closing the socket
                    try
                    {
                        socket.close();


                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                }

            }

        };
        Server.start();
    }
}

客户端文件(DirectMessengerClient.java):

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class DirectMessengerClient
{
    boolean KeepRunning = true;
    private static Socket socket;
    //static String[] arguments;
    //public static void main(String[] args)
    //{
    //  arguments = args;
    //}
    public DirectMessengerClient()
    {

        //System.out.println("test.");

    }
    public void ClientRun(String[] args)
    {
        Thread Client = new Thread ()
        {
          public void run()
          {   
                System.out.println("Client thread is now running");

                    try
                    {
                            System.out.println("Try block begins..");
                            String port_number1= args[0];
                            System.out.println("Port number is: " + port_number1);
                            int port = Integer.valueOf(port_number1);
                            System.out.println("Listening for connections..");
                            System.out.println( "Listening on port: " + port_number1 );

                            while(KeepRunning)
                            {
                                String host = "localhost";
                                InetAddress address = InetAddress.getByName(host);
                                socket = new Socket(address, port);


                                //Send the message to the server
                                OutputStream os = socket.getOutputStream();
                                OutputStreamWriter osw = new OutputStreamWriter(os);
                                BufferedWriter bw = new BufferedWriter(osw);

                                //creating message to send from standard input
                                String newmessage = "";
                                try 
                                {
                                    // input the message from standard input
                                    BufferedReader input= new BufferedReader( 
                                    new InputStreamReader(System.in));
                                    String line = "";

                                    System.out.println( "Standard input (press enter then control D when finished): " );

                                    while( (line= input.readLine()) != null )       
                                    {
                                        newmessage += line + " ";
                                    }

                                }
                                catch ( Exception e )
                                {
                                    System.out.println( e.getMessage() );
                                }
                                String sendMessage = newmessage;
                                bw.write(sendMessage + "\n"); // <--- ADD THIS LINE
                                bw.flush();
                                System.out.println("Message sent to server: "+sendMessage);

                                //Get the return message from the server
                                InputStream is = socket.getInputStream();
                                InputStreamReader isr = new InputStreamReader(is);
                                BufferedReader br = new BufferedReader(isr);
                                String MessageFromServer = br.readLine();
                                System.out.println("Message received from server: " + MessageFromServer);
                                 if(MessageFromServer.equals(""))
                                 {
                                    KeepRunning=false;
                                    System.out.println("Shutting down");
                                    System.exit(0);
                                    socket.close();
                                 }
                                 if(MessageFromServer.equals(null))
                                 {
                                    KeepRunning=false;
                                    System.out.println("Shutting down");
                                    System.exit(0);
                                    socket.close();
                                 }
                                 if(MessageFromServer=="")
                                 {
                                    KeepRunning=false;
                                    System.out.println("Shutting down");
                                    System.exit(0);
                                    socket.close();
                                 }
                                 if(MessageFromServer==null)
                                 {
                                    KeepRunning=false;
                                    System.out.println("Shutting down");
                                    System.exit(0);
                                    socket.close();
                                 }
                                 if(MessageFromServer=="\n")
                                 {
                                    KeepRunning=false;
                                    System.out.println("Shutting down");
                                    System.exit(0);
                                    socket.close();
                                 }
                            }
                }

                catch ( Exception e )
                {
                    e.printStackTrace();
                }

                finally
                {
                    //Closing the socket
                    try
                    {
                        socket.close();
                    }
                    catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                }

          }
        };

    Client.start(); 
    }
}

主要功能文件(DirectMessengerCombined.java):

public class DirectMessengerCombined
{
    public static void main(String[] args)
    {
        DirectMessengerClient Client1 = new DirectMessengerClient();
        DirectMessengerServer Server1 = new DirectMessengerServer();
          for (int i = 0; i < args.length; i++)
          {
                if(!args[0].equals("-l"))
                {
                    Client1.ClientRun(args);
                }
                switch (args[0].charAt(0))
                {
                    case '-':
                    if(args[0].equals("-l"))
                    {   
                        Server1.ServerRun(args);
                    }

                }
           i=args.length + 20;
          } 
    }

}

我的问题是:如何更改字符串的编码或解码方式,以便将字符串发送到另一端或如何解决空指针异常错误?

最佳答案

这是因为您试图在套接字存在之前获取它的输入流:-

   BufferedReader BufReader1 = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));  
   socket = serverSocket.accept();

这两行应该相反。 :)

编辑:进一步查看您的代码,您正在创建 BufReader1 (这导致了错误),然后以完全相同的方式创建 br ,即两者都是套接字的BufferedReader。你只需要一个;有两个可能会给读者带来问题。

关于尝试将字符串编码/解码为 UTF-8 后引发 Java 服务器线程空指针异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43327679/

相关文章:

c++ - Windows 线程 : _beginthread vs _beginthreadex vs CreateThread C++

java - Java 中的 Kotlin 结果类型

java - 搜索字符串只打印出没有附加字符的搜索

ruby - 将字符串分割成 block (不同大小)而不破坏单词

java - Java线程中的消息对话

java - ScheduledThreadPoolExecutor.remove : Is it safe to use

java - 在 Spring Data Rest 中自定义 alps 生成

java - Dozer:将单个字段映射到 Set

java - 日历月份实例减少了一位

arrays - awk 相当于 C 中的 LTRIM 函数