http://www.cnblogs.com/tianzhiliang/archive/2010/09/08/1821623.html我用到这篇贴子的部分代码,不过我的服务器端是两个socketasynceventargs对象一个发送一个接收.下面是接收的方法...
private
void
ProcessReceive(SocketAsyncEventArgs e)
{
if
(e.LastOperation != SocketAsyncOperation.Receive)
return
;
if
(e.BytesTransferred > 0)
{
if
(e.SocketError == SocketError.Success)
{
Int32 byteTransferred = e.BytesTransferred;
string
received = Encoding.Unicode.GetString(e.Buffer, e.Offset,byteTransferred);
if(ms.Read(out socketHander)//ms是以流的方式对数据进行验证,返回一个socketHander对象,并且ms是针对每一个客户端创建的
{
OnMsgReceived(((MySocketAsyncEventArgs)e).UID, socketHander);
}
Boolean willRaiseEvent = (e.UserToken
as
Socket).ReceiveAsync(e);
if
(!willRaiseEvent)
ProcessReceive(e);
}
}
else
this
.CloseClientSocket(((MySocketAsyncEventArgs)e).UID);
}
我现在的问题是,如果有多个客户端同时发送文件,一个文件的大小为10M左右,当一个用户的发送的文件还没有接收完成时,收到另外一个客户端的发送,会产生串包的问题,将不是该文件的流写入进去.请问在这方面有什么好的处理方法。。
這個 本來是多線程的哦。socket,你接到一個連接開一個線程。有公用的東西嗎?
用的socketasynceventargs池
@youngjunzhou: 那也是 轉換到一個一個socket的。因此不會亂的。
lock
(
this
)
{
Socket socket = (args.UserToken
as
State).socket;
if
(socket.Connected)
{
socket.InvokeAsyncMethod(socket.ReceiveAsync,
ReceivedCompleted, args);
}
}
@無限遐想: 你要用異步調用哦。
@無限遐想: 是的不会乱,它已经自动处理了每个socket的接收,但现在我又一个新问题,就是在接收的时候,一个文件还没有传输完成,这个ProcessReceive
()方法就接收不到数据了.这是怎么回事呢..?
@youngjunzhou: 你 讀取 重新 用一個方法,開線程,不要用這個方法。
@無限遐想: 你是说这个内部定义的自动循环接收的方法不可靠吗?就用一个线程来持久监听吗?这样这个线程会不会占用很多的CPU呢,必竟他要 while(true)
{
......
ProcessReceive
();
}
@無限遐想: 有没有什么好的方法,如果它这儿收不到数据的话,整个传输就停止了,项目紧急啊。。
@youngjunzhou: 我大致看了一下。你給的網站,這個 應該是單線程的。就是同時,只能有一個客戶端上傳。他沒有把 ProcessAccept 這個方法 ,放入另一個線程的。
@無限遐想:
for (int i =0; i < m_numConnections; i++)
{
//Pre-allocate a set of reusable SocketAsyncEventArgs
readWriteEventArg =new SocketAsyncEventArgs();
readWriteEventArg.Completed +=new EventHandler<SocketAsyncEventArgs>(IO_Completed);
readWriteEventArg.UserToken =new AsyncUserToken();
// assign a byte buffer from the buffer pool to the SocketAsyncEventArg object
m_bufferManager.SetBuffer(readWriteEventArg);
// add SocketAsyncEventArg to the pool
m_readWritePool.Push(readWriteEventArg);
}
这里是初始化了连接池的,就是开始初始化了设定的N个连接,每个连接都是一个readWriteEventArg ,所以他们之间是不会交叉的。。也就是多线程
@youngjunzhou: 我知道。處理socket是多線程的。可是,處理接受的 數據的時候,你看看。就不對了。
@無限遐想: 那你 怎麼處理的呢?
@無限遐想: 我现在是用的它内部的循环机制啊。。让它接收数据,但是有时prossReceive这儿容易断掉,你说的是要在哪儿开一个线程。。你指一下哪个方法,谢谢。。
@youngjunzhou: socket.InvokeAsyncMethod(socket.ReceiveAsync,
ReceivedCompleted, args);
@無限遐想: 好的,谢谢,我去试试!