Java – Why do two equal strings not match?

Why do two equal strings not match?… here is a solution to the problem.

Why do two equal strings not match?

I want to compare the response from the server with a string, but I get the wrong result when testing these two strings. Why?

I found this but it didn’t help: How do I compare strings in Java?

I tried two ways:

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
String code;
if(Objects.equals((code = in.readLine()), "S")) { //Input string: "S"
    //code
}

BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
String code;
if((code = in.readLine()).equals("S")) { //Input string: "S"
    //code
}

The code will not run in either case because the value of the test is false.

Complete code

Server-side – C# (Windows)

class ManagePhoneClients
    {
        public void managePhoneClients(object obj)
        {
            Boolean socketalive = true;
            TcpClient tcpClient = (TcpClient)obj;
            StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
            StreamWriter sw = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);
            Boolean isPhoneClientConnected = false;
            String user;
            String answer;
            String tl;
            List<string> LC = new List<string>();
            Boolean qss = false;
            Program program = new Program();
            Int32 points = 0;

            ConsoleMethods.writeLine("Thread started for the phone client.", "Info", ConsoleColor.Cyan);

            sw.WriteLine("S");
            sw.Flush();

            while (socketalive == true)
            {
                try
                {
                    if (Program.isMainClientConnected != true || Program.isPowerPointConnected != true)
                    {
                        ConsoleMethods.writeLine("Connection refused because the necessary clients are not connected!", "Error", ConsoleColor.Red);
                        sw.WriteLine("NS");
                        sw.Flush();
                        tcpClient.Close();
                        socketalive = false;
                    }
                    else
                    {
                        sw.WriteLine("LC");
                        sw.Flush();
                    }
                    if (isPhoneClientConnected != true & sr.Peek() != -1)
                    {
                        String rLC = sr.ReadLine();
                        LC.AddRange(rLC.Split('|'));
                        if (LC[1].ToString() == Program.passPhoneClient)
                        {
                            user = LC[0];
                            Program.userNames.Add(user);
                            ConsoleMethods.writeLine("Phone connected from: " + tcpClient.Client.RemoteEndPoint, "Info", ConsoleColor.Cyan);
                            sw.WriteLine("S");
                            sw.Flush();
                            Program.utnr = rLC;
                            isPhoneClientConnected = true;
                        }
                        else
                        {
                            sw.WriteLine("NS");
                            sw.Flush();
                            socketalive = false;
                            ConsoleMethods.writeLine("Phone client disconnected because the password was invalid!", "Error", ConsoleColor.Red);
                        }

                    }
                    switch (sr.ReadLine())
                    {
                        case "CLIENT-EXCEPTION":
                            ConsoleMethods.writeLine("Exception in phone client from: " + tcpClient.Client.RemoteEndPoint + "\n" + sr.ReadLine(), "Client-Error", ConsoleColor.DarkRed);
                            break;
                        case "RECEIVED_POINTS":
                            int point = int.Parse(sr.ReadLine());
                            points += point;
                            ConsoleMethods.writeLine("Phone client succesfully completed a task from: " + tcpClient.Client.RemoteEndPoint + " Point: " + point, "Client-Received Points", ConsoleColor.DarkRed);
                            ConsoleMethods.writeLine("Phone client collected points from: " + tcpClient.Client.RemoteEndPoint + " Points: " + points, "Client-Collected Points", ConsoleColor.DarkRed);
                            break;
                    }

                }
                catch (Exception e)
                {
                    tcpClient.Close();
                    socketalive = false;
                    ConsoleMethods.writeLine(e.Message + e.StackTrace + e.StackTrace, "Error", ConsoleColor.Red);
                }
            }
        }
    }

(This is not done yet!)

Client – Java (Android)

   public void login(View v) {
        final Context context = this;
        new Thread(new Runnable() {
            public void run() {
                try {
                    final Socket socket = new Socket("192.168.0.104", 90);
                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
                    PrintWriter out = new PrintWriter(socket.getOutputStream());
                    out.print("P" + "\r\n");
                    out.flush();
                    String code;
                    code = in.readLine();
                    if(code.equals("S")) {
                        if (Objects.equals((code = in.readLine()), "LC")) {
                            out.print(((EditText)findViewById(R.id.username)).getText().toString() + "|" + ((EditText)findViewById(R.id.password)).getText().toString() + "\r\n");
                            out.flush();
                            if(Objects.equals((code = in.readLine()), "S")) {
                                new ServerContact(context).Listener(socket);
                                startActivity(new Intent(Login.this, Waiting.class));
                            } else {
                                throw new Exception("Login failed because the server refused the login request. Server responded with status code: '" + code + "'.");
                            }
                        } else {
                            throw new Exception("Login failed because the server refused the login request. Server responded with status code: '" + code + "'.");
                        }
                    } else {
                        throw new Exception("Login failed because the server refused the login request. Server responded with status code: '" + code + "'.");
                    }
                } catch (Exception e) {
                    new ExceptionWriter(e);
                }
            }
        }).start();
    }

(This is not done yet!)

Best Solution

I managed to solve it. On the server side, I have to disable the BOM.

No BOM:

StreamWriter sw = new StreamWriter(tcpClient.GetStream(), new UTF8Encoding(false));

There is a BOM:

StreamWriter sw = new StreamWriter(tcpClient.GetStream(), Encoding.UTF8);

Related Problems and Solutions