C# Socket接收数据问题 各位大大帮忙一下 谢谢!

baidu_23536865 2015-06-18 04:15:19
负责编写一个Socket客户端程序,寻求解决思路,需求是这样的,服务端和客户端采取一问一答的模式,
即客户端发送一个请求指令,服务端返回相应的数据.每5分钟重新开始一次新的请求,获取最新的服务器数据.
问题1:服务器返回的数据可能有点大,如何一次性接收完整?
问题2:我这种使用异步还是同步方式好?
问题3:要考虑一下断网重新连接

希望各位前辈给出一点相关例子或者提示.谢谢!
...全文
250 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
baidu_23536865 2015-06-23
  • 打赏
  • 举报
回复
江南小鱼 2015-06-19
  • 打赏
  • 举报
回复
问题1:服务器返回的数据可能有点大,如何一次性接收完整? 这个是Socket类的事情,你不用担心这个。 问题2:我这种使用异步还是同步方式好? 同步还是异步,看你的使用场景,不是数异步一定比同步好。 假如你发起数据请求,什么事也不做,专等应答结果(或者下一步动作,要以应答为前提),你不防同步 假如你发起数据请求,就去做其他事情了,一旦有了应答,才根据应答去做相应动作,采用异步 另外,同步是阻塞式的 问题3:要考虑一下断网重新连接 别搞这么复杂,断网重新发请求吧
baidu_23536865 2015-06-19
  • 打赏
  • 举报
回复
baidu_23536865 2015-06-19
  • 打赏
  • 举报
回复
如果我在异步函数中判断返回值的话 那不是得在这个函数中beginSend下一次的请求??
baidu_23536865 2015-06-19
  • 打赏
  • 举报
回复
引用 4 楼 lovelj2012 的回复:
问题1:服务器返回的数据可能有点大,如何一次性接收完整? 这个是Socket类的事情,你不用担心这个。 问题2:我这种使用异步还是同步方式好? 同步还是异步,看你的使用场景,不是数异步一定比同步好。 假如你发起数据请求,什么事也不做,专等应答结果(或者下一步动作,要以应答为前提),你不防同步 假如你发起数据请求,就去做其他事情了,一旦有了应答,才根据应答去做相应动作,采用异步 另外,同步是阻塞式的 问题3:要考虑一下断网重新连接 别搞这么复杂,断网重新发请求吧
谢谢回复,我写了段异步代码 但是遇到个问题,看代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;

namespace HurysLEDConvenSoft
{
    class Program
    {
        static byte[] buffer = new byte[1024];
        static void Main(string[] args)
        {
            SocketClient();
        }

        public static void SocketClient()
        {
            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                //连接到指定服务器的指定端口
                socket.Connect("192.168.0.101", 4001);
                bool connected = socket.Connected;
                if (connected == true)
                {
                    Console.WriteLine("connect to the server");
                    //实现接受消息的方法
                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);

                    //开始发送指令 获取平台四通数据
                    //1.登录请求
                    //while (true)
                    //{
                    var message = "Message from client : " + Console.ReadLine();
                    var outputBuffer = Encoding.Default.GetBytes(message);
                    socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
                    // }
                    //2.获取VMS信息
                    //3.获取指定VMS合成后的新的显示页信息
                    //4.发送数据到LED
                }
            }
            catch (Exception)
            {
                Console.WriteLine("SocketClient...");
                SocketClient();
            }
        }

        public static void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                var socket = ar.AsyncState as Socket;
                var length = socket.EndReceive(ar);
                //读取出来消息内容
                var message = Encoding.Default.GetString(buffer, 0, length);
                //显示消息
                Console.WriteLine(message);

                //递归接收
                socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

这段代码模拟DOC窗输入 然后服务器返回相应信息 我现在的需求是需要判断以后往下执行的,但是我不知道是应该在SocketClient函数中判断还是在异步返回中判断. 比如,我输入1,如果服务器返回2,那么我继续发送第2个指令,如果返回数据等于3,那么我再接着发送第3个指令,这个过程如果在SocketClient判断 ,那么我怎么获取异步返回的数据拿来判断呢???
baidu_23536865 2015-06-18
  • 打赏
  • 举报
回复
引用 1 楼 Snowwolf_119 的回复:
1、验证接收数据长度,不够长度继续接收,够长度,判断数据是否正确; 2、异步可能更好一些 3、断网,一切清零重新开始。
能否给出伪代码 或者实例代码呢 谢谢
雪狼孤竹 2015-06-18
  • 打赏
  • 举报
回复
1、验证接收数据长度,不够长度继续接收,够长度,判断数据是否正确; 2、异步可能更好一些 3、断网,一切清零重新开始。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧