如何通过TCP连接发送字节数组(java编程)

有人可以演示如何通过TCP连接从发送器程序向Java中的接收器程序发送字节数组。

byte[] myByteArray 

(我是Java编程的新手,似乎无法找到如何执行此操作的示例,显示连接的两端(发送方和接收方)。如果您知道现有示例,也许您可​​以发布链接(不需要重新发明轮子。)PS这不是功课!:-)

Java中的InputStreamOutputStream类本身处理字节数组。 您可能想要添加的一件事是消息开头的长度,以便接收器知道预期的字节数。 我通常喜欢提供一种方法,允许控制字节数组中的哪些字节发送,就像标准API一样。

像这样的东西:

 private Socket socket; public void sendBytes(byte[] myByteArray) throws IOException { sendBytes(myByteArray, 0, myByteArray.length); } public void sendBytes(byte[] myByteArray, int start, int len) throws IOException { if (len < 0) throw new IllegalArgumentException("Negative length not allowed"); if (start < 0 || start >= myByteArray.length) throw new IndexOutOfBoundsException("Out of bounds: " + start); // Other checks if needed. // May be better to save the streams in the support class; // just like the socket variable. OutputStream out = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); dos.writeInt(len); if (len > 0) { dos.write(myByteArray, start, len); } } 

编辑 :添加接收方:

 public byte[] readBytes() throws IOException { // Again, probably better to store these objects references in the support class InputStream in = socket.getInputStream(); DataInputStream dis = new DataInputStream(in); int len = dis.readInt(); byte[] data = new byte[len]; if (len > 0) { dis.readFully(data); } return data; } 

从真正的大指数开始这个例子 。 但请注意,它旨在传输和接收字符,而不是字节。 但这不是什么大问题 – 你可以只处理Socket类提供的原始InputStreamOutputStream对象。 有关不同类型的读者,编写者和流的更多信息,请参阅API。 您感兴趣的方法是OutputStream.write(byte[])InputStream.read(byte[])

Oracle套接字通信教程似乎是合适的发布点。

请注意,将字符转换为字节会更加麻烦 。 如果你想在字节级工作,只需将其剥离。

这个Sun Sockets教程应该为您提供一个很好的起点

您需要使用的是java.io.OutputStreamwrite方法和java.io.OutputStreamread方法,您可以从打开的Socket检索这两种方法。

我会请你使用ObjectOutputStream和ObjectInputStream。 它们将所有内容作为对象发送并以相同方式接收。

 ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream()); os.flush(); ObjectInputStream is = new ObjectInputStream(socket.getInputStream()); os.writeObject(byte_array_that_you_want_to_send); byte[] temp = (byte[]) is.readObject(); 

还要记住首先创建输出流,刷新它然后继续输入流,因为如果流中遗漏了某些内容,则不会创建输入流。

我猜这个问题措辞错误。 我在寻找一个答案时找到了这个问题,当我遇到一个值为0的字节时,我使用InputStream和OutputStream似乎将整个数组设置为0.这些假设这些字节包含有效的ASCII而不是二进制。 既然问题没有出来并问这个问题,似乎没有其他人把它作为一种可能性,我想我必须满足我在其他地方的任务。

我试图做的是编写一个TransparentSocket类,它可以实例化TCP(Socket / ServerSocket)或UDP(DatagramSocket)以透明地使用DatagramPacket。 它适用于UDP,但不适用于TCP。

后续:我似乎已经证实这些流本身对二进制传输无用,但它们可以传递给程序员更友好的实例化,例如,

new DataOutputStream(socket.getOutputStream())。writeInt(5);

这个想法太多了。 它以“可移植”的方式写入数据,即可能是ASCII,这根本没有帮助,特别是在模拟我无法控制的软件时!

 import java.io.*; import java.net.*; public class ByteSocketClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket s=new Socket("",6000); DataOutputStream dout=new DataOutputStream(new BufferedOutputStream(s.getOutputStream())); byte[] a = {(byte)0xC0,(byte)0xA8,(byte)0x01,(byte)0x02,(byte)0x53,(byte)0x4D,(byte)0x41,(byte)0x52,(byte)0x54}; dout.write(a); dout.close(); s.close(); } } 

这是一个流式传输100字节wav文件帧的示例。

 private Socket socket; public void streamWav(byte[] myByteArray, int start, int len) throws IOException { Path path = Paths.get("path/to/file.wav"); byte[] data = Files.readAllBytes(path); OutputStream out = socket.getOutputStream(); DataOutputStream os = new DataOutputStream(out); os.writeInt(len); if (len > 0) { os.write(data, start, len); } } public void readWav() throws IOException { InputStream in = socket.getInputStream(); int frameLength = 100; // use useful number of bytes int input; boolean active = true; while(active) { byte[] frame = new byte[frameLength]; for(int i=0; i