我可以显示收到的单个图像,但现在我想在我的磁盘上接收和写入多个图像,这些图像将在每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);
答案 0 :(得分:3)
您需要在客户端和服务器之间构建协议。
如果图像大小是常量,则只需循环输入流并保持缓冲,直到获得固定的字节数并写入所有已缓冲的图像。
否则,您需要添加一些元数据来指示图片的大小;例如你可以使用这样的简单格式:
[size1][image1][size2][image2][size3][image3]
,[size-i]占用固定的空间,[image-i]占第i个图像的大小。
但最重要的是不要试图做一个像处理图像这样天真的协议,睡5秒并检索下一个,因为由于客户端,网络或服务器,每个图像之间的确切时间可能会有很大差异(你的代码和/或文件系统。)
答案 1 :(得分:2)
变化不大:
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);
}
答案 2 :(得分:0)
如果您有多个客户端和一台服务器。尝试多线程。示例代码:
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;
在“运行”中,您可以通过各自的ID调用每个客户端,并执行所需的reqd功能。不确定这是多么清楚。如果需要,我可以向您发送我所拥有的完整代码,这与您正在进行的操作类似。