Socket服务器端接收数据怎么只接收第一次,后面就不接收了

问题描述

各位大神,现在我做的一个winform控制系统,从测试客户端发送数据到服务器端,为什么只是第一次能够接收到数据后面就没反应了,这个问题苦恼了我很久,请帮我看一下,服务器端界面设计和代码如下所示,测试客户端是一个测试工具。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Text.RegularExpressions;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Threading;namespace路灯控制系统{publicpartialclassForm1:Form{ThreadthreadWatch=null;//负责监听客户端连接请求SocketsocketWatch=null;Dictionary<string,Socket>dictSocket=newDictionary<string,Socket>();Dictionary<string,Thread>dictThread=newDictionary<string,Thread>();publicForm1(){InitializeComponent();TextBox.CheckForIllegalCrossThreadCalls=false;//可以跨线程调用}//16进制字符串转字节数组privatestaticbyte[]strToToHexByte(stringhexString){hexString=hexString.Replace("","");if((hexString.Length%2)!=0)hexString+="";byte[]returnBytes=newbyte[hexString.Length/2];for(inti=0;i<returnBytes.Length;i++)returnBytes[i]=Convert.ToByte(hexString.Substring(i*2,2),16);returnreturnBytes;}///<summary>///字节数组转16进制字符串///</summary>///<paramname="bytes"></param>///<returns></returns>publicstaticstringbyteToHexStr(byte[]bytes){stringreturnStr="";if(bytes!=null){for(inti=0;i<bytes.Length;i++){returnStr+=bytes[i].ToString("X2");}}returnreturnStr;}privatevoidbtnBeginListen_Click(objectsender,EventArgse){//首先创建负责监听的套接字socketWatch=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建本地IP对象IPAddressip=IPAddress.Parse(txtIP.Text.Trim());//创建包含服务器本地监听端口的EndPointIPEndPointendPoint=newIPEndPoint(ip,Convert.ToInt32(txtPort.Text.Trim()));try{//绑定要监听的服务器端口socketWatch.Bind(endPoint);}catch(Exceptionex){MessageBox.Show(ex.ToString());return;}socketWatch.Listen(100);threadWatch=newThread(WatchConnecting);threadWatch.IsBackground=true;threadWatch.Start();ShowMsg("服务器启动成功!");}///<summary>///监控客户端传来的信息///</summary>privatevoidWatchConnecting(){//应用循环不间断地监控客户端传来的连接请求while(true){//开始监听客户端请求,accept会阻断当前线程,要注意SocketsocketConnection=socketWatch.Accept();//一旦监听到客户端的连接请求,就新生成一个客户端相关的套接字//向客户端连接列表控件listbbox中添加建立连接的客户端lbOnline.Items.Add(socketConnection.RemoteEndPoint.ToString());//将成功连接的套接字添加进列表中去dictSocket.Add(socketConnection.RemoteEndPoint.ToString(),socketConnection);ShowMsg("客户端连接成功!");Threadth=newThread(ReceiveMsg);th.IsBackground=true;th.Start(socketConnection);dictThread.Add(socketConnection.RemoteEndPoint.ToString(),th);}}///<summary>///在文本框显示提示信息///</summary>///<paramname="str"></param>privatevoidShowMsg(stringstr){txtMsg.AppendText(str+"rn");}///<summary>///接收连接客户端传过来的数据///</summary>///<paramname="socketConnection">客户端套接字</param>privatevoidReceiveMsg(objectsocketConnection){SocketsocketClient=(Socket)socketConnection;while(true){//定义一个2M的缓存区,将接收的数据存入其中byte[]arrMsgRec=newbyte[2*1024*1024];intlength=-1;try{length=socketClient.Receive(arrMsgRec);//接收客户端传过来的数据并且返回数据长度}catch(SocketExceptionex){ShowMsg("客户端连接异常:"+ex.ToString());dictSocket.Remove(socketClient.RemoteEndPoint.ToString());dictThread.Remove(socketClient.RemoteEndPoint.ToString());lbOnline.Items.Remove(socketClient.RemoteEndPoint.ToString());//MessageBox.Show(ex.ToString());break;}if(length>0){stringstr="接收信息如下:"+byteToHexStr(arrMsgRec).Substring(0,length*2);ShowMsg(str);}socketClient.Close();}}///<summary>///发送消息///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbtnSend_Click(objectsender,EventArgse){stringstrMsg=txtMsgSend.Text.Trim();byte[]arrSendMsg=strToToHexByte(strMsg);//将要发送的字符串转换成16进制字节数组;stringstrKey="";strKey=lbOnline.Text.Trim();if(string.IsNullOrEmpty(strKey))//判断是不是选择了发送的对象;{MessageBox.Show("请选择你要发送的好友!!!");}else{dictSocket[strKey].Send(arrSendMsg);//解决了sokConnection是局部变量,不能再本函数中引用的问题;ShowMsg("发送信息:"+strMsg);txtMsgSend.Clear();}}}}

解决方案

解决方案二:
socketClient.Close();关了干嘛
解决方案三:
引用楼主zz801028的回复:

各位大神,现在我做的一个winform控制系统,从测试客户端发送数据到服务器端,为什么只是第一次能够接收到数据后面就没反应了,这个问题苦恼了我很久,请帮我看一下,服务器端界面设计和代码如下所示,测试客户端是一个测试工具。

你先Receive,然后Close,不就是这两步吗?!
解决方案四:
编程序是雕虫小技,我们就看看一个人能不能画出流程图就行了。如果不会画流程图,那么他贴的代码也就是不知道从哪里抄来的,而他需要学习的东西,其实是流程图。
解决方案五:
引用1楼u010868852的回复:

socketClient.Close();关了干嘛

最开始是没有关的,不过也只能接受一次。
解决方案六:
引用2楼sp1234的回复:

Quote: 引用楼主zz801028的回复:
各位大神,现在我做的一个winform控制系统,从测试客户端发送数据到服务器端,为什么只是第一次能够接收到数据后面就没反应了,这个问题苦恼了我很久,请帮我看一下,服务器端界面设计和代码如下所示,测试客户端是一个测试工具。

你先Receive,然后Close,不就是这两步吗?!

化繁为简,简单滴说就是这两步。关键是我不知道到底哪儿出了问题,第一次以后的接受信息调试一点反应都没有。出错不可怕,知道错误在哪就好说,现在才接触socket编程,可能对你们来说很简单的问题我看不出来。我把另外一位兄弟说的socketClient.Close();之前也删掉测试过,一样的。
解决方案七:
总之接收是在Receive这一步进行的,你收不到就意味着流程没有走到这里既然你懂调试,就应该看程序跑到哪一步了,为什么跑不到Receive
解决方案八:
一样的问题才解决了SocketsocketConnection=socketWatch.Accept();//一旦监听到客户端的连接请求,就新生成一个客户端相关的套接字但是Accept()是堵塞的,就算你不循环他他也是在没有接受到服务端的请求的时候一直堵塞在那里,接受到了请求,就回创建(返回)一个socket的实例为什么会出现只有第一次接受到数据是因为你返回那个socket没有关闭在什么时候关闭在你第一次得到用户请求然后处理好了数据然后这次的事情已经做完了以后在关闭(close)socket注意是最后才关闭socket

时间: 2024-09-29 09:15:54

Socket服务器端接收数据怎么只接收第一次,后面就不接收了的相关文章

缓存-关于串口接收数据缓冲问题

问题描述 关于串口接收数据缓冲问题 我用串口测试实时接收一个2k采样率的正弦波并显示波形,不管是我自己写的程序还是Labview 都出现了同一个问题,就是一开始波形的频率是对的,然后我进入中断一会,回来继续接收数据 感觉波形被压缩了一样,突然来了一大堆数据,过一会就会恢复正常.这是缓存区哪里的问题呢?接收缓冲,传输缓冲? 解决方案 接收缓冲吧,数据没被处理. 解决方案二: 在中断时,串口设备还在不断的发送数据: 中断结束,恢复正常时:接收缓存区有一大堆数据,这时你有两种处理方式: 1.把这些数据

客户端Socket接收数据问题,跪求,谢谢,只要帮忙解决问题,可以付费的

问题描述 C#代码如下,客户端并发大概几百,以下代码会造成数据丢失吗?怎么呢保证完整接收数据呢,服务器端要求按照4个字节接收,按照我自己写的代码,循坏次数太多导致效率低下,怎么修改代码呢?List<byte> listByte = new List<byte>();//装载接收到的数据byte[] bytes;if (listByte.Count != 0){  listByte.Clear(); } while (true) {  bytes = new byte[1024]; 

socket接收数据问题

问题描述 第一次做socket,想知道用一个缓存区间接收数据是不是除了最后一次接收的数据有可能小于缓冲区的大小,前面几次每次都接收的是缓冲区大小,假如报文长度为5000个字节,我每次用1024字节的缓冲区接收,前面4次都是1024,只有最后一次小于1024,能不能这么理解 解决方案 解决方案二:不一定如果你是udp协议那么你包大小是多少发送过去接收就是多少如果你接收端的缓存小于发送包大小直接异常如果你是tcp协议那么就不一样了有可能你第一次只收到1000而不是1024这就看网络情况了解决方案三:

关于socket接收数据问题

问题描述 用的unity,c#写的,请问一下各位大神代码接收数据的问题,不知道为什么只能接收一次服务端返回的数据无法接受第二次!!!!整了半天也没弄懂,代码如下,注册功能:publicUIInputusername;publicUIInputpassword;publicclassStateObject{//Clientsocket.publicSocketworkSocket=null;//Sizeofreceivebuffer.publicconstintBufferSize=1024;//

asp.net c#.net Tcp socket 接收数据代码

asp教程.net c#.net tcp socket 接收数据代码  //监听网络          public bool opennet(string sport)        {             processor = new thread(new threadstart(startlistening));//新建监听线程             processor.priority = threadpriority.normal;             processor.

C# socket networkstream 接收数据

问题描述 C# socket networkstream 接收数据 最近在做c/s,客户端用C#的Socket进行通信.接收数据开单独的接收线程使用networkstream进行接收接收的方法大体上跟网上流传的一样do{ int readSize = mNetworkstream.Read(bytes 0 1024); if (readSize > 0) { //do sth }}while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测

Asp.net Socket客户端(远程发送和接收数据)_实用技巧

复制代码 代码如下: /*************************************** * 对象名称: SocketObj * 功能说明: 远程发送与接收 * 试用示例: * using EC; //引用空间名 * string url = "218.75.111.74"; // URL也可以是(http://www.baidu.com/)这种形式 * int port = 8000; //端口 * string SendStr = "domainname\n

Socket接收数据包

问题描述 我用socket接收数据,发送端发送了2000个字节的数据包,但是服务器接收数据包的时候接收的是两个被分开的数据包,但是这两个数据包的总和加起来是4973.后来我在大神的指导下,能接受一个完整的数据包,但是接收的这个数据包长度还是4973个.请问这是什么原因?谢谢 解决方案 解决方案二:最好不要发送太大的数据包解决方案三:从你的问题看不出问题出在哪里.你可以在我贴出的一个例子的基础上做扩展和封装.在这个底层没有必要自己写.解决方案四:tcp发送的数据的大小,根据你的业务信令具体的实例而

socket服务器端接收不到sokit工具客户端发送来的信息

问题描述 socket服务器端接收不到sokit工具客户端发送来的信息 try { ServerSocket serverSocket =new ServerSocket(1086); while (true) { Socket socket = serverSocket.accept(); BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream())); Stri