为什么我的程序老是未响应,而且与客户端交流的时候也会强迫断开?

问题描述

为什么我的程序老是未响应,而且与客户端交流的时候也会强迫断开?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace skt_sv
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TextBox.CheckForIllegalCrossThreadCalls = false;//关闭跨线程控件修改程序检查
}

    ///监听套接字
    private static Socket listener = null;

    //存储接收信息
   // private byte[] recvBytes = new byte[1024];

    //存储键值信息
    private List<string> listname=new List<string>();

    /// <summary>
    /// 监听端口
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            //配置信息
            int port = 5555;
            string host = "127.0.0.1";
            IPAddress ip = IPAddress.Parse(host);
            IPEndPoint ipe = new IPEndPoint(ip, port);
            listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(ipe);
            MessageBox.Show("启动成功!!");
            //当监听到连接请求的时候再创建线程
            listener.Listen(100);
            while (true)
            {
                Socket sktmsg = listener.Accept();
                Thread threadWatch = new Thread(_sktThread);
                threadWatch.IsBackground = true;
                threadWatch.Start(sktmsg);
            }
        }
        catch(Exception error)
        {
            MessageBox.Show(error.ToString());
        }
    }

    Dictionary<string, Socket> dicConn = new Dictionary<string, Socket>();  //字典存储信息

    /// <summary>
    /// 被线程调用 监听连接端口
    /// </summary>
    /// <param name="data"></param>
    private void _sktThread(object data)
    {
        while (true)
        {
            Socket sktmsg = data as Socket;
            string recvstr;
            byte[] recvBytes = new byte[1024];
            sktmsg.Receive(recvBytes);
            recvstr = Encoding.UTF8.GetString(recvBytes);  //接收到的消息
            //MessageBox.Show(recvstr);
            if (recvstr[0] == '*') //首次连接存储相应客户端信息,并且将用户信息发送给已经连接的客户端
            {
                firstLink(recvstr, sktmsg);
            }
            else if (recvstr[0] == '#') //发送聊天内容
            {
                sktsend(recvstr);
            }
        }
    }

    /// <summary>
    /// 处理初次连接的问题
    /// </summary>
    /// <param name="recvstr"></param>
    private void firstLink(string recvstr,Socket sktmsg)
    {
        byte[] sendBytes = new byte[1024];
        string sendstr = "*";
        string strbegin = "*";
        string strend = "#";
        int indexA = recvstr.IndexOf(strbegin);
        int indexB = recvstr.IndexOf(strend);
        string name = recvstr.Substring(indexA+1,indexB-indexA-1);
        dicConn.Add(name,sktmsg);
        for (int i=0;i<listname.Count;i++)
        {
            sendstr += listname[i] + "*";
        }
        listname.Add(name);
        sendBytes = Encoding.UTF8.GetBytes(sendstr);
        sktmsg.Send(sendBytes);//给初次连接的客户端发送目前已经在线的用户
        Socket send = null;
        for (int i = 0; i < listname.Count - 1; i++ ) //给已经在线的用户发送新连接的客户端的信息
        {
            byte[] sendname = new byte[1024];
            send = dicConn[listname[i]];
            sendname = Encoding.UTF8.GetBytes("*"+name+"*");
            send.Send(sendname);
        }
    }

    /// <summary>
    /// 处理聊天问题
    /// </summary>
    /// <param name="recvstr"></param>
    private void sktsend(string recvstr)
    {
        byte[] sendBytes = new byte[1024];
        Socket sendskt;
        string strbegin = "%";
        string strend = "&";
        int indexA = recvstr.IndexOf(strbegin);
        int indexB = recvstr.IndexOf(strend);
        string name = recvstr.Substring(indexA+1,indexB-indexA-1);
        sendskt = dicConn[name];
        sendBytes = Encoding.UTF8.GetBytes(recvstr);
        sendskt.Send(sendBytes,sendBytes.Length,0);
        sendskt.Close();
    }

    /// <summary>
    /// 程序终止
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        MessageBox.Show("程序终止!");
        Application.Exit();
    }
}

}

解决方案

网络访问一般建议在子线程中进行,因为网络访问会占用很长时间,可能会导致线程阻塞从而出现未响应的状况

时间: 2024-11-08 21:57:16

为什么我的程序老是未响应,而且与客户端交流的时候也会强迫断开?的相关文章

winform-.NET WinForm程序运行“未响应”问题

问题描述 .NET WinForm程序运行"未响应"问题 之前给单位管理部门做了一个小型管理软件,采用WPF开发(基本界面,无特效),C#语言,实现增删查功能. 程序正常运行流程(顺序)如下:首先加载Login窗口,用户正确登录后打开Main窗口,Login窗口关闭,用户在Main窗口中进行数据处理(增删改). 用户一直用的不错(用户电脑为Windows 7专业版 32位系统),上周五都能正常使用,本周一使用时出现问题,具体表现如下: Login窗口能正常加载,正常登录后Main窗口打

win8环境下vs2010老是未响应求解决方法

问题描述 win8环境下用vs2010进行开发老是未响应,求大神们提供解决办法最好是详细点 解决方案 解决方案二:这个未响应的问题,涉及的东西,太大了.系统硬件配置拉不动,导致响应不过来最常见.系统内存不大,打开的软件多......解决方案三:换2012.2013换台电脑解决方案四:系统问题也有可能解决方案五:如果刚安装就出现这个问题,那就升级电脑或则重装系统吧.如果是安装了很久,最近才出现这个问题的,禁用某些扩展试试.

Win7系统Word程序未响应不想结束进程该怎么办

  Win7已经成为人们首选的主流操作系统,它以系统稳定著称,但是Win7在软件兼容性方面往往不及WinXP,比如大家在运行Word程序时就会发现经常编辑到一半时卡了,提示"应用程序没有响应",结束进程那么之前工作白做了,不结束干等着也不见它响应,碰到这种情况该如何处理呢? 状况一: 当你在Win7系统上,打开Word进行大批量文字处理时,而电脑内存使用率偏高,那么在文档编辑过程中,就会出现Word文档突然程序未响应问题,那么需要静待一会才可以恢复正常.因为电脑物理内存不足所导致的Wo

Windows如何强行关闭未响应的程序

  第1步:打开任务管理器,用鼠标右键单击在您的Windows的任务栏上显示的时间,然后选择"任务管理器". 或者,您也可以通过按 Ctrl + Shift + Esc键的键盘组合打开任务管理器. 第2步:任务管理器打开时,单击" 应用程序 "选项卡,看看你想关闭的程序,选中此项,然后单击结束进程. 如果程序处于运行状态,程序将关闭,如果你在应用程序中点击"X"按钮. 另一方面,如果程序没有响应,你会看到另一个对话框出现,询问您是否确定要关闭的程

windows7中如何自动或手动关闭未响应程序

一.如何自动关闭未响应程序 自动关闭未响应程序是系统自动完成的,由于Vista/Windows 7在程序执行效率的缘故,很多未响应的程序其实并没死,而完全是因为操作系统的调度引起的"暂停"状态,尤其是很多电脑老手,鼠标操作太快,程序运行和切换已经完全超出操作系统的响应速度,那样很容易造成暂时的假死状态. 比如系统繁忙时运行某些程序.光驱由于光盘质量问题的频繁读写等等情况,一般只需要耐心等待一下,程序就会恢复状态,而在恢复之前,系统则是一直报告未响应的程序(因为线程或进程超时).所以还是

win7系统程序未响应怎么办?

  很多win7用户碰到过这样的一个问题,就是提示说 "程序未响应"问题,而后程序就动不了啦!那么对于这个问题要怎么解决呢?现在一起去看看吧! 1.打开开始-所有程序-附件-运行. 2.打开运行在里面输入regedit运行注册表后点击确定. 3.依次展开到HKEY_CURRENT_USERControl PanelDesktop,然后在空白处单击右键,新建一个"DWORD 32位值". 4.然后重命名为 WaitToKillAppTimeout后双击文件再确认一下该

如何自动或手动关闭未响应程序

本文介绍Windows XP/Vista/Win7中设置关闭未响应程序方法,尽管Windows 7在程序容错性方面做了很大改进,但未响应程序及死机情况还是会经常遇到,这类问题各有原因,系统.软件和硬件都有责任,遇到未响应程序时,耐心先等待一下,实在不行就想办法咔嚓掉,但要注意先备份好数据,因为结束进程还可能导致系统死机.自动重启等现象,尤其是些跟硬件关联的程序. 一.如何自动关闭未响应程序 自动关闭未响应程序是系统自动完成的,由于Vista/Windows 7在程序执行效率的缘故,很多未响应的程

windows7出现程序未响应的解决方法

  很多win7用户都会经常遇到,在运行软件或打开文档会出现应用程序未响应的提示,那么出现这种问题我们应该如何解决呢?网络中给出了很多的解决方案,那么下面河东小编为大家提供一个详细的图文教程,来帮助用户解决此问题. 首先,打开"开始"菜单,打开"所有程序",进入"附件",点击"运行". 其次,打开运行在里面输入regedit运行注册表后点击确定. 接着,依次展开到HKEY_CURRENT_USERControl PanelDe

win7程序未响应故障解决办法

  win7系统很容易被卡住,这个问题应该使用win7系统的人都经常遇到的吧?甚至有的时候在使用浏览器的时候也会遇到程序未响应的情况,那么win7程序未响应怎么解决呢? 第一步,在菜单中找到附件选项,有的可能直接打开菜单就可以看到,有的也许要点击最下面的所有程序才可以看到! 单击附件之后,我们直接点击运行.或者说,我们可以直接按下"win+r"的快捷键打开运行窗口. 在运行窗口中输入regedit并回车确定,这个时候就会跳出来电脑的注册表编辑窗口. 接下来我们依次展开HKEY_CURR