Java 如何使用datainputstream从套接字读取数据

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

我可以显示收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每5秒后从Android客户端发送

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
正如格兰德斯所建议的那样,您显然收到了一个不正确的图像长度单词。您需要对此进行调查。例如,在收到它时打印它。您是否发送了一个长度单词?此答案中建议的更改需要在发件人处进行相应的更改,您应该能够自行解决.你这样做了吗?