c# TCP 多线程 关闭旧连接再打开新连接的问题 很久不见 上来冒个泡

SomethingJack 2016-04-22 11:15:17
问题描述:
我使用UDP做了一个程序来实现跟设备的通讯以及接收数据处理的代码逻辑,现在有一个问题,
就是我每次点击按钮以后,之前的线程或者说连接没有关闭,又重新开启了一个连接,我在处理过程中使用到了两个线程,像我这种情况应该如何处理,我拷贝了部分逻辑代码 给大家看看,谢谢各位
以下是代码过程,

Thread th;//UDP线程
Thread thread;//接收线程
private void btnFirst_Click(object sender, EventArgs e)
{
int parem = 0;
th = new Thread(UDPServertStart);
th.IsBackground = true;
th.Start(parem);
}


/// <summary>
/// 程序开始实时数据(UDP模式)
/// </summary>
public void UDPServertStart(object o)
{
try
{
IPAddress ipAddress = IPAddress.Parse(Udpip);
IPLocalPoint = new IPEndPoint(ipAddress, Udpport);
mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
mySocket.Bind(IPLocalPoint);

//得到客户机IP
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
RemotePoint = (EndPoint)(ipep);

//启动一个新的线程
thread = new Thread(new ThreadStart(ReceiveHandle));
thread.Start();
}
catch (Exception ex)
{
//MessageBox.Show(ex.Message);
return;
}
}

/// <summary>
/// 接收信息
/// </summary>
public void ReceiveHandle()
{
ByteQueue queue = new ByteQueue();
string host = getIPAddress();

while (true)
{
try
{
byte[] data = new byte[1024];
//接收UDP数据报,引用参数RemotePoint获得源地址
int rlen = mySocket.ReceiveFrom(data, ref RemotePoint);

//分多次接收
byte[] reallData = new byte[rlen];
Array.Copy(data, reallData, reallData.Length);
queue.Enqueue(reallData);

queue.headBuffer = new byte[] { 0xCA, 0xCB, 0xCC, 0xCD }; //包头开始部份
while (queue.Find())
{
byte[] readBuffer = queue.Dequeue();
}
}
catch (Exception ex)
{
return;
}
finally
{
}
}
}
...全文
306 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
SomethingJack 2016-04-22
  • 打赏
  • 举报
回复
引用 2 楼 Yokeqi 的回复:
public void UDPServertStart(object o)
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse(Udpip);
        IPLocalPoint = new IPEndPoint(ipAddress, Udpport);
        if (mySocket == null)
        {
            mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        }
        mySocket.Bind(IPLocalPoint);

        //得到客户机IP  
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
        RemotePoint = (EndPoint)(ipep);

        if (thread == null || !thread.IsAlive)
        {
            //启动一个新的线程
            thread = new Thread(new ThreadStart(ReceiveHandle));
            thread.Start();
        }
    }
    catch (Exception ex)
    {
        //MessageBox.Show(ex.Message);
        return;
    }
}
接收线程照你逻辑不用每次都创建,而Socket.Bind好像有必要重新绑,不知道IP端口会不会随时变
谢谢回复 这里判断我理解了 只是我现在调试 是在建立udp通讯的时候就报错了 端口被占用 我的意思 比如我刚才的代码在一个按钮事件中执行 那么我只有先断开UDP 关闭线程才能删除旧的建立新连接 是这里迷糊了
  • 打赏
  • 举报
回复
引用 1 楼 SomethingJack 的回复:
如果不关闭之前的线程 那么会建立N个连接 这样很占用电脑资源。
你有 while 循环,本身就是一个错误的设计。
枫0子K 2016-04-22
  • 打赏
  • 举报
回复
对了,UDPServertStart没必要用线程,里面没有占时操作,直接调用就可以了
枫0子K 2016-04-22
  • 打赏
  • 举报
回复
public void UDPServertStart(object o)
{
    try
    {
        IPAddress ipAddress = IPAddress.Parse(Udpip);
        IPLocalPoint = new IPEndPoint(ipAddress, Udpport);
        if (mySocket == null)
        {
            mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        }
        mySocket.Bind(IPLocalPoint);

        //得到客户机IP  
        IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 0);
        RemotePoint = (EndPoint)(ipep);

        if (thread == null || !thread.IsAlive)
        {
            //启动一个新的线程
            thread = new Thread(new ThreadStart(ReceiveHandle));
            thread.Start();
        }
    }
    catch (Exception ex)
    {
        //MessageBox.Show(ex.Message);
        return;
    }
}
接收线程照你逻辑不用每次都创建,而Socket.Bind好像有必要重新绑,不知道IP端口会不会随时变
SomethingJack 2016-04-22
  • 打赏
  • 举报
回复
如果不关闭之前的线程 那么会建立N个连接 这样很占用电脑资源。

110,561

社区成员

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

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

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