gpt4 book ai didi

c# - 从 Java 到 C# 的图像流传输

转载 作者:太空宇宙 更新时间:2023-11-04 15:04:00 25 4
gpt4 key购买 nike

Java(客户端)

相关代码

    // Create the encoder and decoder for targetEncoding
Charset charset = Charset.forName("UTF-8");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
byte[] underlyingBuffer = new byte[100000];
ByteBuffer buffer = ByteBuffer.wrap(underlyingBuffer);

System.out.println("first buffer remaining" + buffer.remaining() + " "
+ buffer.limit());
buffer.order(ByteOrder.LITTLE_ENDIAN);
try {
Socket client = new Socket("localhost", 8080);

OutputStream oStream = client.getOutputStream();
InputStream iStream = client.getInputStream();


//String secondFilePath = "C:\\Users\\pedge\\Desktop\\readData.csv";//this is csv file
//long secondFileLength = ReadFileToCharArray(buffer,secondFilePath , encoder);

String inputImage = "C:\\Users\\pedge\\Desktop\\Desert.jpeg";// image to transfer
ReadFileToCharArray(buffer,inputImage , encoder);
//imageWrite(oStream, inputImage);

buffer.flip();

int dataToSend = buffer.remaining();

int remaining = dataToSend;

while (remaining > 0) {
oStream.write(buffer.get());
--remaining;
}

public static long ReadFileToCharArray(ByteBuffer buffer, String filePath,
CharsetEncoder encoder) throws IOException {
fileCount++;
System.out.println("second buffer remaining" + buffer.remaining() + " "
+ buffer.limit());

StringBuilder fileData = new StringBuilder(100);
File file = new File(filePath);
System.out.println("Size of file ["+fileCount+"] sent is ["+file.length()+"]");

BufferedReader reader = new BufferedReader(new FileReader(filePath));

char[] buf = new char[10000000];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
System.out.println(numRead);
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1000000];
}

reader.close();
CharBuffer charBuffer = CharBuffer.wrap(fileData.toString()
.toCharArray());
System.out.println("char buffer " + charBuffer.remaining());

ByteBuffer nbBuffer = null;
try {
nbBuffer = encoder.encode(charBuffer);

} catch (CharacterCodingException e) {
throw new ArithmeticException();
}

buffer.putInt(nbBuffer.limit());
System.out.println("buffer information" + buffer.position() + " "
+ buffer.limit() + " nbBuffer information" + nbBuffer.position()
+ " " + nbBuffer.limit());
buffer.put(nbBuffer);
return file.length();
}

C#(服务器端)

        static void Main(string[] args)
{
try
{
Run(args);
}
catch (Exception e)
{
Console.Error.WriteLine(e);
}

}

static void Run(string[] args)
{
TcpListener listener = new TcpListener(8080);
listener.Start();

while (true)
{
using (TcpClient client = listener.AcceptTcpClient())
{
try
{
Read(client);
}
catch (Exception e)
{
Console.Error.WriteLine(e);
}
}
}
}
static void Read(TcpClient client)
{
String csvFile4Parsing = "C:\\Users\\pedge\\Desktop\\newReadData.csv";// csv file created from byte stream

Console.WriteLine("Got connection: {0}", DateTime.Now);
NetworkStream ns = client.GetStream();
BinaryReader reader = new BinaryReader(ns);


int length = reader.ReadInt32();
Console.WriteLine("Length of csv is [" + length + "]");
byte[] fileArray = reader.ReadBytes(length);
File.WriteAllBytes(csvFile4Parsing, fileArray);//bytes from stream, written to csv`

现在我可以将图像从 java 传输到 C#,然后由 c# 创建一个文件(完美)

但是当我尝试发送图像(与 CSV 相同)时,它根本不起作用,甚至服务器端接收到的字节也与客户端不同。我现在已经花了几个小时在这上面但没有成功。 :/

非常感谢您的帮助。谢谢。

最佳答案

CSV 数据是文本,在将其发送到 C# 之前可能需要使用 CharsetEncoder 来处理流,但图像数据是二进制的,您只想发送数据的逐位副本。问题很可能是流编码器错误地将图像数据中的某些二进制序列解释为需要编码的文本字符并破坏它们。

只需在两侧使用纯二进制流读写(您已经在 C# 中执行此操作)并确认数据完全相同。如果不是,请发布一个十六进制示例以说明其有何不同。

关于c# - 从 Java 到 C# 的图像流传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22245074/

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