当前位置: 代码迷 >> C# >> udp聊天程序 打包以后接受数据函数出现每个套接字地址(协议/网络地址/端口)只允许使用一次
  详细解决方案

udp聊天程序 打包以后接受数据函数出现每个套接字地址(协议/网络地址/端口)只允许使用一次

热度:715   发布时间:2016-05-05 05:25:16.0
udp聊天程序 封装以后接受数据函数出现每个套接字地址(协议/网络地址/端口)只允许使用一次
这是窗口的代码

using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace uclient1
{
    public partial class Form1 : Form
    {
        private static IPAddress ip;
        private static int port;

        public static Form1 f = new Form1();
        MyUDP client = new MyUDP();
        public Form1()
        {
            InitializeComponent();

            ip = IPAddress.Parse(textBox2.Text.ToString());
            port = 33332;
          
        }
     }
}

封装的一个类、
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace uclient1
{
    class MyUDP
    {

        public MyUDP()
        {
           Thread t = new Thread(receiver);
            t.IsBackground = true;
            t.Start();
        }
        public delegate void ShwMsgforViewCallBack(string str);//定义委托(显示消息)
        public ShwMsgforViewCallBack shwMsgforViewCallBack;
        public bool tag = true;

        public void ShwMsgforView(string str)       //ShwMsgforViewCallBack的委托
        {
            Form1.f.listBox1.Items.Add(str);                   //把值写入

        }
       
        public void receiver()
        {
            UdpClient u2 = new UdpClient(33333); //我一运行程序,程序在这两句循环,不往下执行,然后报只能出现一次的错误
            IPEndPoint IPE = null;             //

            try
            {

               
               while (tag)
                {
                    byte[] receiverData = u2.Receive(ref  IPE);
                    string data = Encoding.ASCII.GetString(receiverData);
                    Form1.f.listBox1.Invoke(shwMsgforViewCallBack, data);
                }
               u2.Close();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());
            }

------解决思路----------------------
UdpClient u2 = new UdpClient(33333);      端口33333 重复使用导致了。输入端口,别这么随意行不行?
在界面上放一个textbox,用于输入端口值,不同的窗口要不同的端口值。
------解决思路----------------------
引用:
Quote: 引用:

UdpClient u2 = new UdpClient(33333);      端口33333 重复使用导致了。输入端口,别这么随意行不行?
在界面上放一个textbox,用于输入端口值,不同的窗口要不同的端口值。


我知道是重复了,但重复的原因是因为进入线程以后
UdpClient u2 = new UdpClient(33333);
 PEndPoint IPE = null;  这句话执行一遍以后又执行了一遍,所以导致了重复使用,但是为什么线程里这句话会执行2次而不往下执行呢

你先去 msdn上知悉一下  UdpClient  都有那几种构造函数吧。
------解决思路----------------------
执行两次说明函数掉了两次,不往下执行是因为异常抛出了。多线程调试不要打断点,用输出。