C# Socket 粘包 半包 问题请教

初学C#的Socket,求各位大侠指教个解决Socket粘包半包的方法。
我查阅了一些资料知道处理逻辑。
1,发送的消息都由包头+包体组成,包头解释包体长度
2,接收方定义个缓存区
3,判断接收的信息长度
4,先接收个包头
5,按照包头取包体

但是感觉好多逻辑不知道具体用代码怎么实现,请大侠指教。
伪代码也行,最最反应不过来的就是这个缓冲区怎么构建??
它肯定得各种操作索引吧?

1个回答

sungong1987
孙公 多谢,我憋了两天自己解决了,因为自己事先没先了解一下TCP,先了解一下TCP问题就迎刃而解了。
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#socket已经建立,但是AsyncCallback一直没有回调
C#socket已经建立,但是AsyncCallback一直没有回调
c# socket接收空包的问题
我现在遇到一个socket切换通道的一个问题,一共2个socket通道,1个是长连接,另一个是用完后断开在去连接主socket,就是那个长连接的,在回到主通道的时候向服务器发送socket指令的时候收到空包,而服务器回包没有错,我这边就首次回到主通道发送socket指令有问题,后续都正常,求大神赐教这是神马问题。
C# socket networkstream 接收数据
最近在做c/s,客户端用C#的Socket进行通信。接收数据开单独的接收线程使用networkstream进行接收 接收的方法大体上跟网上流传的一样 do { int readSize = mNetworkstream.Read(bytes, 0, 1024); if (readSize > 0) { //do sth } }while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测试网络不稳定就接收不全。 搜集很多资料,也试过在发送Socket包之前加个包大小,然后在while中增加判断是否读到包的大小,可是一样接不全,中间好像掺杂了一些没用的数据? 我一个包很容易超过byte[10240],而且要整个包接收完才能处理数据。 请问C# Socket使用networkstream怎样才能接收完全呢? ps:也有听说过异步networkstream.beginread接收。鉴于网上一大抄,各种人贴各种代码片段根本就没用。有些有用但只能接收一次。。。 如果有beginread相关代码也希望大牛们贴出来参考一下,不要贴代码片段。。。 谢谢了~
C#Socket编程,能实现客户端发送一个txt文件即可,怎么写?
C#Socket编程,只写客户端(127.0.0.1:5555),能实现发送一个txt文件到服务器,文件目录可以直接指定,怎么写呢?大神们?
c#socket双向通信,收不到服务器的反馈信息
请问大神们:为什么c#socket通信时,同步的,客户端必须先收到服务器的应答,才开始发送数据,但是在服务器收到数据处理完后,反馈给客户端时为什么收不到了?
C#Socket通信中的一个小问题
serverSocket = new Socket(Address Family.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 这句代码研究了半天,而且还查阅了很多资料,但都没说明白这句代码的作用,网上的资料说的很含糊,所以我想请教高手指教!最好解释的全面点,谢谢啦!
c# Socket,tcp接收时会粘包?
private void RecMsg(object sokConnectionparn) { Socket sokClient = sokConnectionparn as Socket; while (true) { byte[] arrMsgRec = new byte[1024 * 1024 * 3+3]; // 将接受到的数据存入到输入 arrMsgRec中; int length = -1; try { length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度; } catch (SocketException se) { ShowMsg("异常:" + se.Message); dictSocket.Remove(sokClient.RemoteEndPoint.ToString()); dictThread.Remove(sokClient.RemoteEndPoint.ToString()); DeleteLib(sokClient.RemoteEndPoint.ToString()); break; } catch (Exception e) { ShowMsg("异常:" + e.Message); dictSocket.Remove(sokClient.RemoteEndPoint.ToString()); dictThread.Remove(sokClient.RemoteEndPoint.ToString()); DeleteLib(sokClient.RemoteEndPoint.ToString()); break; } try { if (arrMsgRec[0] == 0) // 表示接收到的是数据; { string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1);// 将接受到的字节数据转化成字符串; ShowMsg(strMsg); } if (arrMsgRec[0] == 1) // 表示接收到的是文件; { filesource = sokClient.RemoteEndPoint.ToString(); //var i = BitConverter.ToInt32(arrMsgRec, arrMsgRec.Length-3); if (System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1).Contains("FileName")) { string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1); bpp.FileName = strMsg.Split(':')[1]; bpp.Index = 0; savepath = ""; savepath = Path.Combine(savepath, bpp.FileName); } else if (System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1).Contains("PackageCount")) { string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, length - 1); bpp.PackageCount = int.Parse(strMsg.Split(':')[1]); } else if (arrMsgRec[1] == 22 && arrMsgRec[2] == 33) { //int i = BitConverter.ToInt32(arrMsgRec, arrMsgRec.Length - 3); byte[] buffer = new byte[length - 3]; Buffer.BlockCopy(arrMsgRec, 3, buffer, 0, buffer.Length); if (!string.IsNullOrEmpty(bpp.FileName)) { Thread fw = new Thread(() => FileWrite(savepath, bpp.Index, 1024 * 1024 * 3, buffer.Length, buffer)); fw.IsBackground = true; fw.Start(); } } else { stringtobyte("Err:" + bpp.Index.ToString(), 1); dictSocket[filesource].Send(stringtobyte("Err:" + bpp.Index.ToString(), 1)); } } } catch(Exception ex) { //MessageBox.Show(ex.Message); } } } 用这个作为后台线程接收,然后发文件(客户端线程分包自动发的)的同时传输信息的话会粘包吧,好像是这个说法,就是那一包文件数据会收不到,然后聊天信息会出现乱码,求教怎么解决,新手实在搞不定- -谢谢.
关于C#socket编程的一个小问题,欢迎大神来解答
需求描述: 使用C#开发一个服务端使用的是wpf项目,该服务端为手机客户端提供不同的访问URL,根据手机端访问服务器所使用的URL不同做出不同的回应,当然什么URL做出什么回应是由协商好的API决定的。 问题描述: 问题一:如何提供可以访问服务器同一端口的不同URL???我该怎么监听? 问题二:当有连接请求的时候我怎么指导手机端是使用了什么URL访问的??我能获取到URL吗?用什么方法? 问题三:以上问题解决方案能够在socket编程中解决吗?
求c# socket聊天程序源码
我用c# winform自己写了一个局域网通信的软件,但是有点问题。求源码,类似QQ那样的,但我只要能实现在局域网聊天就行!!
求大神来解答啊,关于C#socket编程的问题
需求描述: 使用C#开发一个服务端使用的是wpf项目,该服务端为手机客户端提供不同的访问URL,根据手机端访问服务器所使用的URL不同做出不同的回应,当然什么URL做出什么回应是由协商好的API决定的。 问题描述: 问题一:如何提供可以访问服务器同一端口的不同URL???我该怎么监听? 问题二:当有连接请求的时候我怎么指导手机端是使用了什么URL访问的??我能获取到URL吗?用什么方法? 问题三:以上问题解决方案能够在socket编程中解决吗?
c# Socket TCP 长连接的一些问题
创建一个负责监听的Socket,每当有一个客户端连接的时候,这时候是不是需要创建一个线程来维护这个Socket连接? 换句话说是不是每一个客户端就需要一个线程来维护,如果是的话,是不是需要收、发信息都各需要一个线程,那这样一个客户端不是至少需要两个线程,若这样的思路是对的, 那假设有1000个客户端 那服务器不是至少要创建2000个线程,或许这2000个线程并没有并发运行,其中有些是挂起的 有些是运行的? 关于这个问题 已经困扰了我太久了,万望众大神,各抒己见,慷慨相助,畅所欲言。
关于C# socket传输中的连接问题
由于我初次编写网络传输这一块的代码,中间一些传输上这几道连接的地方不太明白。 现在我遇到的情景是这样的: 1.我用TCP协议传输文件至服务器, 2.客户端第一次发送文件信息等待回应, 3.服务器接收到消息后返回状态, 4.本地收到状态后开始传文件并等待传输完成回应, 5.传输完成后服务器发送完成状态回来客户端接收到整个过程就完成了。 现有服务器一台,公网IP,可以直接从任何电脑访问的那种, 我现在在服务器上写好了监听,监听收到的消息并判断,然后发送状态返回。 按我的理解就是要发送到对方的IP和端口上去就可以了(当然对方也要开启监听) 但是我的客户端网络很有可能不是公网IP(基本都不是),这样又要经过NAT这一层了, 客户端发送的消息服务器是已经收得到了,但是现在服务器怎么让客户端收到状态回应呢? 我选择的是让服务器把消息发送给RemoteEndPoint,那么客户端应该监听那个IP呢?
关于C#SOCKET服务端问题求大神帮忙
自己些了一个SOCKET服务端程序,原来在server2003上运行一切正常,后再转移到 server2008后,该程序运行久了,会出现:原有连接上的SOCKET能正常收发数据。 但是新连接的SOCKET没有任何反应,调试过。服务检查程序的SOCKET还保持在监听状态。客户端也提示连接成功,就是无法收发数据。程序源码:http://t.kuaiyucar.com/SOCKET.rar。求大家帮帮忙,谢谢了。万分感谢
c# socket链接 发送请求2-4个直接断开连接
在阿里云的香港服务器上面搭建了一个socket服务端, 用广东的一个移动网络连接服务端,发送2-4个协议后socket就会自动断掉,换成wifi环境,一切正常 有人有遇见过这种问题么?
C#socket黑窗口发送消息,接收后会出现很多a
![图片说明](https://img-ask.csdn.net/upload/201908/30/1567169772_678410.png) //服务端 Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint point = new IPEndPoint(IPAddress.Parse("127.21.24.35"), 1324); soc.Bind(point); soc.Listen(2);//最大连接数 Console.WriteLine("等待客户端连接"); Socket tcp = soc.Accept(); Console.WriteLine("客户端已连接"); Console.WriteLine(tcp.RemoteEndPoint.ToString()); byte[] data = new byte[1024]; int length = tcp.Receive(data); string str = Encoding.UTF8.GetString(data); Console.WriteLine("接收的数据为:" + str); Console.ReadKey(); ``` //客户端 Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); EndPoint ed = new IPEndPoint(IPAddress.Parse("127.21.24.35"), 1324); soc.Connect(ed); byte[] data = Encoding.UTF8.GetBytes("难啊是整的难啊"); soc.Send(data); Console.ReadKey(); ``` ``` `` `![图片说明](https://img-ask.csdn.net/upload/201908/30/1567162405_999134.png) C#socket黑窗口发送消息,接收后会出现很多a
C# socket通讯的一个问题请教一下大家
![图片说明](https://img-ask.csdn.net/upload/201608/30/1472554027_499837.png) ![图片说明](https://img-ask.csdn.net/upload/201608/30/1472554037_889371.png) 如图 连接服务器完成后第二次Send发送数据会报错::: 你的主机中的软件中止了一个已建立的连接。 不知道是什么原因导致的,主要是对通讯这方面也不熟悉。大神帮我分析一下,不胜感激
C# Socket服务器接收HTTP请求,不能全部做出响应
使用Socket作为服务器,接收HTTP请求,在Socket socket = socketListen.Accept();之后启动一个线程处理接收数据 和发送数据,如果不调用socket.Receive(data);接收客户数据的话,那么客户端(也就是HTTP请求)请求多少次, 服务端的Socket socket = socketListen.Accept();就会被调用多少次,就是能百分百接收到客户端请求, 但是通过socket.Send(head)作为HTTP请求返回数据,HTTP请求那边几乎获取不到返回的数据, 偶尔还是能获取到的,相反,不调用socket.Receive(data);方法,就会出现 比如 HTTP请求了100次, socketListen.Accept();可能就被执行了80次,但是这80次调用socket.Send(head)返回给http的数据,http那边都能获取到服务端返回的数据,注:客户端每次发送的数据很少,代码如下public partial class MainWindow : Window { private Socket socketWatch; private Thread listenThread = null; private bool isRun = false; private int pointer = 0; public MainWindow() { InitializeComponent(); init(); } private void init() { socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 80)); socketWatch.Listen(10); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的 listenThread = new Thread(new ParameterizedThreadStart(run)); listenThread.IsBackground = true; } private void run(Object o) { Socket socketListen = (Socket)o; while (isRun) { Socket socket = socketListen.Accept(); pointer = pointer + 1; Thread thread = new Thread(new ParameterizedThreadStart(task)); thread.IsBackground = true; thread.Start(socket); } } private void bn_start_Click(object sender, RoutedEventArgs e) { isRun = true; bn_start.IsEnabled = false; bn_stop.IsEnabled = true; listenThread.Start(socketWatch); } private void bn_stop_Click(object sender, RoutedEventArgs e) { System.Environment.Exit(0); } private void Window_Closed(object sender, EventArgs e) { System.Environment.Exit(0); } private void task(object o) { Socket socket = (Socket)o; byte[] data = new byte[1024 * 2]; // 浏览器发来的数据 int reciverNumber = socket.Receive(data); string resdata = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " server request time:" + pointer; byte[] body = Encoding.UTF8.GetBytes(resdata); byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK Content-Length: " + body.Length + @" Content-Type: text/plain Date: " + string.Format("{0:R}", DateTime.Now) + @" Server: Cftea Web Server " + resdata); socket.Send(head); socket.Shutdown(SocketShutdown.Both); socket.Close(); } } ``` ```
C#SOCKET长连接小数据程序未响应
最近由于业务的需要,Linux系统嵌入式设备往我做的服务程序发送数据。 速度奇慢,而且还是程序无响应。后来自己用C#写了一个客户端用来测试。已经用了线程池,不知道用法对不对。请大家帮忙看下。 服务端: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net.Sockets; using System.Net; namespace consoleSocketServer { class Program { static int socketCount = 0; static Socket serverSocket; static Socket clientSocket; public static int clientcount = 0; public int clientnum = 0; static int listSQL = 0; static bool asy = true; public static Int32 portServer = 0; public static string ipServer = ""; public static Thread threadSocketListen; public static Thread threadDoWork; public static Thread threadInsert; public static int countsql = 0; static void Main(string[] args) { IPAddress ipAddress; portServer = 4660; serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ipAddress = IPAddress.Parse("192.168.33.29"); ipServer = ipAddress.ToString(); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, portServer); Console.WriteLine("服务器IP:" + ipServer + " 端口:" + portServer); serverSocket.Bind(localEndPoint); serverSocket.Listen(20); //设置线程池 ThreadPool.SetMaxThreads(4, 4); //开启新的线程监听 threadSocketListen = new Thread(SocketListen); threadSocketListen.Start(); Console.WriteLine("服务启动成功"); } static void SocketListen() { while (true) { //接受客户端信息 clientSocket = serverSocket.Accept(); //开启处理线程 ThreadPool.QueueUserWorkItem(new WaitCallback(doWork)); //threadDoWork = new Thread(new ThreadStart(doWork)); //threadDoWork.Start(); } } /// <summary> /// 处理方法 /// </summary> static void doWork(object a) { //获取客户端信息 IPEndPoint ipEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint; string address = ipEndPoint.Address.ToString(); //Console.WriteLine(address + ":连接成功"); //取消息 byte[] inBuffer = new byte[1024]; byte[] outBuffer = new byte[8]; string inBufferStr = ""; int rec = 0; StringBuilder sb = new StringBuilder(); while (true) { try { rec = clientSocket.Receive(inBuffer);//如果没有消息为空 阻塞 当前循环 //收到的长度不够 忽略此次数据 if (rec <= 8) { continue; } int ll = inBuffer[4] + inBuffer[5] * 255; inBufferStr = Encoding.UTF8.GetString(inBuffer, 8, ll); Console.WriteLine(inBufferStr); //回复收到 outBuffer[4] = 0; outBuffer[5] = 0; outBuffer[6] = 0; outBuffer[7] = 0; outBuffer[3] = 0; outBuffer[2] = 0; outBuffer[1] = 0; outBuffer[0] = 1; clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); socketCount++; Console.WriteLine(socketCount.ToString()); //break; } catch (SocketException es) { //clientSocket.Close(); return; } } } } } 客户端: using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace SocketClient { class Program { static Socket clientSocket; static void Main(string[] args) { try { //将网络端点表示为IP地址和端口 用于socket侦听时绑定 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.33.29"), 4660); clientSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); //将Socket连接到服务器 clientSocket.Connect(ipep); string outBufferStr; //发送消息 outBufferStr = "123456789qwe|789654123|1|2015-04-22 10:51:34|6|test1|test2| "; byte[] tempb = Encoding.UTF8.GetBytes(outBufferStr); byte[] outBuffer = new byte[tempb.Length + 8]; //加功能和长度 outBuffer[0] = 1; outBuffer[1] = 0; outBuffer[2] = 0; outBuffer[3] = 0; outBuffer[4] = Convert.ToByte(tempb.Length % 255); outBuffer[5] = Convert.ToByte(tempb.Length / 255); outBuffer[6] = 0; outBuffer[7] = 0; for (int i = 0; i < tempb.Length; i++) { outBuffer[8 + i] = tempb[i]; } // Byte[] inBuffer = new Byte[1024]; int kkk = 0; while (kkk <= 10000) { clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); kkk++; Thread.Sleep(1); Console.WriteLine(kkk.ToString()); //Console.WriteLine("服务器响应:"); //接收服务器端信息 //clientSocket.Receive(inBuffer, 1024, SocketFlags.None); //Console.WriteLine(Encoding.ASCII.GetString(inBuffer)); } Console.WriteLine(kkk.ToString()); Console.ReadLine(); } catch (Exception exp) { Console.WriteLine(exp.Message); Console.ReadLine(); } } } } 客户端收到数据,显示出来,在回发一个byte[] 1 0 0 0 0 0 0 0 用于确认收到。 实际上目前客户端没有对服务端收到的数据做处理,因为那样又要多开一个线程。 但是现在问题就是这样简单的测试发送10000条数据,居然会卡死,很纳闷。我前几天见他们Linux自己写的程序发送1W条数据,就是2 3秒的时间。请大神指导。难道C#真的是不能做服务端的程序?
C#通过Socket实现多文件传输
大概需求是客户端发送一个xml文件名给服务器,服务器返回xml文件。这一步没问题。 后面客户端需要解析xml文件,根据解析出的文件名,去服务器获取指定文件。现在问题是第一次服务器发送xml文件之后就侦听不到客户端后面的请求了 服务端代码: ``` #region 窗体加载 private void Form1_Load(object sender, EventArgs e) { Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//Socket设置、IPv4、Stream类型套接字、TCP协议 IPAddress ip = IPAddress.Any;//获取本机IP IPEndPoint point = new IPEndPoint(ip, 18002);//设置IP和端口 socketWatch.Bind(point);//绑定端口 memoEdit1.Text = "开始侦听..."; socketWatch.Listen(100);//最大连接数 Thread th = new Thread(SendFileFuncssss);//创建新线程 th.Start(socketWatch);//启动线程 th.IsBackground = true;//设置后台运行线程 } #endregion #region 根据客户端传输文件名发送指定文件 public void SendFileFuncssss(object obj) { Socket socket = obj as Socket; while (true) { Socket socketServices = socket.Accept(); byte[] buffer = new byte[1024]; int num = socketServices.Receive(buffer);//接收到字节数 string str = Encoding.UTF8.GetString(buffer, 1, num - 1);//接收到字符串 if (buffer[0] == 0)//表示接收到的是消息数据 { TxtAddContent(socketServices.RemoteEndPoint + "连接成功"); string FileName = str; if (FileName.Equals("AutoUpdater.xml"))//获取xml配置文件 { //发送XML文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 5]; int length = fs.Read(arrFile, 0, arrFile.Length); byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到客户端 } } if (!FileName.Equals("AutoUpdater.xml")) { //发送更新文件到客户端 using (FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "\\FileFolder\\" + FileName, FileMode.Open)) { byte[] arrFile = new byte[1024 * 1024 * 50]; int length = fs.Read(arrFile, 0, arrFile.Length);//获取文件长度 byte[] arrFileSend = new byte[length + 1]; arrFileSend[0] = 1; // 用来表示发送的是xml文件数据 Buffer.BlockCopy(arrFile, 0, arrFileSend, 1, length); socketServices.Send(arrFileSend);// 发送数据到服务端 } } } } } #endregion ``` 客户端代码: ``` Socket socketClient = obj as Socket; socketClient.Connect(ipEndPoint); #region 修改本地文件名称 string Oldpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml";//修改前名称 string Newpath = AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml";//修改后名称 if (File.Exists(Oldpath)) { File.Delete(Newpath); File.Move(Oldpath, Newpath);//更改文件名 } #endregion if (socketClient.Connected) { try { TxtReceiveAddContent("连接成功"); //发送链接成功提示 byte[] arrMsg = Encoding.UTF8.GetBytes("AutoUpdater.xml"); byte[] arrSendMsg = new byte[arrMsg.Length + 1];//加一位标识用于表示是文字消息还是文件 arrSendMsg[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length); socketClient.Send(arrSendMsg); //获取文件 string dirPath = Application.StartupPath; byte[] buffer = new byte[1024 * 1024 * 5]; int lenght = socketClient.Receive(buffer); if (buffer[0] == 1) { using (FileStream fs = new FileStream(dirPath + "\\AutoUpdater.xml", FileMode.Create)) { fs.Write(buffer, 1, lenght - 1); } TxtReceiveAddContent("配置文件接收成功:AutoUpdater.xml");//追加提示备注 } #region 获取XML里需要更新的文件和需要删除的文件 List<string> updatelist = new List<string>();//需要更新的文件集合 List<string> deletelist = new List<string>();//需要更新的文件集合 //获取历史xml文件更新时间以及更新版本 XDocument Olddocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater_Back.xml"); //获取到XML的根元素进行操作 XElement Oldroot = Olddocument.Root; XElement Oldele = Oldroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement OldUpdateTime = Oldele.Element("UpdateTime"); //获取旧版本号标签的值 XElement OldVersion = Oldele.Element("Version"); //获取最新xml文件更新时间以及更新版本 XDocument Newdocument = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "AutoUpdater.xml"); //获取到XML的根元素进行操作 XElement Newroot = Newdocument.Root; XElement Newele = Newroot.Element("UpdateInfo"); //获取旧更新时间标签的值 XElement NewUpdateTime = Newele.Element("UpdateTime"); //获取旧版本号标签的值 XElement NewVersion = Newele.Element("Version"); if (NewUpdateTime != OldUpdateTime || NewVersion != OldVersion) { //获取需要更新的文件列表 XElement NewUpList = Newroot.Element("UpdateList"); IEnumerable<XElement> UpList = NewUpList.Elements(); foreach (XElement item in UpList) { updatelist.Add(item.Value); } //获取需要删除的文件列表 XElement NewDelList = Newroot.Element("DeleteList"); IEnumerable<XElement> DelList = NewDelList.Elements(); foreach (XElement item in DelList) { deletelist.Add(item.Value); } } #endregion #region 循环获取更新文件 for (int i = 0; i < updatelist.Count; i++) { //发送链接成功提示 byte[] FileName = Encoding.UTF8.GetBytes(updatelist[i]); byte[] SendFileName = new byte[FileName.Length + 1];//加一位标识用于表示是文字消息还是文件 SendFileName[0] = 0; // 用来表示发送的是消息数据 Buffer.BlockCopy(FileName, 0, SendFileName, 1, FileName.Length); socketClient.Send(SendFileName); //获取文件 string FilePath = Application.StartupPath + "\\WebFile"; byte[] bufferByFile = new byte[1024 * 1024 * 50]; int lenghtByFile = socketClient.Receive(bufferByFile); if (bufferByFile[0] == 1) { using (FileStream fs = new FileStream(FilePath + "\\" + updatelist[i], FileMode.Create)) { fs.Write(bufferByFile, 1, lenghtByFile - 1); } TxtReceiveAddContent("文件接收成功:" + updatelist[i]); } } #endregion #region 循环删除指定文件 for (int i = 0; i < deletelist.Count; i++) { try { string path = AppDomain.CurrentDomain.BaseDirectory + "\\WebFile\\" + deletelist[i]; File.Delete(path); TxtReceiveAddContent("删除文件[" + deletelist[i] + "]成功"); } catch (Exception) { TxtReceiveAddContent("删除文件[" + deletelist[i] + "]失败"); continue; } } #endregion } catch (Exception ex) { File.Move(Newpath, Oldpath);//连接失败,还原文件名 MessageBox.Show(ex.ToString()); throw; } ``` 调试在客户端进循环的时候服务端侦听不到了 刚接触socket,多谢大佬们解答
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
《阿里巴巴开发手册》读书笔记-编程规约
Java编程规约命名风格 命名风格 类名使用UpperCamelCase风格 方法名,参数名,成员变量,局部变量都统一使用lowerCamelcase风格 常量命名全部大写,单词间用下划线隔开, 力求语义表达完整清楚,不要嫌名字长 ...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Linux 命令(122)—— watch 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] watch(1) manual
Linux 命令(121)—— cal 命令
1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 [1] cal(1) manual
记jsp+servlet+jdbc实现的新闻管理系统
1.工具:eclipse+SQLyog 2.介绍:实现的内容就是显示新闻的基本信息,然后一个增删改查的操作。 3.数据库表设计 列名 中文名称 数据类型 长度 非空 newsId 文章ID int 11 √ newsTitle 文章标题 varchar 20 √ newsContent 文章内容 text newsStatus 是否审核 varchar 10 news...
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问