繁体   English   中英

将图像从Android Java发送到PC上的C#服务器

[英]send image from android java to c# server on pc

我正在尝试使用Socket将图像从android发送到C#服务器,但是出了点问题。

package com.example.clientsocket;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends Activity {
TextView serverMessage;
Thread m_objThreadClient;
Socket clientSocket;
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        serverMessage=(TextView)findViewById(R.id.textView1);
    }
public void Start(View view)
{
    m_objThreadClient=new Thread(new Runnable() 
    {
          public void run()
           {
              try 
               {
                 clientSocket= new Socket("192.168.88.113",2001);
                 //ObjectOutputStream oos = new ObjectOutputStream(clientSocket.getOutputStream());



                 File myFile = new File("/storage/sdcard0/Pictures/CameraSample/*.jpg");
                 InputStream fis = new FileInputStream("/storage/sdcard0/Pictures/CameraSample/*.jpg");

                 byte [] buffer = new byte[(int)myFile.length()];
                 fis.read(buffer,0,buffer.length);


                OutputStream outputStream = clientSocket.getOutputStream();
                outputStream.write(buffer.length);
                outputStream.write(buffer,0,buffer.length);
                 outputStream.flush();
                 outputStream.close();
                 clientSocket.close();
                 //byte [] buffer = new byte[(int)myFile.length()];




              // ...
              //fis.read(buffer,0,buffer.length);
              //OutputStream os = clientSocket.getOutputStream();
              //oos.writeObject("37");
              //oos.flush();
              //oos.writeObject(buffer);
              //os.write(37);
              //os.write(buffer);
              // <- This one.
                /* 
                 int temp = 0 ;  
                 while((temp = fis.read(buffer)) != -1)
                 {  
                     outputStream.write(buffer, 0, temp);  
                 }  */




                 /*
                 Message serverMessage= Message.obtain();
                 ObjectInputStream ois =new ObjectInputStream(clientSocket.getInputStream());
                 String strMessage = (String)ois.readObject();
                serverMessage.obj=strMessage;
                mHandler.sendMessage(serverMessage); 
                oos.close();
                ois.close();*/
               } 
               catch (Exception e) 
               {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

             }
            });

     m_objThreadClient.start();

}
Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) 
    {
        messageDisplay(msg.obj.toString());
    }
};
public void messageDisplay(String servermessage)
{
    serverMessage.setText(""+servermessage);
}

}

服务器发送的每个图像的缓冲区长度均为60800,我无法使用此数组在C#上创建图像。 我要比从Android上的服务器接收char数组。 我要在JPG文件中做错什么,因为我想同时在文件夹中只有一个图像吗?

这是我的示例C#客户端套接字将图像发送到Android Server。 在发送方,我先发送图像大小,然后发送图像字节。 希望能帮助到你。

C#客户端

 try
        {

            //   IPAddress[] ipAddress = Dns.GetHostAddresses("192.168.173.129");
            IPAddress[] ipAddress = Dns.GetHostAddresses("192.168.1.32");
            IPEndPoint ipEnd = new IPEndPoint(ipAddress[0], 4800);

           string file=@"C:\Users\test\Desktop\send image\test\abc.jpg
            {
                // Create Socket to send

                Socket senderSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                senderSocket.Connect(ipEnd);
                //send picture name



                // Connect the socket to the remote endpoint. Catch any errors.
                FileInfo FileInfo = new FileInfo(file);
                byte[] data = new byte[8];
                String fInfoStr = FileInfo.Length.ToString();
                while (fInfoStr.Length < 8)
                {
                    fInfoStr = "0" + fInfoStr;
                }
                byte[] countBuf = Encoding.ASCII.GetBytes(fInfoStr);

                byte[] fBuffer = new byte[FileInfo.Length];
                //FileStream
                FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                //Read byte from image
                fs.Read(fBuffer, 0, fBuffer.Length);
                fs.Flush();
                fs.Close();

                senderSocket.Send(fBuffer, 0, fBuffer.Length, SocketFlags.None);
                senderSocket.Close();
                lblTestMsg.Visible = true;
                lblErrorMsg.Visible = false;
                lblTestMsg.Text = "File Sent Successfully"; 
            }

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);            
        }

Android服务器

                Socket socket = serverSocket.accept();
                InputStream iStream = socket.getInputStream();                 ;
                String currentDateandTime = sdf.format(new Date());



                //   int filenamelen =iStream.read();

                //image Name
                byte[] countBuf = new byte[8];
                //  byte[] imageNameByte = new byte[7];
                iStream.read(countBuf);
                //iStream.read(imageNameByte,0,7);
                readTxt = new String(countBuf);
                // imageName= new String(imageNameByte);
                int size = Integer.parseInt(readTxt);


                //Send byte array                                      
                 senderSocket.Send(countBuf, 0, data.Length, SocketFlags.None);new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator + "SPARCS" + File.separator + folderName + File.separator + fileName).mkdirs();
                Log.e("TCP", "Create Drkt");
                //Create Image(File)

                new File(Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator + "SPARCS" + File.separator + folderName + File.separator + fileName, imageName + ".jpg").createNewFile();
                Log.e("TCP", "Create Img");

                try {
                    FileOutputStream fOutputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator + "DCIM" + File.separator + "SPARCS" + File.separator + folderName + File.separator + fileName + File.separator + imageName + ".jpg");
                    BufferedOutputStream BufOutputStream = new BufferedOutputStream(fOutputStream);
                    byte[] aByte = new byte[size];
                    int byteRead;
                    //   int bytesRead = iStream.read(aByte);
                    //Read from server
                    while ((byteRead = iStream.read(aByte)) > 0) {
                        Log.e("TCP", "Save to file");//Write to file
                        BufOutputStream.write(aByte, 0, byteRead);
                    }
                    publishProgress();
                    notifyID++;
                    // String imageUri =Environment.getExternalStorageDirectory() + File.separator + "myDirectory" + File.separator + readTxt + File.separator+currentDateandTime+".jpg";
                    BufOutputStream.flush();
                    BufOutputStream.close();
                    socket.close();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } catch (Exception e) {
            Log.e("TCP", "C: Error", e);
        }

您在此代码中有一个错误:

byte [] buffer = new byte[(int)myFile.length()];
fis.read(buffer,0,buffer.length);

OutputStream outputStream = clientSocket.getOutputStream();
outputStream.write(buffer.length); // You are changing the image here...
outputStream.write(buffer,0,buffer.length);

您在Socket上发送了错误的数据,如果映像过大,可能会耗尽内存。 另外,您正在将myFile.length()转换为int。 文件长度过长是有原因的。 它允许扫描非常大的文件。 可能不是您的情况,但我建议不要这样做。

应该是这样的:

byte [] buffer = new byte[1048];
OutputStream outputStream = clientSocket.getOutputStream();

int numberOfBytesBeenRead = fis.read(buffer,0,buffer.length);

while(numberOfBytesBeenRead != -1){
    outputStream.write(buffer,0,numberOfBytesBeenRead);
    numberOfBytesBeenRead = fis.read(buffer,0,buffer.length);
}    

暂无
暂无

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

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