TCP通信传输数据问题:server发送但是为啥client收不到

问题描述

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次,除非有新的连接,否则代码不再执行了

时间: 2024-10-02 13:03:06

TCP通信传输数据问题:server发送但是为啥client收不到的相关文章

java tcp通信-JAVA TCP通信,客户端给服务器发送java对象时报错

问题描述 JAVA TCP通信,客户端给服务器发送java对象时报错 我在做JAVA TCP 编程时,我想实现客户端A与客户端B之间通过服务器C来通信,但是我通过客户端A给服务器发送消息时,我传送的是一个java对象MsgPackage类对象,我通过ObjectOutputStream.writeObject来传送,但是服务器去读取这个对象时报错了,没有能正确读取到客户端发送过来的对象,请各位大神指教一下.错误的消息是这样: java.lang.ClassNotFoundException: c

c#tcp协议通信问题,消息第一次发送无反应

问题描述 c#tcp协议通信问题,消息第一次发送无反应 先上代码 try { FileStream file = new FileStream(str0 + "init1.txt", FileMode.Open); for (int i = 0; (i * 18) < file.Length; i++) { file.Seek(i * 18, SeekOrigin.Begin); file.Read(byData, 0, 18); Decoder d = Encoding.Def

c#-安卓和C# 用TCP通信发送数据

问题描述 安卓和C# 用TCP通信发送数据 目前在做一个程序,安卓手机每一秒钟向PC机发送若干条数据,有可能一台机器发,也有可能若干台同时发,PC机用C#接收数据.我测试了一台安卓发数据可以正常接收,可是当若干台同时发数据的时候,就出现问题了.后来我发现不知道为什么,这些安卓设备的IP地址用DHCP自动获取IP的时候IP都是一样的,我想会不会就是因为两个相同IP的机器发送数据的时候,因为后来发后数据的机器会把原先正在发送的机器建立的TCP通信链接给关掉然后自己在发送数据,现在由于实验室路由器比较

《Android智能穿戴设备开发指南》——第6章,第6.2节使用TCP协议传输数据

6.2 使用TCP协议传输数据Android智能穿戴设备开发指南TCP/IP通信协议是一种可靠的网络协议,能够在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信.Java语言对TCP网络通信提供了良好的封装,通过Socket对象代表两端的通信端口,并通过Socket产生的IO流进行网络通信.本章将详细讲解Java应用中TCP编程的基本知识. 6.2.1 使用ServletSocket在Java程序中,使用类Se

android tcp通信如何做到心跳管理

问题描述 android tcp通信如何做到心跳管理 我想实现一个TCP通信:点击登陆后将用户名和密码打包(包为bytes)发送给服务器后,服务器发送包给客户端.登陆成功后还需要做两个动作:1.客户端没隔30S给客户端发送一次bytes :2.当服务器有数据过来时,客户端自动接收数据.现在的问题是我是做两个线程还是做一个线程呢.我做了两个线程,一个接一个发,但是我怎么实现第二点呢.哪位大神可以给我点详细的指点么.本人新手,菜鸟一个.跪求大神指点. 解决方案 获取输入流,用read方法返回值判断是

tcp-C# 如何使用socket实现基于TCP协议传输数据

问题描述 C# 如何使用socket实现基于TCP协议传输数据 我使用Socket.Send和Socket.BeginReceive完成了上位机通讯软件的编写,但是连接下位机经过分析抓包软件得到的数据包,发现似乎与标准TCP协议有出入.具体来讲是这样的: 首先根据TCP协议,数据交换的规范应该是这样的http://blog.csdn.net/moonhnney/article/details/5604677 数据交换: a ---->b a 发送数据完毕,(PSH,ACK) aseq = x,a

Linux下TCP通信简单实例

基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bind) (3)将套接字设为监听模式,准备接收客户端请求(listen) (4)等待客户请求到来:当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept) (5)用返回的套接字和客户端进行通信(send/recv) (6)返回,等待另一个客户请求. (7)关闭套接字. 客户端的流程如下: (1)创建套接字(soc

Linux TCP通信出现CLOSE_WAIT后导致服务端进程挂掉

在前文中讲述了Linux服务端TCP通信出现CLOSE_WAIT状态的原因,这篇文章主要通过一个实例演示它个一个"恶劣"影响:直接使服务端进程Down掉. CentOS服务端建立监听端口 1 CentOS服务端建立监听端口 如上图所示,在虚拟机CentOS7服务器(192.168.1.178)中打开一个终端界面,建立8000端口的监听服务(PID:13035).所用代码如下,和上一篇文章中的程序大体一样,只是多了一个SIGPIPE信号处理以及自动回复(Auto response fro

tcp连续传输数据getlastError 122

问题描述 tcp连续传输数据getlastError 122 struct { double a; double b;}WS;struct { WS[200000]; double num;}MS; 连续传输MS结构体数据发生接收不到数据现象,getlasterror后 错误122.求帮助 解决方案 调用发送tcp发送函数的返回值是多少???建议用鲨鱼工具网络抓包分析比较擅长这块有疑问可以在我博客上留言或者给我发邮件