class ClientState
{
public byte[] state = new byte[1024];
public Socket sk;
}
class FileState
{
public FileStream fs;
public string filename;
public const int length = 1024;
public byte[] state = new byte[length];
public Socket sk;
}
private void AsyCallback(IAsyncResult ar)
{
//获取侦听器
TcpListener tl = ar.AsyncState as TcpListener;
//获取客户端的Socket
sk = tl.EndAcceptSocket(ar);
ClientState cs = new ClientState();
cs.sk = sk;
sk.BeginReceive(cs.state, 0, cs.state.Length, SocketFlags.None, new AsyncCallback(Read_Callback), cs);
//异步接受数据
tl.BeginAcceptSocket(new AsyncCallback(AsyCallback), tl); } public void Read_Callback(IAsyncResult ar)
{
ClientState cs = (ClientState)ar.AsyncState;
Socket s = cs.sk; int read = s.EndReceive(ar);
byte[] fnl = cs.state;
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
ms.Write(fnl, 0, fnl.Length);
ms.Position = 0;
ArrayList aal = (ArrayList)bf.Deserialize(ms);
FileState fstate = new FileState();
fstate.filename = aal[1] as string;
fstate.sk = s;
fstate.fs = new FileStream(@"C:\Users\Administrator\" + fstate.filename, FileMode.OpenOrCreate, FileAccess.Write);
s.BeginReceive(fstate.state, 0, FileState.length, 0, new AsyncCallback(ReceMsgCallBack), fstate);
} public void ReceMsgCallBack(IAsyncResult ar)
{
FileState cs = ar.AsyncState as FileState;
Socket thisSk = cs.sk;
int read = thisSk.EndReceive(ar);
if (read>0)
{
cs.fs.Write(cs.state, 0, read);
thisSk.BeginReceive(cs.state, 0, FileState.length, 0, new AsyncCallback(ReceMsgCallBack), cs);
}
else
{
cs.fs.Write(cs.state, 0, read);
ClientState tcs = new ClientState();
tcs.sk = thisSk;
cs.fs.Close();
sk.BeginReceive(tcs.state, 0, tcs.state.Length, SocketFlags.None, new AsyncCallback(Read_Callback), tcs);
}
}
经过修改该这是接受的代码 首先客户端先发送序列化的文件名过来 然后再发送文件过来 但我读取的时候 第一次接受个图片还可以 但第二次就不行了 不知道怎么回事 求大神求解
自己定义数据帧,自己组织数据包进行传递
一个包长度|总包数|第几包|值|检验
--------------- akldf kakfaskdfasda
Content-Disposition: form-data; name="小电影"; filename="mao1234.mp4"xxxxxxxxxxxxxxxxxxxxxxxxxxx.....一堆二进制代码
--------------- akldf kakfaskdfasda
Content-Disposition: form-data; name="参数1"3.1415926--------------- akldf kakfaskdfasda-- 也就是说,数据和数据之间是有分割字符串来区分其开始结束的。这样在你收到数据时,需要将数据(往往是多次Receive操作所累积起来的,因为中间会有类似“粘包”的数据)分解为多个独立的消息,再处理。
传文件的时候对文件的每块MD5执行验证,当传到Finish状态时,最后一次对两个文件的MD5做验证。如果相同就表示文件已经传输完毕