2 qq 30109881 qq_30109881 于 2016.05.11 21:56 提问

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

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();
    }
}

}

1个回答

yege2006
yege2006   2016.05.12 09:30

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Win7程序总是未响应的解决方法
我的笔记本电脑装的是64位WIN7旗舰版系统,前阵子总是有程序在运行时或切换时未响应,比如在玩游戏时切出来之后就切不回去了,到任务管理器一看,未响应了,只能使用任务管理器切回去,或者就强行结束进程再开,这样让我很是烦躁,但无奈根本没什么WIN7的使用经验,不知道到底是为什么会造成这样的状况。   今天突然想起这事,又有时间上网,就在网上查了一下,很多论坛、搜问、百度知道的回答都是什么硬
linux下关于服务端断开后客户端自动退出的问题
问题描述:谢了一个客户端和服务端,正常运行后,客户端不断向服务端发送消息,当服务端跟客户端断开连接或者把服务端关闭后,客户端会再发送一次消息后自动退出。而有些情况我们不希望这种情况发生。 原因分析:简单的说就是服务端关闭后,客户端给服务端发送了一条信息,服务端已经关闭,则客户端收到信息,产生SIGPIPE信号,这个信号告诉进程关闭,我们要做的就是捕获这个信号让它按自己的意愿进行 解决方法:
远程服务器断开连接,为什么总自动关闭打开的程序(程序自动关闭)
远程服务器断开连接,为什么总自动关闭打开的程序 系统故障:远程桌面断开时不久,系统就会自动注销(一办都认为原先打开的程序自动关闭)。即:远程桌面断开时,当前运行的软件会自动关闭,正在运行的其它程序也没有了。再用帐户远程登录,发现是一个全新的桌面。  解决办法:         开始-->运行-->gpedit.msc          计算机配置->管理模板->Wind
eclipse 优化 经常未响应解决办法
eclipse 优化 经常未响应解决办法   若显示提示时经常反应慢或未响应 在Eclipse-Window-Preferences-Java-Installed JREs下添加JDK路径,添加后在已安装的jre中勾选新加的JDK,  最后效果如图所示。 增加 -clean 选项。 解释如下: http://www.eclipsezone.com/eclipse/forum
关于客户端长时间自动断开的问题
我先描述一下环境和问题 环境:服务器:IBM P570 AIX5.3    库:oracle 10G 做的双节点的rac   2层架构,c/s模式,客户端直连数据库,没有中间件缓冲池,服务器模式为专有模式(DEDICATED)。还有就是我们的用户都是走的内网,不对外提供服务,因为是医院,客户端都是医生、护士用的。 问题描述:客户端连接数据库后,如果没有任何操作10分钟左右自己断开连接。
关于MySQL安装最后一步一直未响应
打开C盘,然后设置显示隐藏文件,然后找到programData,进去找到mysql,删除。重新安装,。
PLSQL 经常自动断开失去连接的解决过程
问题背景:情况是这样的,很多开发同事的plsql上班时间开着8个小时,有时候他们出去抽烟后或者中午吃完饭,回来在plsql上面执行就报错无响应,然后卡住了半天动弹不了,非得重新登录plsql才生效,我猜猜是因为连接失效的缘故,经常碰到这种情况,还没有影响工作效率和工作心情的。 1,去查看以下CONNECT_TIME的连接时间 SQL> select * from dba_profiles t wh
Dr.com客户端每次登陆后过自动掉线
客户端每次登陆后过自动掉线   解决方法: 1. Window系统自带的防火墙,一般使用客户端后建议用户都把Windows系统自带的防火墙停用,让杀毒软件来进行监控; 2. 实际上Windows服务也会导致误报。一般来讲建议关闭互联网共享服务服务ICS, 避免引起客户端误判。关闭方法:进入“计算机管理”的“服务和应用程序管理”的选项,打开双击ICS服务改成手工运行。 3. 如
SVN检出未响应问题
解决:检查IP地址:比如远程主机与本地主机是否在同一局域网
Office经常出现未响应的解决方法
    office是我们办公柜常用的工具,然而有些人安装了office在使用时经常出现未响应的状况,让我们十分头疼不已,如何解决呀,下面就以word为例。    (1)打开word,查看office是否激活,如果已经激活开始第二步,如果未激活,则需要激活。    (2)点击word的菜单栏中的文件,然后文件-》选项-》高级-》显示,如下所示,将禁用硬件图形加速,禁用后word就不会出现未响应的情...