gpt4 book ai didi

Java:在套接字编程中从InputStream接收不同类型的文件

转载 作者:行者123 更新时间:2023-11-29 08:07:41 25 4
gpt4 key购买 nike

在我的项目客户端发送一些文本,一些图像到服务器。服务器需要处理所有这些事情,即如果有文本,那么它需要显示在框架上的 TestArea 上,如果有图像文件,那么服务器需要将该图像文件存储在计算机上。我创建了一个处理字符串(文本)或图像文件的应用程序,但是当客户端同时发送这些内容时,我不知道如何存储所有这些内容。

我知道当我添加这段代码时:InputStream in = socket.getInputStream();

那么客户端发送的所有数据都在这个InputStream中所以我如何识别这么多范围的数据是图像文件,所以需要存储在字节数组中,直到这么多是测试或字符串,所以需要在 TextAreea 中显示。如果客户端一次向服务器发送两个或更多图像,那么服务器如何理解这么多的数据,这是第一张图像,这么多的数据,这是第二张图像文件。

我试过这段代码来发送图片:

客户端代码:

public void sendPhotoToServer(String str){ // str is image location
try {
InputStream input = new FileInputStream(str);
byte[] buffer=new byte[1024];
int readData;
while((readData=input.read(buffer))!=-1){
dos.write(buffer,0,readData); // dos is DataOutputStream
}
} catch (FileNotFoundException e) {

} catch (IOException e) {

}
}

并且此方法在循环中,因此客户端会发送其文件夹中的所有图像。

现在服务器代码,这是在线程中,并且每次都在 while 循环中监听客户端数据:

public void run() {
while (true) {
try {
byte[] buffer = new byte[8192];
fis = new FileOutputStream("C:\\"+(s1++)+".jpg"); // fis is FileOutputStream
while ((count = in.read(buffer)) > 0){ //count is a integer and 'in' is InputStream
fis.write(buffer, 0, count);
fis.flush();
}
} catch (Exception e) {}
}
}

但是通过这段代码,服务器接收到第一张图片之后就不再显示其他图片了。

这里是服务器如何理解客户端发送的简单字符串。在服务器端应用程序中,它打开一个端口来监听客户端发送的所有数据

FileOutputStream fis = socket.getInputStream();

现在它如何区分所有这些文件和简单的字符串。

最佳答案

如果您事先知道数据类型,为什么不直接使用 ObjectInputStreamObjectOutputStream

这里是发送:

import java.io.*;

public class Client {

public static void main(String[] args) throws IOException {
// write string
ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("test-string.data")));
try {
out.writeObject("Hello");
} finally {
out.close();
}
// write byte arrays
out = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("test-byteArrays.data")));
try {
out.writeObject(new byte[] { 'H', 'e', 'l', 'l', 'o' });
out.writeObject(new byte[] { 'W', 'o', 'r', 'l', 'd' });
} finally {
out.close();
}
}

}

这里是接收:

import java.io.*;
import java.util.*;

public class Server {

public static void main(String[] args) throws IOException, ClassNotFoundException {
// write string
ObjectInputStream in = new ObjectInputStream(
new BufferedInputStream(
new FileInputStream("test-string.data")));
try {
Object o = null;
while ((o = in.readObject()) != null) {
System.out.printf("Class: %s, toString: %s\n", o.getClass(), o.toString());
}
} catch (EOFException e) {
// finished
} finally {
in.close();
}
// write byte arrays
in = new ObjectInputStream(
new BufferedInputStream(
new FileInputStream("test-byteArrays.data")));
try {
Object o = null;
while ((o = in.readObject()) != null) {
System.out.printf("Class: %s, toString: %s\n", o.getClass(), o.toString());
}
} catch (EOFException e) {
// finished
} finally {
in.close();
}
}

}

关于Java:在套接字编程中从InputStream接收不同类型的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10011462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com