我在 android 上的 java 中构建了一个应用程序,它通过一个套接字发送一个 .jpg 文件的字节,在 Windows 上的 C# 中的一个异步服务器套接字接收字节并将它们写入一个 .jpg 文件。无法打开接收到的文件。
在作为客户端的 java 应用程序中,我使用了在 onCreate 上执行的以下 asynctask 类:
class asyncTask extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... voids) {
try {
final File myFile = new File("//sdcard/DCIM/Camera/img1.jpg");
byte[] bytes = new byte[(int) myFile.length()];
BufferedInputStream buf = new BufferedInputStream(new FileInputStream(myFile));
buf.read(bytes, 0, bytes.length);
s = new Socket(ip,3333);
OutputStream OS = s.getOutputStream();
OS.write(bytes, 0, bytes.length);
OS.flush();
s.close();
} catch (IOException e) {
Log.d("Error",e.toString());
e.printStackTrace();
}
return null;
}
}
在 C# 应用程序中,我收到了数据并将其保存到以下异步回调方法中的文件中,该方法在接收到数据时调用:
public static void ReadCallback(IAsyncResult ar)
{
Socket clientSocket = (Socket)ar.AsyncState;
int buffLength = clientSocket.EndReceive(ar);
Array.Resize(ref buffer, buffLength);
totaLength += buffLength;
buffer.CopyTo(allData, totaLength - 1);
if (buffLength == 0)
{
Array.Resize(ref allData, totaLength);
File.WriteAllBytes("C: /Users/fxavi/Desktop/img.jpg", allData);
Console.WriteLine(totaLength);
}
else
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), clientSocket);
}
找到这个问题的解决方案后,我感到非常愚蠢。哪个totaLength += buffLength;
应该在之前执行,buffer.CopyTo(allData, totaLength);
以便将缓冲区复制到正确的索引。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句