как дела? :)
Я учусь передавать файлы через Socket, но у меня проблема. Я могу отправить файл (максимум 200 МБ) между компьютерами. Я хочу отправить файл между Android и P C. Но я не могу получить имя файла. Я имею в виду, я получил имя, но с избытком. Вместо «sample.jpg» я получил «sample.jpg ???? c [] Exif».
Итак, это мой код для Клиента на Android:
try {
Socket sock = new Socket("192.168.1.174", 2014);
OutputStream outputStream = null;
File f = new File(path);
byte[] fNameByte = name.getBytes();
byte[] fileData = fullyReadFileToBytes(f);
byte[] clientData = new byte[4 + fNameByte.length + fileData.length];
byte[] fNameLen = intToByteArray(fNameByte.length);
outputStream = sock.getOutputStream();
FileInputStream fis = null;
fis = new FileInputStream(f);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(fileData, 0, fileData.length);
System.arraycopy(fNameLen, 0, clientData, 0, fNameLen.length);
System.arraycopy(fNameByte, 0, clientData, 4, fNameByte.length);
System.arraycopy(fileData, 0, clientData, 4+fNameByte.length, fileData.length);
outputStream.write(clientData, 0, clientData.length);
outputStream.flush();
sock.close();
} catch (Exception ex) {
Log.e("FileTransfer", "---" + ex.toString());
}
Это мой код для Сервера на C#:
try
{
DebugMessage = "Starting...";
sock.Listen(100);
DebugMessage = "Works and waits for files";
Socket clientSock = sock.Accept();
byte[] clientData = new byte[1024 * 5000 * 40];//200MB
int receivedByteLen = clientSock.Receive(clientData);
DebugMessage = "Receiving File ...";
int fNameLen = BitConverter.ToInt32(clientData,0);
string fName = Encoding.ASCII.GetString(clientData, 4, fNameLen);
debugName = fName;
BinaryWriter write = new BinaryWriter(File.Open(path + "/" + fName, FileMode.Append));
write.Write(clientData, 4 + fNameLen, receivedByteLen - 4 - fNameLen);
DebugMessage = "Saving file....";
write.Close();
clientSock.Close();
DebugMessage = "The file has been received";
}
catch (Exception e)
{
DebugMessage = "Error, file not received " + e.ToString() + "\n" + "Path: " + path + " ->Name: " + debugName;
}
Это мой код для клиента в C# (работает, когда я посылаю файл между компьютерами):
try
{
IPAddress ip = IPAddress.Parse("192.168.1.174");
IPEndPoint end = new IPEndPoint(ip, 2014);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
string path = "";
fName = fName.Replace("\\", "/");
while (fName.IndexOf("/") > -1)
{
path += fName.Substring(0, fName.IndexOf("/") + 1);
fName = fName.Substring(fName.IndexOf("/") + 1);
}
byte[] fNameByte = Encoding.ASCII.GetBytes(fName);
if (fNameByte.Length > 850 * 1024)
{
CurrentMessage = "The name is larger than 850 kb";
return;
}
CurrentMessage = "Buffering...";
byte[] fileData = File.ReadAllBytes(path + fName);
byte[] clientData = new byte[4 + fNameByte.Length + fileData.Length];
byte[] fNameLen = BitConverter.GetBytes(fNameByte.Length);
fNameLen.CopyTo(clientData, 0);
fNameByte.CopyTo(clientData, 4);
fileData.CopyTo(clientData, 4 + fNameByte.Length);
CurrentMessage = "Connecting to the server...";
sock.Connect(end);
CurrentMessage = "The file is sent...";
sock.Send(clientData);
CurrentMessage = "Disconnection...";
sock.Close();
CurrentMessage = "The file was sent..";
}
catch (Exception ex)
{
}
Почему это работает между компьютерами, но между Android - P C это не не работает? Спасибо за ваше время!
Редактировать: я статически назначил длину имени в файле сервера.
int fNameLen = 10;//BitConverter.ToInt32(clientData,0);
Это не решает мою проблему, но обнаруживает следующую. Он отправляет мне только 40 КБ.