我们的项目是用dotnet实现socket连接,用多线程处理多用户。我就谈一下在实现过程中遇到的问题。下面是我服务器的简化实现。
private socket clientsocket;
public void start()
{
thread thread=new thread(new threadstart(mainservice));
thread.start();
}
void mainservice()
{
listener=new tcplistener(111111);
listener.start();
while(true)
{
socket s= listener.acceptsocket();//帧听客户连接
clientsocket=s;
thread clientservice = new thread(new threadstart(clientservice));
clientservice.start();
thread.sleep(200);//1、等待传值给线程中的变量,防止多用户造成冲突
}
}
void clientservice()
{
string command;
string receivestr;
string filename,filesize;
socket sock=clientsocket;
endpoint oldep=sock.remoteendpoint;
byte[] bb=new byte[200];
while(true)
{
ii=sock.receivefrom(bb,ref oldep);//接收数据
if(ii==0)//2、客户端连接断开,就会不停接收0个字节
{
break;
}
receivestr=encoding.default.getstring(bb,0,bb.length);
command=readlinefrom(receivestr,1).tolower();//readlinefrom读取字符串中的一行数据
switch(command)
{
cace “upload“:
filename=readlinefrom(receivestr,2);
filesize=readlinefrom(receivestr,3);
uploadfile(sock,filename,int32.parse(filesize));//接受数据方法,
break;
………………..
}
}
void uploadfile(socket sock,string filename,int filesize)
{
int loadsize=0;
byte[] bb;
int blen=102400;
networkstream stream=new networkstream(sock);
filestream fs=file.openwrite(tempstr);
while(loadsize<filesize)
{
if(loadsize>filesize-102400)
blen=filesize-loadsize;
bb=new byte[blen];
int ii=stream.read(bb,0,bb.length);//3、实际接受数据时每次可能没有10240个字节
fs.write(bb,0,ii);
loadsize+=ii;
}
fs.close();
stream.close();
}
1、等待传值给线程中的变量,防止多用户造成冲突
2、客户端连接断开,就会不停接收0个字节
判断客户端是否断开要用这个方法实现,sokcet里带的connected不起作用,只要连接上,中途不出现发送和或接收数据错误,客户断开与否都是返回true。poll(100,selectmode…)返回任何模式都是true。
3、实际接受数据时每次可能没有10240个字节
客户端我就不写了,用tcpclient连接就可以了,当然实际应用中,可能就要自己写规则了
这些问题解决了,只要做适当的处理,视频,声音都不是问题了。
