2013-12-22 3 views
1

Socket을 사용하여 안드로이드에서 C# 서버로 이미지를 보내려고하는데, 문제가 생깁니다.안드로이드 자바에서 PC의 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#에서 이미지를 만들 수 없습니다. 안드로이드 서버에서 char 배열을받는 것보다 싶습니다. JPG 파일에서 잘못된 작업을하고 있는데, 내 폴더에 이미지 하나만 넣고 싶기 때문입니까?

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); 

당신은 소켓에 잘못된 데이터를 전송하고, 이미지가 큰하는 것입니다 경우 메모리가 부족 실행할 수 있습니다

답변

0

는이 코드에서 실수 있습니다. 또한 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); 
}  
1

이 내 샘플 C# 클라이언트 소켓이 안드로이드 서버로 이미지를 전송합니다. 내 보내는 쪽에서는 먼저 이미지 크기를 보내고 이미지 바이트를 따라갑니다. 희망이 도움이됩니다.

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 [email protected]"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);    
     } 

안드로이드 서버

   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); 
     } 
관련 문제