Java 如何使用datainputstream从套接字读取数据
我可以显示收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每5秒后从Android客户端发送Java 如何使用datainputstream从套接字读取数据,java,android,java-server,Java,Android,Java Server,我可以显示收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每5秒后从Android客户端发送 Socket sock = servsock.accept(); dataInputStream = new DataInputStream(sock.getInputStream()); dataOutputStream = new DataOutputStream(sock.getOutputStream()); System.out.println("Accepted con
Socket sock = servsock.accept();
dataInputStream = new DataInputStream(sock.getInputStream());
dataOutputStream = new DataOutputStream(sock.getOutputStream());
System.out.println("Accepted connection : " + sock);
dataInputStream = new DataInputStream(sock.getInputStream());
byte[] base64=dataInputStream.readUTF().getBytes();
byte[] arr=Base64.decodeBase64(base64);
FileOutputStream imageOutFile = new FileOutputStream("E:\\image.jpeg");
imageOutFile.write(arr);
您需要在客户端和服务器之间建立一个协议 如果图像大小不变,则只需在输入流上循环并保持缓冲,直到获得固定的字节数并写入所有已缓冲的图像 否则,您需要添加一些指示图像大小的元数据;e、 g.您可以使用以下简单格式:
[size1][image1][size2][image2][size3][image3]
[size-i]占据固定的空间量,[image-i]为第i幅图像的大小
但最重要的是,不要尝试执行这样一种幼稚的协议,例如处理一个映像、睡眠5秒钟并检索下一个映像,因为由于客户端、网络或服务器(您的代码和/或文件系统)的原因,每个映像之间的准确时间可能会有很大差异。小改动:
Socket sock = servsock.accept();
dataInputStream = new DataInputStream(sock.getInputStream());
dataOutputStream = new DataOutputStream(sock.getOutputStream());
System.out.println("Accepted connection : " + sock);
int imagesCount = dataInputStream.readInt();
for (int imgNum = 0; imgNum < imagesCount; imgNum++) {
int imgLen = dataInputStream.readInt();
byte[] base64 = new byte[imgLen];
dataInputStream.readFully(base64);
byte[] arr = Base64.decodeBase64(base64);
FileOutputStream imageOutFile = new FileOutputStream("E:\\image"+imgNum+".jpeg");
imageOutFile.write(arr);
}
Socket-sock=servsock.accept();
dataInputStream=新的dataInputStream(sock.getInputStream());
dataOutputStream=新的dataOutputStream(sock.getOutputStream());
System.out.println(“接受的连接:+sock”);
int-ImageScont=dataInputStream.readInt();
for(int-imgNum=0;imgNum
如果您有多个客户端和一台服务器。尝试多线程。代码示例:
public static void main(String[] args){
try {
servSocket = new ServerSocket(xxxx);
while(true)
{
socket = servSocket.accept();
ClientNum++;
for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID.
if(threads[i]==null){
sockets[i]=socket;
publicstaticvoidmain(字符串[]args){
试一试{
servSocket=新服务器套接字(xxxx);
while(true)
{
socket=servSocket.accept();
ClientNum++;
对于(int i=0;iVG),但我将放弃base64编码,只使用DataInputStream.readFully()。在本例中,{int imgLen=DataInputStream.readInt();byte[]arr=new byte[imgLen];DataInputStream.readFully(arr);//[…cut…]
更有可能的是您收到了错误的imgLen…发布客户端代码以查看您发送了什么…@WajihAhmed base64编码sheme不适合。首先,它将您限制为base64编码小于64k的图像。您需要重新考虑这一点。@WajihAhmed我没有提供任何代码:ggrandes提供了。如果您收到OutOfMemoryError
正如格兰德斯所建议的那样,您显然收到了一个不正确的图像长度单词。您需要对此进行调查。例如,在收到它时打印它。您是否发送了一个长度单词?此答案中建议的更改需要在发件人处进行相应的更改,您应该能够自行解决.你这样做了吗?