簡體   English   中英

在Java中通過套接字發送字符串而不是字節

[英]Send a string instead of byte through socket in Java

如何使用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();
    }

}

提前致謝

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

}

如何使用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(); 

兩種選擇:

請注意,在這兩種情況下,您都應明確指定編碼,例如“UTF-8” - 這樣可以避免使用平台默認編碼(這幾乎總是一個壞主意)。

這只會發送字符數據本身 - 如果你需要發送幾個字符串,另一端需要知道每個字符串的開始和結束位置,你需要一個更復雜的協議。 如果它是兩端的Java,你可以使用DataInputStreamDataOutputStream ; 否則你可能想要提出自己的協議(假設它已經沒有修復)。

如果你有一個簡單的字符串,你可以做

socket.getOutputStream().write("your string".getBytes("US-ASCII")); // or UTF-8 or any other applicable encoding...

您可以像這樣使用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");

或者你可以找到更多的WriterOutputStream

java.io

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”caluse中檢查null; 否則你將在以后遇到NullPointerException。

我在這篇文章中看到了一堆非常有效的解決方案。 我最喜歡使用Apache Commons來執行寫操作:

IOUtils.write(CharSequence,OutputStream,Charset)

基本上做的例如: IOUtils.write("Your String", socket.getOutputStream(), "UTF-8")並捕獲相應的異常。 如果您正在嘗試構建某種協議,可以查看Apache commons-net庫以獲取一些提示。

你永遠不會出錯。 Apache commons-io中還有許多其他有用的方法和類可以節省您的時間。

舊帖子,但我可以在大多數帖子中看到相同的缺陷。 在關閉套接字之前,請刷新流。 就像在@ 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();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM