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

提前致谢

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

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

两种选择:

  • OutputStream包装在OutputStream中,以便随后发送字符串
  • 使用String.getBytes(encoding)将字符串转换为字节

请注意,在这两种情况下,您都应该明确指定编码,例如“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); 

你可能想指定charset,例如"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")并捕获相应的exception。 如果您正在尝试构建某种协议,可以查看Apache commons-net库以获取一些提示。

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

旧post,但我可以在大多数post中看到相同的缺陷。 在关闭套接字之前,请刷新流。 就像@ 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(); } }