欢迎光临
我们一直在努力

Socket编程项目之后经验谈-.NET教程,面向对象编程

建站超值云服务器,限时71元/月

我们的项目是用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连接就可以了,当然实际应用中,可能就要自己写规则了

这些问题解决了,只要做适当的处理,视频,声音都不是问题了。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » Socket编程项目之后经验谈-.NET教程,面向对象编程
分享到: 更多 (0)