繁体   English   中英

从Java到C#的图像流

[英]Image streaming from Java to C#

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数据是文本,可能需要您使用CharsetEncoder在将流发送到C#之前对其进行处理,但是图像数据是二进制的,并且您只想逐位发送数据。 问题可能是流编码器错误地将图像数据中的某些二进制序列解释为需要编码的文本字符并对其进行处理。

只需在两边都使用普通的二进制流读写(您已经在C#中进行了此操作),并确认数据完全相同即可。 如果不是,则发布一个十六进制示例以说明其不同之处。

终于解决了这个问题。

Java(客户端)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class ImageServer {
    public static void main(String[] args) {
        try {


        Socket socket = new Socket("localhost", 8000);

        //code to send image
        File file = new File("C:\\Users\\ashish\\Desktop\\image.jpg");
        FileInputStream fileInputStream = new FileInputStream(file);
        int count=0;
        byte[] fileBytes = new byte[(int)file.length()];

        int content;
        OutputStream outputStream = socket.getOutputStream();

        while((content = fileInputStream.read(fileBytes)) != -1){
            outputStream.write(fileBytes, 0, (int)file.length());               
        }

        System.out.println("file size is "+ fileBytes.length);
        for(byte a : fileBytes){System.out.println(a);}           

    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
}

C#(服务器)

using System;
using System.IO;
using System.Net;
using System.Net.Sockets;

namespace Test.SendImageClient
{
    public class Program
    {
        static void Main(string[] args)
        {
            TcpListener tcpListener = null;
            try
            {
                IPAddress ipadress = IPAddress.Parse("127.0.0.1");
                 tcpListener = new TcpListener(ipadress, 8000);

                /* Start Listeneting at the specified port */
                tcpListener.Start();
                byte[] bytes = new byte[6790];
                byte[] finalBytes;

              while(true){
                  TcpClient client = tcpListener.AcceptTcpClient();
                  Console.WriteLine("Connected!");
                  NetworkStream stream = client.GetStream();

                  int i;

                  do
                  {
                      i = stream.Read(bytes, 0, bytes.Length);
                      finalBytes = new byte[i];
                      Console.WriteLine("Size dynamically is "+i);
                      for (int n = 0; n < i; n++ )
                      {
                          finalBytes[n] = bytes[n];
                      }                     
                  }while(stream.DataAvailable);

                  File.WriteAllBytes("C:\\Users\\ashish\\Desktop\\newImage.jpg", finalBytes);

                  client.Close();
              }                
            }
            catch (SocketException e)
            {
                Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Stop listening for new clients.
                tcpListener.Stop();
            }

        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM