15

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

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();
    }

}

提前致谢

4

8 回答 8

16

如何使用 PrintWriter:

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

String toSend = "String to send";

out.print(toSend );

编辑:找到我自己的答案并看到讨论了改进但被遗漏了。这是使用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(); 
于 2013-07-03T06:08:59.010 回答
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();
    }

}
于 2013-07-03T06:16:27.187 回答
5

两种选择:

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

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

于 2013-07-03T06:07:13.133 回答
4

如果你有一个简单的字符串,你可以做

socket.getOutputStream().write("your string".getBytes("US-ASCII")); // or UTF-8 or any other applicable encoding...
于 2013-07-03T06:08:35.137 回答
3

你可以OutputStreamWriter这样使用:

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream());
out.write("SomeString", 0, "SomeString".length);

您可能要指定字符集,例如"UTF-8" "UTF-16"......

OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream(),
        "UTF-8");
out.write("SomeString", 0, "SomeString".length);

或者PrintStream

PrintStream out = new PrintStream(socket.getOutputStream());
out.println("SomeString");

或者DataOutputStream

DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.writeBytes("SomeString");
out.writeChars("SomeString");
out.writeUTF("SomeString");

Writer或者你可以OutputStream

java.io包_

于 2013-07-03T06:14:49.870 回答
1
public void sendToPort() throws IOException {
    DataOutputStream dataOutputStream = null;
    Socket socket = null;
    try {
        socket = new Socket("ip address", 4014);
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        dataOutputStream.writeUTF("2"); // have to insert the string
    } catch (UnknownHostException e) {
        System.err.print(e);
    } finally {
        if(socket != null) {
            socket.close();
        }
        if(dataOutputStream != null) {
            dataOutputStream.close();
        }
    }
}

注意:您需要从接收端使用 DataInputStream readUTF() 方法。

注意:您必须在“finally”中检查 null;否则你稍后会遇到 NullPointerException。

于 2013-07-03T06:09:53.670 回答
1

我在这篇文章中看到了一堆非常有效的解决方案。我最喜欢的是使用 Apache Commons 来做写操作:

IOUtils.write(CharSequence, OutputStream, Charset)

基本上做例如: IOUtils.write("Your String", socket.getOutputStream(), "UTF-8") 并捕获适当的异常。如果您正在尝试构建某种协议,您可以查看 Apache commons-net 库以获取一些提示。

你永远不会出错。Apache commons-io 中还有许多其他有用的方法和类可以节省您的时间。

于 2016-01-11T22:33:44.937 回答
0

旧帖子,但我可以在大多数帖子中看到相同的缺陷。在关闭套接字之前,刷新流。就像@Josnidhin 的回答一样:

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());
        osw.flush();
    } catch (IOException e) {
        System.err.print(e);
    } finally {
        socket.close();
    }

}
于 2014-03-08T12:23:22.340 回答