C#中的socket的用到while(true)为什么不是一直循环

问题描述

在服务器端用到while(true)循环读取客户端发来的数据,在accept方法之后用while(true)来循环读取客户端发送数据过来,断点发现只有客户端发数据过来才能进入这个循环,而且客户端发来的数据只有第一次是正确的,以后每次发来的数据在服务器端看都是第一次的数据,服务器代码如下usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net.Sockets;usingSystem.Net;usingSystem.Threading;namespace_507NetChatServer{publicpartialclassForm1:Form{IPAddressHostIP;SocketAcceptSo,So;stringstr;byte[]mbyte=newbyte[1024];publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){Control.CheckForIllegalCrossThreadCalls=false;try{HostIP=IPAddress.Parse("192.168.1.114");IPEndPointpoint=newIPEndPoint(HostIP,Int32.Parse("16666"));//实例化Socket对象So=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);So.Bind(point);So.Listen(50);Threadthread=newThread(newThreadStart(process));thread.Start();}catch(Exceptionex){MessageBox.Show("连接时:"+ex.Message);}}privatevoidbutton1_Click(objectsender,EventArgse){}voidprocess(){AcceptSo=So.Accept();while(true){if(AcceptSo!=null&&AcceptSo.Connected==true){Array.Clear(mbyte,0,mbyte.Length);AcceptSo.Receive(mbyte,mbyte.Length,0);str+=Encoding.BigEndianUnicode.GetString(mbyte);this.richTextBox2.AppendText(str);}//AcceptSo.Close();}}privatevoidbutton2_Click(objectsender,EventArgse){try{Byte[]SendByte;stringSendStr=So.LocalEndPoint+":"+this.richTextBox1.Text+"";SendByte=Encoding.BigEndianUnicode.GetBytes(SendStr.ToCharArray());AcceptSo.Send(SendByte,SendByte.Length,0);}catch(Exceptionex){MessageBox.Show("发送时:"+ex.Message);}}privatevoidForm1_FormClosing(objectsender,FormClosingEventArgse){if(AcceptSo!=null&&AcceptSo.Connected==true){AcceptSo.Close();}if(So.Connected==true){So.Close();}}}}

解决方案

解决方案二:
voidprocess(){while(true){AcceptSo=So.Accept();if(AcceptSo!=null&&AcceptSo.Connected==true){Array.Clear(mbyte,0,mbyte.Length);AcceptSo.Receive(mbyte,mbyte.Length,0);str+=Encoding.BigEndianUnicode.GetString(mbyte);this.richTextBox2.AppendText(str);}//AcceptSo.Close();}}

解决方案三:
Receive的时候会返回字节数,如果是0表示连接要断开了.不能总使用整个mbyte来显示,因为填不满的时候会有前一次的数据残留.而且mbyte不能放在外层共用,要放在while(true)上这样每个连接的数据互不干扰.AcceptSo不能放在外层共用,新的连接会把前面的覆盖,前面的就丢了.
解决方案四:
AcceptSo=So.Accept();

主要是这句代码:为新建连接创建新的Socket,也就是只有连接上且有数据发过来,代码待会往下走,也就是走到你的while里去,就是这么设计的。
解决方案五:
引用3楼sudazf的回复:

AcceptSo=So.Accept();

主要是这句代码:为新建连接创建新的Socket,也就是只有连接上且有数据发过来,代码待会往下走,也就是走到你的while里去,就是这么设计的。

这个时候假使我又有另一个客户端过来链接,或者我的客户端断开再链接,是不是就无法链接了?因为我的AcceptSo=So.Accept();在整个代码中就执行了一次。
解决方案六:
引用4楼zcguoji的回复:

Quote: 引用3楼sudazf的回复:
AcceptSo=So.Accept();

主要是这句代码:为新建连接创建新的Socket,也就是只有连接上且有数据发过来,代码待会往下走,也就是走到你的while里去,就是这么设计的。

这个时候假使我又有另一个客户端过来链接,或者我的客户端断开再链接,是不是就无法链接了?因为我的AcceptSo=So.Accept();在整个代码中就执行了一次。

socket针对你的IP+port进行监听,换了客户端ip或者端口来连接,不执行重新绑定,肯定是无法连接了,网络断开肯定也不行了。

时间: 2025-01-26 23:58:15

C#中的socket的用到while(true)为什么不是一直循环的相关文章

用.net中的socket实现文件传输

socket是网络套接字,使用它我们可以很方便的实现网络的数据传输.在.net中提供了socket类来帮助开 发者调用socket的使用,从而避免了调用socket的动态库来实现socket的麻烦.下面我们就来看一个简单的例子,从这个简单的例子来看看.net中的socket类实现socket是多么的方便. 编程思路:在这个简单的例子中我们将通过socket来实现文件的网络传输和接收功能.要实现这两个功能我们需要通过vs.net建立两个实例来完成.一个发送端,一个接收端.由于文中已经给出了详细的注

JavaME中使用Socket通信基础应用

在JavaME的网络开发中,我们通常使用的两种网络通信协议是HTTP超文本传输协议和Socket套接字协议,但是由于HTTP是短连接,因此在某些手机中可能会出现不断出现连接网络的提示,因此很多时候我们通过Socket来实现网络连接.在Socket开发中,我们应用的比较多的是手机端与手机端之间的通信,还有手机与服务器的通信.下面分别简单归纳下两种通信的基本实现. 一.手机端与服务器端的Socket通讯我们通常需要在手机中实现某些功能,而这些功能需要服务器提供服务,因而在手机中需要建立与服务器之间的

php中关于socket的系列函数总结

  本文列举了所有关于PHP语言中使用socket相关服务的一些函数.注意使用如下函数之前,你需要确保你的socket已打开,如果你没有打开,请编辑你的php.ini文件,去掉下面这行前面的注释(分号): 代码如下: extension=php_sockets.dll 如果你无法去掉注释,那么请使用下面的代码来加载扩展库: 代码如下: if(!extension_loaded('sockets')){ if(strtoupper(substr(PHP_OS,3))=="WIN"){ d

Ruby中的Socket编程简单入门

  这篇文章主要介绍了Ruby中的Socket编程简单入门,是Ruby网络编程学习中的基础知识,需要的朋友可以参考下 Ruby提供了两个访问级别的网络服务.在一个较低的水平,可以访问底层的操作系统,它可以实现面向连接和无连接协议的客户端和服务器支持基本的socket. Ruby也具有程序库,提供更高级别的访问特定的应用程序级的网络协议,如FTP,HTTP等. 这篇教程介绍 Ruby Socket编程概念及讲解一个简单的实例. 什么是Sockets? 套接字是一个双向通信信道的端点.socket能

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

数据包-在win7中使用socket UDP 编程时,数据发送不出来

问题描述 在win7中使用socket UDP 编程时,数据发送不出来 各位大哥大姐,我在使用 socket 做 UDP编程时,遇到一个非常奇怪的问题 1,在win7下使用 sendto 函数发送数据时,sendto函数的返回值正常,但是有时候没有数据发送出来(抓不到数据包),但是当拔掉网线,重插一下就有数据了,但是待会儿就又没有了(这个不是网线接触不好,因为电脑上网一直正常) 2,同样程序,在XP系统里没有问题 求高手指点,感激不尽!!!!!

线程-android中UDP socket通信的问题

问题描述 android中UDP socket通信的问题 我使用两个线程,一个用来发送 数据,一个用来接收数据,先开启接收数据线程,接收到数据之后然后回应给对方,但是发送一直停在SocketAddess s=pacakge.getSocketAddess这一步,pacakge是接收到的包.接收线程是这样的:while(true){ socket.receive(packge);}接收到包之后我开启发送线程就卡在上面 那步了,是不是 socket在处于阻塞状态时不能发送数据包啊? 解决方案 默认是

读懂Java中的Socket编程(转)

Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的Socket编程,并且如何写一个客户端/服务器程序.  餐前甜点  Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对

教你轻松读懂Java中的Socket编程

餐前甜点 Unix的输入输出(IO)系统遵循Open-Read-Write-Close这样的操作范本.当一个用户进程进行IO操作之前,它需要调用Open来指定并获取待操作文件或设备读取或写入的权限.一旦IO操作对象被打开,那么这个用户进程可以对这个对象进行一次或多次的读取或写入操作.Read操作用来从IO操作对象读取数据,并将数据传递给用户进程.Write操作用来将用户进程中的数据传递(写入)到IO操作对象. 当所有的Read和Write操作结束之后,用户进程需要调用Close来通知系统其完成对

线程-socket通信中,socket建立连接后能进行长时间的反复读写操作吗?

问题描述 socket通信中,socket建立连接后能进行长时间的反复读写操作吗? 服务端和客户端以socket建立连接进行通信,我想以单线程实现多文件传输,循环发送多个文件,只是对输入输出流进行打开和关闭,为什么第一个文件传完后进行第二个文件传输时会抛异常:Socket is closed?求高手指点迷津,难道一定要关闭socket然后重新连接吗? 解决方案 不需要,肯定是你代码写得有问题.不妨把代码贴出来看看 解决方案二: 通过Socket连接一次传输多个文件 解决方案三: 上代码看看,估计