在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,你可以使用DataInputStream
和DataOutputStream
; 否则你可能想要提出自己的协议(假设它已经没有修复)。
如果你有一个简单的字符串,你可以做
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");
或者你可以找到更多的Writer
和OutputStream
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(); } }