有人可以演示如何通过TCP连接从发送程序向Java中的接收程序发送字节数组。
byte[] myByteArray
(我是Java编程的新手,似乎无法找到如何执行此操作的示例,显示连接的两端(发送方和接收方)。如果您知道现有示例,也许您可以发布链接。(无需重新发明轮子。)PS这是 NOT 作业!: - )
答案 0 :(得分:56)
Java中的InputStream
和OutputStream
类本身处理字节数组。您可能想要添加的一件事是消息开头的长度,以便接收器知道预期的字节数。我通常喜欢提供一种方法,允许控制字节数组中的哪些字节发送,就像标准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 example的Really Big Index开始。但请注意,它旨在传输和接收字符,而不是字节。但这不是什么大问题 - 您只需处理InputStream
类提供的原始OutputStream
和Socket
对象。有关不同类型的读者,编写者和流的更多信息,请参阅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 ;-)
}
}