首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 网络服务器编程疑问,错误有关问题

2013-09-07 
c# 网络服务器编程疑问,异常问题图1图2问题1:每次我运行是按下监听按钮时,图2 界面显示老是会卡在那里,我

c# 网络服务器编程疑问,异常问题
c# 网络服务器编程疑问,错误有关问题
图1
c# 网络服务器编程疑问,错误有关问题

图2
问题1:
  每次我运行是按下监听按钮时,图2 界面显示老是会卡在那里,我知道是可能是在监听时的那个while 循环那里问题,请问怎么解决?

问题2 :
每次我按下停止监听按钮时,老是会显示图2 所是的异常错误,请问需要怎么解决啊!

PS: 都23:37 了还在敲代码,苦逼啊!
直接代码吧

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace 红相表测试
{
    public partial class Form1 : Form
    {
        public Socket client = null;
        public string str;
        public Thread t1;
        bool flag = false;
        public string StringToHex(string str)
        {
            //str = str.Trim();
            byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
            string TempStr = "";
            foreach (byte b in ByteFoo)
            {
                if (b <= 16)  //16进制显示时加个0
                {   
                    TempStr += "0"+b.ToString("X") + " "; //X表示十六进制显示
                }
                else
                    TempStr += b.ToString("X") + " "; //X表示十六进制显示
            }
            return TempStr;


        }

     public void showinfo()
        {
            if (checkBox1.Checked)
            {
                richTextBox1.Text +="接收: "+ StringToHex(str) + "\n\r";
            }
            else
            {
                richTextBox1.Text += str + " " + "\n";
            }

        }

        public delegate void showDelegate();
        public void threadrun()
        {
            int n;
            byte[] data = new byte[1024];
            string[] frame = new string[256];
            int j = 0;
            while (true)
            {
                if ((n = client.Receive(data)) != 0)
                {
                    byte[] buf = new byte[n];
                    for (int i = 0; i < n; i++)
                    {
                        buf[i] = data[i];

                    }


                    foreach (byte a in buf)
                    {
                        frame[j] = Convert.ToString(a,16);
                        j++;
                    }
                    j = 0;
                    if (frame[1] == "58")
                    {
                        str = System.Text.Encoding.Default.GetString(buf);
                        Invoke(new showDelegate(showinfo));
                    }


                }
                else
                {
                    MessageBox.Show("断开!");
                    //client.Close();
                 
                    break;
                }
                Thread.Sleep(100);
            }
        }
        public Form1()
        {


            InitializeComponent();
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //Socket client;
            int recv;
            Socket ServerSocket = null;
            byte[] message = new byte[1024];
           // byte[] 
         
                ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,                  ProtocolType.IP);
                IPAddress adr = IPAddress.Parse("192.168.0.200");
                IPEndPoint ep = new IPEndPoint(adr, 12345);
                
                try
                {
                    ServerSocket.Bind(ep); //类似于客户机的connect()方法
                    ServerSocket.Listen(3); //开始监听
                }
                catch (SocketException err)
                {
                    MessageBox.Show(err.Message);
                }



                Thread.Sleep(100);
            while (true)
            {
                try
                {
                    if ((client = ServerSocket.Accept()) != null)
                    {
                        label3.Text = "已经连接. . . .";
                   
                       
                        break;
                    }

                 }
                catch (SocketException err)
                {
                    MessageBox.Show(err.Message);
                
                }
                Thread.Sleep(100);
            }
           t1 = new Thread(threadrun);
            t1.Start();
           /* while(true)
            {
                if ((recv = client.Receive(message)) != 0)
                {


                    richTextBox1.Text = System.Text.Encoding.Default.GetString(message);
                
                }

                Thread.Sleep(100);
            }*/

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            t1.Abort();
          //  client.Dispose();
            if (client!=null)
            {
                client.Close();
                label3.Text = "";
            }
            client = null;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
           
        }
    }
}

网络服务器 编程 测试
------解决方案--------------------


把整个创建ServerSocket,绑定端口,while循环都移到一个线程中。
把ServerSocket做成成员变量,在 button1_Click中判断,如果ServerSocket已经有值了,就跳过,否则才创建和bind到12345端口。在停止监听按钮事件中设一个标志,让while循环退出,关闭ServerSocket,并设为null。

[解决办法]
C#通讯调试工具v3.0
里面有你想要的代码。
[解决办法]
第一个问题是因为你采用的是同步的方式,监听线程和UI线程是同一个线程,所以才会界面卡死的,你用异步TCP就可以的,这个你可以百度下的,具体实现你也可以参考下:
http://www.cnblogs.com/zhili/archive/2012/08/25/TCP.html

热点排行