[英]how to send an array of bytes over a TCP connection (java programming)
有人可以演示如何通过TCP连接从发送器程序向Java中的接收器程序发送字节数组。
byte[] myByteArray
(我是Java编程的新手,似乎无法找到如何执行此操作的示例,显示连接的两端(发送方和接收方)。如果您知道现有示例,也许您可以发布链接(不需要重新发明轮子。)PS这不是功课!:-)
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;
}
Oracle套接字通信教程似乎是合适的发布点。
请注意,将字符转换为字节会更加麻烦 。 如果你想在字节级工作,只需将其剥离。
这个Sun Sockets教程应该为您提供一个很好的起点
你需要用什么write
的方法java.io.OutputStream
,和read
的方法java.io.InputStream
,这两者都可以从检索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();
还要记住首先创建输出流,刷新它然后继续输入流,因为如果流中遗漏了某些内容,则不会创建输入流。
我猜这个问题措辞错误。 我在寻找一个答案时找到了这个,为什么我在使用InputStream和OutputStream时遇到一个值为0的字节时将整个数组设置为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<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 ;-)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.