我们的项目是用DotNet实现Socket连接用多线程处理多用户我就谈一下在实现过程中遇到的问题下面是我服务器的简化实现 privateSocketclientSocket; publicvoidStart() { Threadthread=newThread(newThreadStart(MainService)); threadStart(); } voidMainService() { listener=newTcpListener(); listenerStart(); while(true) { Sockets=listenerAcceptSocket();//帧听客户连接 clientSocket=s; Threadclientservice=newThread(newThreadStart(ClientService)); clientserviceStart(); ThreadSleep();//等待传值给线程中的变量防止多用户造成沖突 } } voidClientService() { stringcommand; stringreceiveStr; stringfileNamefileSize; Socketsock=clientSocket; EndPointoldEP=sockRemoteEndPoint; byte[]bb=newbyte[]; while(true) { ii=sockReceiveFrom(bbrefoldEP);//接收数据 if(ii==)//客户端连接断开就会不停接收个字节 { break; } receiveStr=EncodingDefaultGetString(bbbbLength); command=ReadLineFrom(receiveStr)ToLower();//ReadLineFrom读取字符串中的一行数据 Switch(command) { caceupload: fileName=ReadLineFrom(receiveStr); fileSize=ReadLineFrom(receiveStr); uploadFile(sockfileNameIntParse(fileSize));//接受数据方法 break; } } voiduploadFile(SocketsockstringfileNameintfileSize) { intloadSize=; byte[]bb; intblen=; NetworkStreamstream=newNetworkStream(sock); FileStreamfs=FileOpenWrite(tempstr); while(loadSize{ if(loadSize>fileSize) blen=fileSizeloadSize; bb=newbyte[blen]; intii=streamRead(bbbbLength);//实际接受数据时每次可能没有个字节 fsWrite(bbii); loadSize+=ii; } fsClose(); streamClose(); } 等待传值给线程中的变量防止多用户造成沖突 客户端连接断开就会不停接收个字节 判断客户端是否断开要用这个方法实现Sokcet里带的Connected不起作用只要连接上中途不出现发送和或接收数据错误客户断开与否都是返回truePoll(SelectMode)返回任何模式都是true 实际接受数据时每次可能没有个字节 客户端我就不写了用TcpClient连接就可以了当然实际应用中可能就要自己写规则了 这些问题解决了只要做适当的处理视频声音都不是问题了 |