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

时间:2010-05-21 00:40:27

标签: java sockets tcp bytearray

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

byte[] myByteArray

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

9 个答案:

答案 0 :(得分:56)

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

答案 1 :(得分:4)

this exampleReally Big Index开始。但请注意,它旨在传输和接收字符,而不是字节。但这不是什么大问题 - 您只需处理InputStream类提供的原始OutputStreamSocket对象。有关不同类型的读者,编写者和流的更多信息,请参阅API。您感兴趣的方法有OutputStream.write(byte[])InputStream.read(byte[])

答案 2 :(得分:2)

The Oracle Socket Communications Tutorial似乎是合适的发射点。

请注意,将额外麻烦转换为字节。如果你想在字节级别工作,只需将其剥离。

答案 3 :(得分:1)

这个Sun Sockets tutorial应该给你一个很好的起点

答案 4 :(得分:1)

您需要使用的是write的{​​{1}}方法和java.io.OutputStream的{​​{1}}方法,您可以从read中检索这两种方法1}}你打开。

答案 5 :(得分:1)

我会请你使用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();

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

答案 6 :(得分:0)

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

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

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

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

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

答案 7 :(得分:0)

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

}

答案 8 :(得分:0)

以下是一次流式传输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<frameLength; i++) {

            input = in.read();

            if(input < 0) {
                active = false;
                break;
            } else frame[i] = (byte) input;
        }

        // playWavPiece(frame);
        // streamed frame byte array is full
        // use it here ;-)
    }
}