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

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

本小程序是<>里面的。

c#-网络编程,聊天工具_第1张图片
c#-网络编程,聊天工具_第2张图片

基本的类介绍

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#-网络编程,聊天工具)