java - 与套接字输入流比较时的字符串相等问题

标签 java string

编辑:

抱歉没有说清楚,我发现这个问题与枚举无关:

对于我的情况,枚举如下所示,我使用 contains 方法来检查字符串值是否属于:

    public static enum RequestMethod {
    HEAD, GET, POST;

    public static boolean contains(String test) {

        for (RequestMethod m : RequestMethod.values()) {
            System.out.println("Testing: method |"+m.name()+"|, input |"+test+"|");
            if (m.name().equals(test.trim())) {
                return true;
            }
        }
        return false;
    }
}

服务器端测试代码为:

Socket clientSock;
......

InputStream clientInput = clientSock.getInputStream()
BufferedReader inStream = new BufferedReader(new InputStreamReader(
            clientInput));

String buffer = inStream.readLine();
String[] reqLine  = buffer.split(" ");

System.out.println("test GET---");
System.out.println(Request.RequestMethod.contains("GET"));
System.out.println("test GET---");

System.out.println("test reqLine[0]---");
System.out.println(Request.RequestMethod.contains(reqLine[0]));
System.out.println("test reqLine[0]---");

System.out.println("reqLine[0] equals GET? " + reqLine[0].equals("GET"));

当客户端通过套接字向服务器发送“GET/index.html HTTP/1.0”时,输出为:

Client send: GET /index.html HTTP/1.0
test GET---
Testing: method |HEAD|, input |GET|
Testing: method |GET|, input |GET|
true
test GET---

test reqLine[0]---
Testing: method |HEAD|, input |GET|
Testing: method |GET|, input |GET|
Testing: method |POST|, input |GET|
false
test reqLine[0]---

reqLine[0] equals GET? false

reqLine[0] 打印为“GET”,但它们被认为不相等,这会导致问题。

于是我去检查客户端(提供给我的)是如何将数据放入socket的,我发现:

Socket sock;
......
DataOutputStream outStream = new DataOutputStream(sock.getOutputStream());
outStream.writeChars(buffer); // this line causes issue
outStream.writeChar('\n');
outStream.flush();

当我将 writeChars 更改为 writeBytes 时,服务器端的字符串 equals 按预期工作。

test GET---
Testing: method |HEAD|, input |GET|
Testing: method |GET|, input |GET|
true
test GET---

test reqLine[0]---
Testing: method |HEAD|, input |GET|
Testing: method |GET|, input |GET|
true
test reqLine[0]---

GET equals reqLine[0]? true

当我脑子一片模糊时,我不应该发布这个问题。

那么我想我的问题应该改为:为什么writeCharswriteBytes发送的字符串打印结果相同但不相等?

是不是因为writeChar(writeChars)将每个char写成2个字节?

writeChar

public final void writeChar(int v) throws IOException

Writes a char to the underlying output stream as a 2-byte value, high byte first. If no exception is thrown, the counter written is incremented by 2.

最佳答案

上面的代码没有问题。我定义了自己的 ENUM 选择。

public enum Choice {
GOOD, BAD, UGLY}

然后用

测试了上面的方法
contains("BAD") -> This returned true.
contains("BAD1") -> This returned false

关于java - 与套接字输入流比较时的字符串相等问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35667170/

相关文章:

python - 如何使用 python-magic 通过 Internet 获取文件的文件类型?

r - 如何生成所有可能的unicode字符?

php - 如何用不会更新的新字母替换字符串中的字母

c++ - 当 malloc() 相同的结构时,如何在结构中使用 C++ 字符串?

c++ 不存在从 "std::string"到 "const char*"的合适的转换函数

java - Android AsyncTask 下载多张图片

java - mapred.Mapper 与 mapreduce.Mapper

java-joda 日期时间类(当前系统时间)?

java - GAE : How is it possible to access data/files that are stored in the GAE Blobstore by an external Web Service that is not deployed on GAE using Java

java - 洗牌——数组还是堆栈?