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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容