免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1868 | 回复: 0
打印 上一主题 下一主题

.Net Socket 客户端编写遇到奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-12 15:30 |只看该作者 |倒序浏览
各位大侠,我在使用C# 运用System.Net.Sockets写客户端,我希望能使用一个异步的Task创造一个无限循环去不断尝试读socket端口是否有输入,但是现在遇到了一个奇怪的问题,百思不得其解,具体问题代码之中有描述.祝各位新春快乐!
  1. namespace SocketServer
  2. {
  3.    
  4.     public partial class Form1 : Form
  5.     {
  6.         private Socket _socket = null;

  7.         private Socket client = null;

  8.         private static byte[] ReadBuffer = new byte[1024];

  9.         private static byte[] WriteBuffer = new byte[1024];

  10.         public static ManualResetEvent allDone = new ManualResetEvent(false);

  11.         Task ReadLoopTask;

  12.         public Form1()
  13.         {
  14.             InitializeComponent();
  15.             //Control.CheckForIllegalCrossThreadCalls = false;

  16.             Console.WriteLine("OK");
  17.         }

  18.         
  19.         delegate void ReceBoxSetText(string text);
  20.         private void DoReceBoxSetText(string text)
  21.         {
  22.             if (this.ReceTxt.InvokeRequired)
  23.             {
  24.                 ReceBoxSetText d = new ReceBoxSetText(DoReceBoxSetText);
  25.                 this.Invoke(d, new object[]{text});
  26.             }
  27.             else
  28.             {
  29.                 this.ReceTxt.AppendText(text);
  30.                 this.ReceTxt.Refresh();
  31.             }

  32.         }







  33.         private void setPort_Click(object sender, EventArgs e)
  34.         {
  35.            






  36.            // /*
  37.             string port = null;
  38.             if (String.IsNullOrEmpty(portNum.Text))
  39.             {
  40.                 MessageBox.Show("Error Port Number");
  41.             }
  42.             else
  43.             {
  44.                 port = portNum.Text;
  45.             }
  46.             //得到监听的端口号
  47.             _socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
  48.             client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  49.             string HostName = Dns.GetHostName();
  50.             IPHostEntry hostIP = Dns.GetHostEntry(HostName);
  51.             string localIP = hostIP.AddressList[1].ToString();
  52.             localIP = "127.0.0.1";
  53.             
  54.             IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse(localIP),int.Parse(port));

  55.             
  56.             _socket.Bind(ipEndPoint);
  57.             
  58.             _socket.Listen(10);


  59.             
  60.             
  61.             
  62.             
  63.             
  64.             
  65.             

  66.             client.ReceiveBufferSize = 1024;
  67.             

  68.             SocketAsyncEventArgs SocAs= new SocketAsyncEventArgs();

  69.             SocAs.AcceptSocket = client;
  70.             client.ReceiveTimeout = -1;

  71.             SocAs.Completed += SocAs_Completed;//获得连接
  72.             SocAs.Completed += SocAs_StartGet;//启动读循环
  73.            
  74.             _socket.AcceptAsync(SocAs);
  75.             Console.WriteLine("Main finished");
  76.            // */

  77.             
  78.             
  79.             
  80.             
  81.             

  82.         }






  83. ///*
  84.         void SocAs_Completed(object sender, SocketAsyncEventArgs e)
  85.         {
  86.             
  87.             
  88.             DoReceBoxSetText("Connection created");
  89.             
  90.             ReadLoopTask = new Task(() =>
  91.             {
  92.                 int t = 0;
  93.                 while (true)
  94.                 {
  95.                     Console.WriteLine("OK"+t.ToString());
  96.                     t++;
  97.                     //单独执行上述代码时确实在不断输出

  98.                     //那么就是下面代码的问题了,为什么加了client.Recieve()之后就会执行一次或者两次然后退出呢?
  99.                     //这里的情况是这样的,如果server端不发送数据,那么这个循环只执行一次输出OK0
  100.                     //如果server端发送了一个数据,那么这个循环会再执行一次,于是又输出OK1,
  101.                     //之后无论server端发送什么数据,调试的时候按步这个循环都是执行到client.Recieve()就会显示程序界面,不再执行后面的语句
  102.                     
  103.                     int i=0;
  104.                     try
  105.                     {
  106.                         
  107.                         i = client.Receive(ReadBuffer);//i是指读了多少
  108.                     }
  109.                     catch (Exception ex)
  110.                     {
  111.                         Console.WriteLine(ex.Message);

  112.                     }
  113.                     
  114.                     if (i!= 0)
  115.                     {
  116.                         //下面就是处理读取到的byte[]的时刻了
  117.                         int a = 3;
  118.                         DoReceBoxSetText(t.ToString());
  119.    
  120.                     }
  121.                     ReadBuffer = new byte[1024];
  122.                     
  123.                 }


  124.             });

  125.             //为新建连接创建新的socket
  126.         }
  127.         void SocAs_StartGet(object sender, SocketAsyncEventArgs e)
  128.         {
  129.             ServerReadLoop();

  130.         }
  131.         public void ServerReadLoop()
  132.         {

  133.             ReadLoopTask.Start();

  134.         }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP