A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许大虾 中级黑马   /  2013-6-19 12:52  /  4108 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 许大虾 于 2013-6-20 11:34 编辑


源码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;//包含IP,IPAdress,IPEndPoint(ip和端口)类
using System.Net.Sockets;//导入套接字
using System.Threading;
namespace MyCharRoomServer
{
    public partial class FChatServer : Form
    {
        public FChatServer()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭对文本框的跨线程操作检查
            
        }
        Thread threadWatch = null;//负责监听客户端连接请求的线程
        Socket socketWatch = null;//负责监听的套接字
        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
        private void btnBeginListem_Click(object sender, EventArgs e)
        {
            //创建服务端负责监听的套接字,参数(使用IP4寻址协议,使用流式连接,使用TCP协议传输数据)
         
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //获得文本框中的IP地址对象
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            //创建包含ip和port的网络节点对象
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
            //将负责监听的套接字 绑定到唯一的IP和端口上
            socketWatch.Bind(endpoint);
            //设置监听队列的长度
            socketWatch.Listen(10);
            //创建负责监听的线程,并传入监听方法
            threadWatch = new Thread(WatchConnecting);
            threadWatch.IsBackground = true;//设置为后台线程
            threadWatch.Start();//开启线程

            ShowMsg("服务器启动监听成功!");
            //socketWatch.Bind
            //IPEndPoint
        }
        
      
        /// <summary>
        /// 监听客户端请求的方法
        /// </summary>
        void WatchConnecting()
        {
            while (true) //持续不断监听新的客户端的连接请求
            {
               
                //开始监听客户端连接请求,注意:Accept方法,会阻断当前的线程!
                Socket sokConnetion = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责和该客户端通信的套接字 sokConnetion
                //向列表控件中 添加一个客户端的ip端口字符串 作为客户端的唯一标识
                lbOnline.Items.Add(sokConnetion.RemoteEndPoint.ToString());
                //将与客户端通信的套接字对象 sokConnection添加到键值对集合中,并与客户端IP端口作为键值
                dict.Add(sokConnetion.RemoteEndPoint.ToString(),sokConnetion);
                ShowMsg("客户端连接成功!");
            }
        }
        //发送消息到客户端
        private void btnSend_Click(object sender, EventArgs e)
        {   
            string strMsg = txtMsgSend.Text.Trim();
            //将要发送的字符串转成utf8对应的字节数组
            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
            //获得列表中 选中的Key
            string strClientKey = lbOnline.Text;
            //通过key,找到字典集合中对应的与某个客户端通信的套接字send方法,发送数据给对方
            dict[strClientKey].Send(arrMsg);
            //sokConnetion.Send(arrMsg);
            ShowMsg("发送了数据出去:" + strMsg);
        }
        void ShowMsg(string msg)
        {
            txtMsg.AppendText(msg + "\r\n");
        }
      
        
    }
}


评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

1 个回复

正序浏览
自己处理好了。。。

原因是没有选中列表  

为了不让异常再出现 直接在以下代码中加个判断文本是否为空的判断提示
  1. private void btnSend_Click(object sender, EventArgs e)
  2.         {   
  3.            if (string.IsNullOrEmpty(lbOnline.Text))
  4.             {
  5.                 MessageBox.Show("请选择要发送的好友");
  6.             }
  7.            else
  8. {
  9.             string strMsg = txtMsgSend.Text.Trim();
  10.             //将要发送的字符串转成utf8对应的字节数组
  11.             byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
  12.             //获得列表中 选中的Key
  13.             string strClientKey = lbOnline.Text;
  14.             //通过key,找到字典集合中对应的与某个客户端通信的套接字send方法,发送数据给对方
  15.             dict[strClientKey].Send(arrMsg);
  16.             //sokConnetion.Send(arrMsg);
  17.             ShowMsg("发送了数据出去:" + strMsg);
  18.         }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马