2013-07-03 206 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中还有许多其他有用的方法和类可以节省您的时间。

相关问题