在Java中通过套接字发送字符串而不是字节

Rav*_*ndu 14 java port

如何使用getOutputStream方法发送strin.它只能发送他们提到的字节.到目前为止,我可以发送一个字节.但不是字符串值.

public void sendToPort() throws IOException {

    Socket socket = null;
    try {
        socket = new Socket("ip address", 4014);
        socket.getOutputStream().write(2); // have to insert the string
    } catch (UnknownHostException e) {
        System.err.print(e);
    } finally {
        socket.close();
    }

}
Run Code Online (Sandbox Code Playgroud)

提前致谢

Jos*_*hin 15

使用OutputStreamWriter类来实现您想要的

public void sendToPort() throws IOException {
    Socket socket = null;
    OutputStreamWriter osw;
    String str = "Hello World";
    try {
        socket = new Socket("ip address", 4014);
        osw =new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
        osw.write(str, 0, str.length());
    } catch (IOException e) {
        System.err.print(e);
    } catch (UnknownHostException e) {
        System.err.print(e);
    } finally {
        socket.close();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 因为stackoverflow 可怕的6 字符编辑量策略,我必须在这里评论'UTF-8' 应该是“UTF-8”。请记住,单引号用于字符,而双引号用于字符串。 (6认同)

Jun*_*san 11

如何使用PrintWriter:

OutputStream outstream = socket .getOutputStream(); 
PrintWriter out = new PrintWriter(outstream);

String toSend = "String to send";

out.print(toSend );
Run Code Online (Sandbox Code Playgroud)

编辑:找到我自己的答案,看到一个改进被讨论但被遗漏.这是使用OutputStreamWriter编写字符串的更好方法:

    // Use encoding of your choice
    Writer out = new BufferedWriter(new OutputStreamWriter(
        new FileOutputStream(fileDir), "UTF8"));

    // append and flush in logical chunks
    out.append(toSend).append("\n");
    out.append("appending more before flushing").append("\n");
    out.flush(); 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您在此处使用默认编码而不是显式编码,这很危险 (2认同)
  • @JunedAhsan:只需使用`OutputStreamWriter`和`write`就这么简单,允许你指定编码,并避免异常的肮脏. (2认同)

Jon*_*eet 5

两种选择:

请注意,在这两种情况下,您都应该明确指定编码,例如“UTF-8” - 避免仅使用平台默认编码(这几乎总是一个坏主意)。

这只会发送字符数据本身 - 如果您需要发送多个字符串,而另一端需要知道每个字符串的开始和结束位置,您将需要一个更复杂的协议。如果两端都是 Java,则可以使用DataInputStreamand DataOutputStream; 否则您可能想提出自己的协议(假设它尚未修复)。