问题描述
TCP通信传输数据问题:server发送但是为啥client收不到?服务端程序如下:while(!endThread){#region随机数#ifdefineRandomrandom=newRandom();#endif#endregiontry{if(!tcpListener.Pending())//确定是否有挂起的连接请求,确定尝试接收连接之前是否有可用的连接{GetState(false);}else{tcpClient=tcpListener.AcceptTcpClient();//侦听开始后,接收挂起的链接请求,接受连接stream=tcpClient.GetStream();//从tcpClient中获取数据流tcpClient.ReceiveTimeout=10000;//设置接收数据的超时时间GetState(true);if(stream.DataAvailable)//有可用数据stream.Read(reB,0,reB.Length);//发送数据给fstif(!(reB[0]==1))//读取数值不为1{//GetState(false);Console.WriteLine("没有收到数据1--------");}else{random.NextBytes(msg);//msg=Data;for(inti=0;i<msg.Length;i++)msg[i]=100;lock(stream){stream.Write(msg,0,msg.Length);//发送数据}//Console.WriteLine("第一位:{0}",(char)msg[0]);Thread.Sleep(500);try{if(stream.DataAvailable)//有可用数据{recBytesLength=stream.Read(recBytes,0,recBytes.Length);//从0到1024读取的数据放入缓存区recBytes中char[]charbytes1=newchar[4];//读取ReadstringreadFlag="";Console.WriteLine("读取字符串:");for(intj=0;j<4;j++)//读取文件名字{charbytes1[j]=(char)recBytes[j];readFlag+=charbytes1[j].ToString();Console.Write("{0}",readFlag[j]);}if(readFlag=="Read"){sendfile();//读取文件for(inti=0;i<readFileBytes.Length;i++)msg[i]=readFileBytes[i];try{lock(stream){stream.Write(readFileBytes,0,readFileBytes.Length);//发送数据}Console.WriteLine("发送数据Config.ini文件完成");}catch(Exceptione){Console.WriteLine("+++++++++++____________----------{0}",e);}//Thread.Sleep(100);}else{for(inti=0;i<10;i++)Console.WriteLine("读取的数据{0}",recBytes[i].ToString());WriteToFile();}}//connectFlag=true;//和FST连接成功reB[0]=0;//清零}catch(Exceptione){Console.WriteLine("+++++++++++"+e);GetState(false);//tcpClient.Close();}}stream.Close();tcpClient.Close();}}catch(Exceptione){Console.WriteLine("Exception---------------:{0}",e);GetState(false);}}从客户端发送过来数据能读到Read,然后能运行到stream.Write(readFileBytes,0,readFileBytes.Length);但是在客户端收到的数据却是lock(stream){stream.Write(msg,0,msg.Length);//发送数据}发送的数据。谁帮我看看问题出在哪了?太感谢了
解决方案
解决方案二:
有谁跟看看谢谢
解决方案三:
你把格式排版一下好不--
解决方案四:
您帮我一下,怎么格式排版?我没有用过
解决方案五:
TCP通信传输数据问题:server发送但是为啥client收不到?服务端程序如下:while(!endThread){#region随机数#ifdefineRandomrandom=newRandom();#endif#endregiontry{if(!tcpListener.Pending())//确定是否有挂起的连接请求,确定尝试接收连接之前是否有可用的连接{GetState(false);}else{tcpClient=tcpListener.AcceptTcpClient();//侦听开始后,接收挂起的链接请求,接受连接stream=tcpClient.GetStream();//从tcpClient中获取数据流tcpClient.ReceiveTimeout=10000;//设置接收数据的超时时间GetState(true);if(stream.DataAvailable)//有可用数据stream.Read(reB,0,reB.Length);//发送数据给fstif(!(reB[0]==1))//读取数值不为1{//GetState(false);Console.WriteLine("没有收到数据1--------");}else{random.NextBytes(msg);{stream.Write(msg,0,msg.Length);//发送数据}Thread.Sleep(500);try{if(stream.DataAvailable)//有可用数据{recBytesLength=stream.Rea(recBytes,0,recBytes.Length);char[]charbytes1=newchar[4];//读取ReadstringreadFlag="";Console.WriteLine("读取字符串:");for(intj=0;j<4;j++)//读取文件名字{charbytes1[j]=(char)recBytes[j];readFlag+=charbytes1[j].ToString();Console.Write("{0}",readFlag[j]);}if(readFlag=="Read"){sendfile();//读取文件try{lock(stream){stream.Write(readFileBytes,0,readFileBytes.Length);//发送数据}Console.WriteLine("发送数据Config.ini文件完成");}catch(Exceptione){Console.WriteLine("+++++++++++____________----------{0}",e);}}else{for(inti=0;i<10;i++)Console.WriteLine("读取的数据{0}",recBytes[i].ToString());WriteToFile();//向文件写数据}}reB[0]=0;//清零}catch(Exceptione){Console.WriteLine("+++++++++++"+e);GetState(false);}}stream.Close();tcpClient.Close();}}catch(Exceptione){Console.WriteLine("Exception---------------:{0}",e);GetState(false);}}从客户端发送过来数据能读到Read,然后能运行到stream.Write(readFileBytes,0,readFileBytes.Length);但是在客户端收到的数据却是lock(stream){stream.Write(msg,0,msg.Length);//发送数据}发送的数据。谁帮我看看问题出在哪了?太感谢了格式不大好,将就着看吧,谢谢
解决方案六:
没办法,先帮你排版吧while(!endThread){#region随机数#ifdefineRandomrandom=newRandom();#endif#endregiontry{if(!tcpListener.Pending())//确定是否有挂起的连接请求,确定尝试接收连接之前是否有可用的连接{GetState(false);}else{tcpClient=tcpListener.AcceptTcpClient();//侦听开始后,接收挂起的链接请求,接受连接stream=tcpClient.GetStream();//从tcpClient中获取数据流tcpClient.ReceiveTimeout=10000;//设置接收数据的超时时间GetState(true);if(stream.DataAvailable)//有可用数据stream.Read(reB,0,reB.Length);//发送数据给fstif(!(reB[0]==1))//读取数值不为1{//GetState(false);Console.WriteLine("没有收到数据1--------");}else{random.NextBytes(msg);//msg=Data;for(inti=0;i<msg.Length;i++)msg[i]=100;lock(stream){stream.Write(msg,0,msg.Length);//发送数据}//Console.WriteLine("第一位:{0}",(char)msg[0]);Thread.Sleep(500);try{if(stream.DataAvailable)//有可用数据{recBytesLength=stream.Read(recBytes,0,recBytes.Length);//从0到1024读取的数据放入缓存区recBytes中char[]charbytes1=newchar[4];//读取ReadstringreadFlag="";Console.WriteLine("读取字符串:");for(intj=0;j<4;j++)//读取文件名字{charbytes1[j]=(char)recBytes[j];readFlag+=charbytes1[j].ToString();Console.Write("{0}",readFlag[j]);}if(readFlag=="Read"){sendfile();//读取文件for(inti=0;i<readFileBytes.Length;i++)msg[i]=readFileBytes[i];try{lock(stream){stream.Write(readFileBytes,0,readFileBytes.Length);//发送数据}Console.WriteLine("发送数据Config.ini文件完成");}catch(Exceptione){Console.WriteLine("+++++++++++____________----------{0}",e);}//Thread.Sleep(100);}else{for(inti=0;i<10;i++)Console.WriteLine("读取的数据{0}",recBytes[i].ToString());WriteToFile();}}//connectFlag=true;//和FST连接成功reB[0]=0;//清零}catch(Exceptione){Console.WriteLine("+++++++++++"+e);GetState(false);//tcpClient.Close();}}stream.Close();tcpClient.Close();}}catch(Exceptione){Console.WriteLine("Exception---------------:{0}",e);GetState(false);}}
解决方案七:
lock(stream){stream.Write(msg,0,msg.Length);//发送数据}你写到最前面了,当然最先执行,执行完了才执行后面的
解决方案八:
我用Read判断了,当执行stream.Write(msg,0,msg.Length);后,不是再执行stream.Write(readFileBytes,0,readFileBytes.Length);吗?完了才是下一轮吧
解决方案九:
引用7楼u010445844的回复:
我用Read判断了,当执行stream.Write(msg,0,msg.Length);后,不是再执行stream.Write(readFileBytes,0,readFileBytes.Length);吗?完了才是下一轮吧
你服务端发送了2次,客户端也必须接收2次啊只接收一次,当然只能接到第一次发送的内容
解决方案十:
还有,你服务端的逻辑是:先接收请求,然后返回个msg间隔500ms,再次接收请求,返回数据所以你客户端必须是这样:发送请求,接收msg,在500ms之内马上再发送请求,然后才能收到数据设计不合理,万一通信有点慢,或者客户端处理逻辑慢,没能在500ms之内发送,服务端就超时不能收到请求了.应该做成,服务端异步侦听,不管客户端何时发送都应该能收到然后两次接收和发送的地方做判断,如果第一次发送正确,就响应第二次发送,否则不响应.
解决方案十一:
哦,这样啊,那做成同步侦听的话应该也没有问题吧,对于传输数据要求不高。之后做实验发现在发送前再加上tcpClient=tcpListener.AcceptTcpClient();stream=tcpClient.GetStream();z这两句就可以是不是就是说服务端超时不能收到请求了
解决方案十二:
我觉得你还是上网找个服务端-客户端的例子好好看看吧不能老凭感觉瞎写啊.很明显tcpListener.AcceptTcpClient();这句话干什么用的你都没搞明白
解决方案十三:
tcpListener.AcceptTcpClient();不是等待接受挂起的连接请求吗?如果没有请求就等待,阻止方法,那应该怎么用?
解决方案十四:
引用12楼u010445844的回复:
tcpListener.AcceptTcpClient();不是等待接受挂起的连接请求吗?如果没有请求就等待,阻止方法,那应该怎么用?
是连接请求,不是发送数据的请求,实际上就是对应客户端的connect方法,客户端connect,服务端就开始响应请求而你后面又是全部用的同步,而且不是开线程while循环里同步,而是直接写在Accept后面,加了sleep和超时于是,你客户端如果connect之后,超时之前,没有发送数据,除非断开连接重新连,否则不会有响应了而如果发送了第一个数据之后,没有在超时之前发送第二组数据,也不会再有响应了这些你上网好好找找服务端-客户端的代码,有很多例子的不要凭想象随便写啊.
解决方案十五:
然后你这种写法,就只能连接-发送-接收-发送-接收-断开想连接一次,就不断的发送接收,是不可能了因为服务端Accept之后,只固定receive2次,除非有新的连接,否则代码不再执行了