跳出C# tcp/ip 假死困境

原文出自:http://xidianwk.spaces.live.com/blog/cns!F2482102835C40AD!375.entry
c#的TCP/IP编程
我记得刚开始学VC的时候,就接到一些项目,里面就用到了TCP/IP编程,当时因为是刚刚起步,因此在啃了N多的资料之后算是搞定了,但是如何实现多线成,当时写的并不是很成熟,因此,这次写基于C#的TCP/IP通信的时候,就必须考虑这个多线程的问题,下面是我的一个C/S通信程序,里面用到了多线程技术,比较完美的解决了问题,贴出代码:
服务段的:
Int32 port=12345;
   
   
   //TcpListener server=new TcpListener(port);
   m_server=new TcpListener(port);
   try
   { 
    
    //m_server=server;
    TextBox1.Text="已经开始了";
    m_server.Start();    
     
     
     Thread m_thread=new Thread(new ThreadStart(GetConn));//开启线成
     m_thread.Start();//运行
    
    
   }
   catch(SocketException ae)
   {
    MessageBox.Show("错误源"+ae.Source+"表示"+ae.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
   }
  }
  private void GetConn()//线成函数
 {
  m_client=m_server.AcceptTcpClient();
  TcpClient c=this.m_client;
  Thread m_thread=new Thread(new ThreadStart(GetConn));
  m_thread.Start();//线程中开辟另外一个新的线成,这样挂起请求全部在新的线程等待,因此不用一个while(true)的循环,有效地解决了程序“假死”现象
  NetworkStream stream=c.GetStream();//下面就是一些读和写了,没有什么含量,不解释了
  byte[] recv=new byte[256];
   string msg="";
   string temp;
   try
   {
    int a=0;
    a=stream.Read(recv,0,256);
    if(a>0)
    {
     temp=System.Text.Encoding.ASCII.GetString(recv,0,a);
     msg+=temp;
     //recv.SetValue(0,0);
     //a=stream.Read(recv,0,256);
    }
    MessageBox.Show(msg);
    stream.Write(System.Text.Encoding.ASCII.GetBytes(msg),0,msg.Length);
    stream.Close();
    c.Close();
    
   }
   catch(SocketException es)
   {
              MessageBox.Show("错误源"+es.Source+"表示"+es.Message,"提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
   }
///
客户端的代码:
private void button1_Click(object sender, System.EventArgs e)
  {
    string str=textBox1.Text;
  
   if(str.Length<=0)
   {
    MessageBox.Show("请输入字符");
    return;
   }
    byte[] send=new byte[str.Length];
   send=System.Text.Encoding.ASCII.GetBytes(str);
   try
   {
    TcpClient m_client=new TcpClient("192.168.3.65",12345);
    NetworkStream stream=m_client.GetStream();
    stream.Write(send,0,send.Length);
    int len=stream.Read(send,0,send.Length);
    string aa=System.Text.Encoding.ASCII.GetString(send,0,len);
    stream.Close();
    m_client.Close();
    MessageBox.Show(aa);
   }
   catch(SocketException aa)
   {
    MessageBox.Show(aa.Message);
   }
  }//不进行解释了,没有什么意思
附加:早晨进行编码的时候测试发现不能发送中文,应该是编码那边的问题,把Encoding.ASCII修改为Encoding.UT8就可以了。
下面是图片了:
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中的foreach循环可以使用break语句来跳出循环。当在循环体中遇到满足某个条件的情况时,可以使用break语句立即终止当前的循环,并跳出循环执行下一个语句。这是一种常见的在foreach循环中跳出的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C#中foreach语句使用break暂停遍历的方法](https://download.csdn.net/download/weixin_38557768/12806478)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [forEach方法如何跳出循环](https://blog.csdn.net/yiyueqinghui/article/details/105832438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [foreach 之跳出循环](https://blog.csdn.net/weixin_44997008/article/details/114665694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值