将逆流 2016-05-11 13:56 采纳率: 0%
浏览 1388

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

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条回答

  • 苏王 2016-05-12 01:30
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况