将图像从android java发送到pc上的c#服务器
我试图使用Socket将图像从android发送到C#server,但出现了一些问题将图像从android java发送到pc上的c#服务器,java,android,Java,Android,我试图使用Socket将图像从android发送到C#server,但出现了一些问题 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.OutputS
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);
}
}
package com.example.clientsocket;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.InputStream;
导入java.io.ObjectInputStream;
导入java.io.ObjectOutputStream;
导入java.io.OutputStream;
导入java.net.Socket;
导入android.app.Activity;
导入android.os.Bundle;
导入android.os.Handler;
导入android.os.Message;
导入android.view.view;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
TextView服务器消息;
线程m_objThreadClient;
插座客户端插座;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
serverMessage=(TextView)findViewById(R.id.textView1);
}
公共无效开始(视图)
{
m_objThreadClient=新线程(new Runnable()
{
公开募捐
{
尝试
{
clientSocket=新套接字(“192.168.88.113”,2001年);
//ObjectOutputStream oos=新的ObjectOutputStream(clientSocket.getOutputStream());
File myFile=新文件(“/storage/sdcard0/Pictures/CameraSample/*.jpg”);
InputStream fis=新文件InputStream(“/storage/sdcard0/Pictures/CameraSample/*.jpg”);
byte[]buffer=新字节[(int)myFile.length()];
fis.read(缓冲区,0,缓冲区长度);
OutputStream OutputStream=clientSocket.getOutputStream();
outputStream.write(缓冲区长度);
outputStream.write(buffer,0,buffer.length);
outputStream.flush();
outputStream.close();
clientSocket.close();
//byte[]buffer=新字节[(int)myFile.length()];
// ...
//fis.read(缓冲区,0,缓冲区长度);
//OutputStream os=clientSocket.getOutputStream();
//oos.书面对象(“37”);
//oos.flush();
//oos.writeObject(缓冲区);
//os.write(37);
//写操作(缓冲区);
//此代码中有一个错误:
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);
您在套接字上发送了错误的数据,如果图像太大,您可能会耗尽内存。此外,您正在将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);
}
这是我的示例C#客户端套接字将图像发送到Android服务器。在发送端,我首先发送图像大小,然后发送图像字节。希望对您有所帮助
客户
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);
}
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);
}