2013-07-03 203 views
9

如何使用getOutputStream方法發送字符串。它只能像他們提到的那樣發送字節。到目前爲止,我可以發送一個字節。但不是字符串值。通過Java中的套接字發送字符串而不是字節

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

} 

在此先感謝

+0

要發送一個字符串,您必須首先使用某種編碼方案將其轉換爲字節。現在UTF-8是事實上的標準。 –

回答

8

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

請注意,您在此使用的是默認編碼,而不是明確編碼,這很危險 –

+1

PrintWriter幾乎總是一個壞主意IMO。它吞噬異常的方式非常可怕。 –

+0

@JonSkeet是的,我真的不喜歡我自己提出的解決方案。讓我們看看它是否適用於用戶。考慮更好的解決方案。 –

3

兩個選項:

一個字符串,以字節爲單位總結

請注意,在這兩種情況下,你應明確指定編碼,例如「UTF-8」 - 避免使用平臺默認編碼(這幾乎總是一個壞主意)。

這隻會發送字符數據本身 - 如果您需要發送多個字符串,而另一端需要知道每個字符的起始和結束位置,則需要更復雜的協議。如果兩端都是Java,則可以使用DataInputStreamDataOutputStream;否則你可能想要拿出你自己的協議(假設它已經不是固定的)。

+0

THANKYOU非常多 – Ravindu

+0

呃....我對這個套接字及其輸入/輸出流感到迷惑。接收部分怎麼樣?我的意思是我們如何區分數據傳輸是否僅僅是一個字符串/文件? @JonSkeet – gumuruh

+0

@gumuruh:這聽起來像是一個完全不同的問題。這個問題只是關於發送一個字符串的問題 - 關於發送文件沒有任何內容。這聽起來像你應該做更多的研究,然後問一個新的問題,如果你仍然困惑。 –

3

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

socket.getOutputStream().write("your string".getBytes("US-ASCII")); // or UTF-8 or any other applicable encoding... 
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()方法從接收方。

注意:您必須在「最後」caluse中檢查null;否則你稍後會遇到NullPointerException。

+0

請注意,utf編碼不是標準編碼,是一個修改過的編碼。 –

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"); 

或者,你可以找到在

java.io包的詳細Writer S和OutputStream小號

12

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

} 
+6

因爲stackoverflow的可怕的6個字符的編輯量政策,我必須在這裏評論'UTF-8'應該是「UTF-8」。請記住,單引號是用於字符,而雙引號用於字符串。 – Richard

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

} 
1

我在這篇文章中看到了一堆非常有效的解決方案。我最喜歡的是使用Apache下議院做寫操作:

IOUtils.write(CharSequence, OutputStream, Charset)

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

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

相關問題