美文网首页
c#-网络编程,聊天工具

c#-网络编程,聊天工具

作者: jeffleefree | 来源:发表于2016-06-07 16:43 被阅读217次

    c#的网络编程比较简单,有相关的类来实现相关的功能。

    本小程序是<<c#网络编程>>里面的。

    基本的类介绍

    tcpClient

    TcpClient 类提供了一些简单的方法,用于在同步阻止模式下通过网络来连接、发送和接收流数据。
    
    为使 TcpClient 连接并交换数据,使用 TCP ProtocolType 创建的 TcpListener 或 Socket 必须侦听是否有传入的连接请求。 可以使用下面两种方法之一连接到该侦听器:
    
    创建一个 TcpClient,并调用三个可用的 Connect 方法之一。
    
    使用远程主机的主机名和端口号创建 TcpClient。 此构造函数将自动尝试一个连接。
     
    

    tcpListener

    TcpListener 类提供一些简单方法,用于在阻止同步模式下侦听和接受传入连接请求。 可使用 TcpClient 或 Socket 来连接 TcpListener。 可使用 IPEndPoint、本地 IP 地址及端口号或者仅使用端口号,来创建 TcpListener。 可以将本地 IP 地址指定为 Any,将本地端口号指定为 0(如果希望基础服务提供程序为您分配这些值)。 如果您选择这样做,可在连接套接字后使用 LocalEndpoint 属性来标识已指定的信息。
    
    使用 Start 方法,可开始侦听传入的连接请求。 Start 将对传入连接进行排队,直至您调用 Stop 方法或它已经完成 MaxConnections 排队为止。 可使用 AcceptSocket 或 AcceptTcpClient 从传入连接请求队列提取连接。 这两种方法将阻止。 如果要避免阻止,可首先使用 Pending 方法来确定队列中是否有可用的连接请求。
    
    调用 Stop 方法来关闭 TcpListener。
    
    

    还需要理解线程,委托和事件。

    服务器端

    有一个listener类来监听,Sender类来发送消息。
    listener类关键代码

     private void Listen()
            {
                try
                {
                    IPAddress addr = IPAddress.Parse(Form1.ipaddress);
                    IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5656);//服务器端需要使用endpoint
                    tcp1 = new TcpListener(ipLocalEndPoint);
                    tcp1.Start();
                    while(listenerRun)//开始进行监听
                    {
                        Socket s = tcp1.AcceptSocket();
                        string remote = s.RemoteEndPoint.ToString();
                        Byte[] stream = new Byte[1024];
                        int i = s.Receive(stream);
                        string msg;
                        string str = System.Text.Encoding.UTF8.GetString(stream);
                        //MessageBox.Show(str);
                        if(str.Substring(0,1) == "1")
                        {
                            string str_ = "欢迎登陆!";
                            TcpClient tcpc = new TcpClient(((IPEndPoint)s.RemoteEndPoint).Address.ToString(), 5657);
                            NetworkStream tcpStream = tcpc.GetStream();
                            Byte[] data = System.Text.Encoding.UTF8.GetBytes(str_);//将字符串转为byte
                            tcpStream.Write(data, 0, data.Length);
                            tcpc.Close();
                            msg = "<" + remote + ">" + "上线";
                            AddMessageEventArgs arg = new AddMessageEventArgs();
                            arg.mess = msg;
                            OnAddMessage(this, arg);
                        }
                        else if(str.Substring(0,1)=="0")
                        {
                            msg = "<" + remote + ">" + "断开";
                            AddMessageEventArgs argRe = new AddMessageEventArgs();
                            argRe.mess = remote.ToString();
                            OnIpRemod(this, argRe);
                            AddMessageEventArgs arg = new AddMessageEventArgs();
                            arg.mess = msg;
                            OnAddMessage(this, arg);
                        }
                        
                        else
                        {
                            msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
                            AddMessageEventArgs arg = new AddMessageEventArgs();
                            arg.mess = msg;
                            OnAddMessage(this, arg);
                        }
                    }
                }
    

    sender关键代码

    public void Send(string str)//需要发送的字符串
            {
                try
                {
                    TcpClient tcpc = new TcpClient(obj, 5657);
                    NetworkStream tcpStream = tcpc.GetStream();
                    Byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(str);
                    tcpStream.Write(data, 0, data.Length);
                    tcpStream.Close();
                    
                }
                catch(Exception)
                {
                    MessageBox.Show("连接被目标主机拒绝");
                }
            }
    

    客户端

    listener类关键代码

    private void Listen()
            {
                try
                {
    
                    IPAddress addr = IPAddress.Parse(Form1.ipaddress);
                    IPEndPoint ipLocalEndPoint = new IPEndPoint(addr, 5657);
                    tcp1 = new TcpListener(ipLocalEndPoint);
                    tcp1.Start();
                    while(listenerRun)
                    {
                        Socket s = tcp1.AcceptSocket();
                        string remote = s.RemoteEndPoint.ToString();
                        Byte[] stream = new Byte[1024];
                        int i = s.Receive(stream);
                        string msg = "<" + remote + ">" + System.Text.UTF8Encoding.UTF8.GetString(stream);
                        AddMessageEventArgs arg = new AddMessageEventArgs();
                      
                        arg.mess = msg;
                        OnAddMessage(this, arg);
                       // MessageBox.Show(msg);
                    }
    
                }
                catch(System.Security.SecurityException)
                {
                    MessageBox.Show("防火墙禁止连接");
                }
                catch(Exception)
                {
                    MessageBox.Show("监听已经停止");
                }
            }
        }
    

    提供文件下载

    链接: http://pan.baidu.com/s/1skYeq6L 密码: 93yg

    相关文章

      网友评论

          本文标题:c#-网络编程,聊天工具

          本文链接:https://www.haomeiwen.com/subject/ohtglttx.html