现在的位置: 首页 > 综合 > 正文

C#版异步TCP聊天服务器端简单代码示例

2013年02月05日 ⁄ 综合 ⁄ 共 2700字 ⁄ 字号 评论关闭

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 异步TCP服务端
{
    public partial class Form1 : Form
    {
        private IPAddress LocalIP;
        private Socket LocalSocket;
        private byte[] bytes = new byte[1024];
        private byte[] data = new byte[1024];
        private string msgBuffer = "";
        private Socket RemoteSocket;
        private IPAddress[] ips;
        private  const int port_server = 5555;
        //private byte[] buffer=new byte[1024];
        public Form1()
        {
            InitializeComponent();
        }
        #region 窗体加载
        //加载窗体的时候:
        //1、绑定IP地址
        //2、监听
        //3、接受连接并返回ClientSocket(RemoteSocket)
        private void Form1_Load(object sender, EventArgs e)
        {
            //获取IP地址并指定端口
            ips = Dns.GetHostAddresses(Dns.GetHostName());
            foreach (IPAddress myhost_ip in ips)
            {
                if (myhost_ip.AddressFamily == AddressFamily.InterNetwork)
                {
                    LocalIP = myhost_ip;
                    break;
                }
            }
            IPEndPoint IEP = new IPEndPoint(LocalIP, port_server); //绑定IP地址 
            LocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            LocalSocket.Bind((EndPoint)IEP);
            LocalSocket.Listen(10);                                  //监听
                                                                    //接受连接
            LocalSocket.BeginAccept(
                        new AsyncCallback(acceptCallback),  //委托,指定回调函数
                        LocalSocket                         //state对象,包含本机的状态信息
                        );    
        }
        #endregion
        #region //  接受连接回调函数     
        private void acceptCallback(IAsyncResult ar)
        {                                                  //执行连接的接受操作
            Socket temp = (Socket)ar.AsyncState;
            RemoteSocket = temp.EndAccept(ar);
                       //接受连接请求
            string str_iep=RemoteSocket.RemoteEndPoint.ToString();
            showuserbox.Items.Add(str_iep+"在线");
           
                                   //开始异步的数据接收
                    RemoteSocket.BeginReceive(
                    bytes,                              //指定接收数据的容器(buffer)
                    0,
                    1024,
                    SocketFlags.None,
                    new AsyncCallback(receiveCallback),//指定回调函数
                    RemoteSocket);                     //指定传送给回调函数的状态参数
        }
        #endregion                                       //接收数据回调函数    //执行数据的接收
         #region
        private void receiveCallback(IAsyncResult ar)
        {
            Socket temp = (Socket)ar.AsyncState;
            int length = temp.EndReceive(ar);
                                                                   //开始下一次的异步数据
                temp.BeginReceive(
                    bytes,                              //指定接收数据的容器(buffer)
                    0,
                    1024,
                    SocketFlags.None,
                    new AsyncCallback(receiveCallback),//指定回调函数
                    temp);                     //指定传送给回调函数的状态参数
                msgBuffer = Encoding.UTF8.GetString(bytes);
            Thread redatathread=new Thread(show_data);
            redatathread.Start();
        }
        private void show_data()
        {
            show_msg_list(msgBuffer);
        }
        #endregion

        //点击发送按钮:发送数据
        private void send_Click(object sender, EventArgs e)
        {
            data = Encoding.UTF8.GetBytes("浪子:"+content.Text);
              RemoteSocket.BeginSend(           //把服务端的数据发送到客户端
                  data,
                0,                                //使用RemoteSocket进行发送
                data.Length,
                SocketFlags.None,
                new AsyncCallback(sendCallback),
                RemoteSocket);
            msg.Items.Add(DateTime.Now.ToString());
            msg.Items.Add("浪子:" + content.Text);
            //tems.Add(hostname+content.Text+DateTime.Now.ToString());
        
        }
        private void sendCallback(IAsyncResult ar)

        {
            Socket temp = (Socket)ar.AsyncState;
            temp.EndSend(ar);
        
        }
      
        private delegate void datadelegate(String str);//委托
        private void show_msg_list(string str)
       {
           if (msg.InvokeRequired)
           {
               datadelegate datag = show_msg_list;
               msg.Invoke(datag, str);
           }
           else
           {
               msg.Items.Add(DateTime.Now.ToString());
               msg.Items.Add(str);
           
           }
   }
    }
}

抱歉!评论已关闭.