C# c语言中的TCP IP安卓客户端(电话)和PC服务器#
我想从我的手机发送一个大文件到PC服务器,这个文件是用c#写的,代码如下 客户端C# c语言中的TCP IP安卓客户端(电话)和PC服务器#,c#,android,C#,Android,我想从我的手机发送一个大文件到PC服务器,这个文件是用c#写的,代码如下 客户端 File sdFile=new File(mRcordFilePath); byte[] mybytearray = new byte[(int) sdFile.length()]; FileInputStream fis = null; try { fis = new FileInputStream(sdFile); } catch (FileNotFou
File sdFile=new File(mRcordFilePath);
byte[] mybytearray = new byte[(int) sdFile.length()];
FileInputStream fis = null;
try {
fis = new FileInputStream(sdFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
OutputStream os;
try {
os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
String name=sdFile.getName();
dos.writeUTF(name);
dos.writeLong(mybytearray.length);
int read;
while((read = dis.read(mybytearray)) != -1) {
dos.write(mybytearray, 0, read);
}
Toast.makeText(getApplicationContext(),
"Veri Gönderildi !", Toast.LENGTH_SHORT).show();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
服务器端
服务器部分
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
receivedPath = @"C:\Users\Hankishan\Desktop\kayıtlar\" + fileName;
flag++;
}
if (flag >= 1)
{
BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
if (flag == 1)
{
writer.Write(state.buffer, 4 + fileNameLen, bytesRead - (4 + fileNameLen));
flag++;
}
else
writer.Write(state.buffer, 0, bytesRead);
writer.Close();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
else
{
Invoke(new MyDelegate(LabelWriter));
}
如果我运行这个代码,
在接收文件(例如123.wav)时,此行有错误
string fileName = Encoding.UTF8.GetString(state.buffer, 4, fileNameLen);
如果我将代码更改为
fileNameLen = state.buffer[1];
string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen);
没关系。但此时收到的文件已损坏,无法在PC中播放,
我能做什么?什么问题?我解决了这个问题。代码在这里 公共void ReadCallback(IAsyncResult ar) {
int fileNameLen=1;
String content=String.Empty;
StateObject状态=(StateObject)ar.AsyncState;
套接字处理程序=state.workSocket;
int bytesRead=handler.EndReceive(ar);
如果(字节读取>0)
{
如果(标志==0)
{
fileNameLen=state.buffer[1];
//fileNameLen=BitConverter.ToInt32(state.buffer,0);
字符串文件名=Encoding.UTF8.GetString(state.buffer,2,fileNameLen);
receivedPath=@“C:\Users\Hankishan\Desktop\kayitlar\”+文件名;
flag++;
}
如果(标志>=1)
{
BinaryWriter=新的BinaryWriter(File.Open(receivedPath,FileMode.Append));
如果(标志==1)
{
writer.Write(state.buffer,2+fileNameLen,bytesRead-(2+fileNameLen));
flag++;
}
其他的
{
如果(标志==2)
{
for(int i=0;i
int fileNameLen = 1;
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
if (flag == 0)
{
fileNameLen = state.buffer[1];
//fileNameLen = BitConverter.ToInt32(state.buffer, 0);
string fileName = Encoding.UTF8.GetString(state.buffer, 2, fileNameLen);
receivedPath = @"C:\Users\Hankishan\Desktop\kayitlar\" + fileName;
flag++;
}
if (flag >= 1)
{
BinaryWriter writer = new BinaryWriter(File.Open(receivedPath, FileMode.Append));
if (flag == 1)
{
writer.Write(state.buffer, 2 + fileNameLen, bytesRead - (2 + fileNameLen));
flag++;
}
else
{
if (flag == 2)
{
for (int i = 0; i < state.buffer.Length; i++)
{
if (i + 8 == 1023)
break;
state.buffer[i] = state.buffer[i + 8];
}
writer.Write(state.buffer, 0, bytesRead);
flag++;
}else
writer.Write(state.buffer, 0, bytesRead);
}
writer.Close();
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
else
{
Invoke(new MyDelegate(LabelWriter));
}
}