• TCP


    TCP:保证数据分组可靠送达。

    若在网络传输时,没有将分组数据送达接收端,将会再次发送这个分组。

    若分组到达后顺序搞乱,则TCP对接收程序透明的按正确顺序组装分组。

    如果收到重复分组,则TCP放弃重复分组。

    UDP:不保证分组(数据报)到达目的地或按正确顺序达到。

    UDP开销很少,因为UDP数据报不需要携带TCP分组保证可靠性的信息。

    UDP比TCP的网络通信流更少,因为不需要握手、重传等等。

    一、UML序列图

    二、核心代码

     1、服务器端:

    //第一步:【TcpListener】监听客户端连接
    listenser = new TcpListener(new IPEndPoint(local, port));
    listenser.Start();

    //第二:等待连接,此处等待连接,若没有连接,线程挂起一直等待,直到接收到为止
    connection = listenser.AcceptSocket();
    //第三:【NetWorkStream】建立网络传输数据流
    netWorkStream = new NetworkStream(connection);

    //第四:【BinaryRead、BinaryWrite】建立二进制网络读写操作
    read = new BinaryReader(netWorkStream);
    write = new BinaryWriter(netWorkStream);

    //第五:向客户端发送数据
    write.Write("服务端 >> 连接成功!");

    //第六:读取客户端信息(while循环接收、发送)
    theReply=read.ReadString();

     write.Write("服务端 >> "+inputTextBox.Text);

    //第七:释放资源
    write.Close();
    read.Close();
    netWorkStream.Close();
    connection.Close();

    2、客户端

    //第一步:【TcpClient】访问服务端
    client = new System.Net.Sockets.TcpClient();
    client.Connect("127.0.0.1", port);

    //第二步:【NetWorkStream】从服务器端获取网络传输数据流
    netWorkStream = client.GetStream();

    //第三:【BinaryRead、BinaryWrite】建立二进制网络读写操作
    read = new BinaryReader(netWorkStream);
    write = new BinaryWriter(netWorkStream);

    //第四:读取客户端信息(循环接收、发送)
    message = read.ReadString();

    write.Write("客户端 >> " + inputTextBox.Text);

    //第五:释放资源
    write.Close();
    read.Close();
    netWorkStream.Close();
    connection.Close();

    三、示例代码

    服务器端代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 using System.Net.Sockets;
     10 using System.Threading;
     11 using System.IO;
     12 using System.Net;
     13 
     14 namespace TcpServer
     15 {
     16     public partial class CharServerForm : Form
     17     {
     18 
     19         private Socket connection;
     20         private Thread readThread;
     21         private NetworkStream netWorkStream;
     22         private BinaryWriter write;
     23         private BinaryReader read;
     24 
     25         public CharServerForm()
     26         {
     27             InitializeComponent();
     28         }
     29 
     30         private void CharServerForm_Load(object sender, EventArgs e)
     31         {
     32             readThread = new Thread(new ThreadStart(RunServer));
     33             readThread.Start();
     34         }
     35 
     36         public delegate void ShowDisplayTextDelgate(string showText);
     37 
     38         public void ShowDisplayText(string showText)
     39         {
     40             if (displayTextBox.InvokeRequired)
     41             {
     42                 displayTextBox.Invoke(new ShowDisplayTextDelgate(ShowDisplayText), showText);
     43             }
     44             else
     45             {
     46                 displayTextBox.Text += showText + "
    ";
     47 
     48                 displayTextBox.Focus();//获取焦点
     49                 displayTextBox.Select(displayTextBox.TextLength, 0);//光标定位到文本最后
     50                 displayTextBox.ScrollToCaret();//滚动到光标处
     51             }
     52         }
     53 
     54         public delegate void DisableInputTextBoxDelegate(bool value);
     55         public void DisableInputTextBox(bool value)
     56         {
     57             if (inputTextBox.InvokeRequired)
     58             {
     59                 inputTextBox.Invoke(new DisableInputTextBoxDelegate(DisableInputTextBox), value);
     60             }
     61             else
     62             {
     63                 inputTextBox.Enabled = !value;                
     64                 btnSend.Enabled = !value;
     65                 btnDisConnect.Enabled = !value;
     66 
     67                 inputTextBox.ReadOnly = value;
     68                 
     69             }
     70         }
     71 
     72         //===【核心代码】==========
     73         private void RunServer()
     74         {
     75             TcpListener listenser;
     76             int count = 1;
     77 
     78             try
     79             {
     80                 IPAddress local = IPAddress.Parse("127.0.0.1");
     81                 int port = 5000;
     82                 //第一步:【TcpListener】监听客户端连接
     83                 listenser = new TcpListener(new IPEndPoint(local, port));
     84                 listenser.Start();
     85 
     86                 while (true)
     87                 {
     88                     ShowDisplayText("等待客户端连接...");
     89 
     90                     //第二:等待连接,此处等待连接,若没有连接,线程挂起一直等待,直到接收到为止
     91                     connection = listenser.AcceptSocket();
     92                     //第三:【NetWorkStream】建立网络传输数据流
     93                     netWorkStream = new NetworkStream(connection);
     94 
     95                     //第四:【BinaryRead、BinaryWrite】建立二进制网络读写操作
     96                     read = new BinaryReader(netWorkStream);
     97                     write = new BinaryWriter(netWorkStream);
     98 
     99                     ShowDisplayText("服务端 >> 连接成功!");
    100 
    101                     //第五:向客户端发送数据
    102                     write.Write("服务端 >> 连接成功!");
    103                     DisableInputTextBox(false);
    104 
    105                     string theReply = "";
    106                     do{
    107                         try 
    108                         {            
    109                             //第六:读取客户端信息
    110                             theReply=read.ReadString();
    111                             ShowDisplayText(theReply);
    112                         }
    113                         catch (Exception ex)
    114                         {
    115                             break;
    116                         }
    117                     } while (theReply != "客户端 >> 断开连接" && connection.Connected);
    118 
    119 
    120                     ShowDisplayText("用户已断开连接!");
    121 
    122                     //第七:释放资源
    123                     write.Close();
    124                     read.Close();
    125                     netWorkStream.Close();
    126                     connection.Close();
    127 
    128                     DisableInputTextBox(true);
    129                     count++;
    130                 }
    131 
    132             }
    133             catch (Exception ex)
    134             {
    135                 ShowDisplayText("错误:" + ex.Message);
    136             }
    137 
    138 
    139         }
    140 
    141         private void btnSend_Click(object sender, EventArgs e)
    142         {
    143             try
    144             {
    145                 if (write != null && inputTextBox.ReadOnly == false)
    146                 {
    147                     write.Write("服务端 >> "+inputTextBox.Text);
    148                 }
    149             }
    150             catch (Exception ex)
    151             {
    152                 MessageBox.Show(ex.Message);
    153             }
    154         }
    155 
    156         private void btnDisConnect_Click(object sender, EventArgs e)
    157         {
    158             if (connection != null)
    159             {
    160                 write.Write("服务端 >> 断开连接");
    161                 
    162                 connection.Disconnect(false);
    163                 connection.Close();
    164                 ShowDisplayText("已断开连接!");
    165             }
    166             inputTextBox.Clear();
    167             
    168         }
    169 
    170         private void CharServerForm_FormClosing(object sender, FormClosingEventArgs e)
    171         {
    172             System.Environment.Exit(System.Environment.ExitCode);
    173         }
    174         //========================
    175     }
    176 }
    服务端代码
    客户端代码
      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Windows.Forms;
      9 using System.Net.Sockets;
     10 using System.IO;
     11 using System.Threading;
     12 using System.Net;
     13 
     14 namespace TcpClient
     15 {
     16     public partial class CharClientForm : Form
     17     {
     18         private Socket connection;
     19         private Thread readThread;
     20         private NetworkStream netWorkStream;
     21         private BinaryWriter write;
     22         private BinaryReader read;
     23 
     24         private string message = "";
     25 
     26         public CharClientForm()
     27         {
     28             InitializeComponent();
     29         }
     30 
     31         private void CharClientForm_Load(object sender, EventArgs e)
     32         {
     33             readThread = new Thread(new ThreadStart(RunClient));
     34             readThread.Start();
     35         }
     36 
     37 
     38 
     39         public delegate void ShowDisplayTextDelgate(string showText);
     40 
     41         public void ShowDisplayText(string showText)
     42         {
     43             if (displayTextBox.InvokeRequired)
     44             {
     45                 displayTextBox.Invoke(new ShowDisplayTextDelgate(ShowDisplayText), showText);
     46             }
     47             else
     48             {
     49                 displayTextBox.Text += showText + "
    ";
     50                 displayTextBox.Focus();//获取焦点
     51                 displayTextBox.Select(displayTextBox.TextLength, 0);//光标定位到文本最后
     52                 displayTextBox.ScrollToCaret();//滚动到光标处
     53             }
     54         }
     55 
     56         public delegate void DisableInputTextBoxDelegate(bool value);
     57         public void DisableInputTextBox(bool value)
     58         {
     59             if (inputTextBox.InvokeRequired)
     60             {
     61                 inputTextBox.Invoke(new DisableInputTextBoxDelegate(DisableInputTextBox), value);
     62             }
     63             else
     64             {
     65                 inputTextBox.Enabled = !value;
     66                 btnSend.Enabled = !value;
     67                 btnDisConnect.Enabled = !value;
     68 
     69                 inputTextBox.ReadOnly = value;
     70 
     71             }
     72         }
     73 
     74         //===【核心代码】==========
     75         public void RunClient()
     76         {
     77             System.Net.Sockets.TcpClient client;
     78 
     79             try
     80             {
     81 
     82                 int port = 5000;
     83 
     84                 ShowDisplayText("连接服务器端...");
     85                 //第一步:【TcpClient】访问服务端
     86                 client = new System.Net.Sockets.TcpClient();
     87                 client.Connect("127.0.0.1", port);
     88                                 
     89                 //第二步:【NetWorkStream】从服务器端获取网络传输数据流
     90                 netWorkStream = client.GetStream();
     91 
     92                 //第三:【BinaryRead、BinaryWrite】建立二进制网络读写操作
     93                 read = new BinaryReader(netWorkStream);
     94                 write = new BinaryWriter(netWorkStream);
     95 
     96                 //ShowDisplayText("客户端 >> 连接成功!");
     97                 DisableInputTextBox(false);
     98 
     99                 
    100                 do
    101                 {
    102                     try
    103                     {
    104                         Console.WriteLine("接收到信息.....");
    105                         //第四:读取客户端信息
    106                         message = read.ReadString();
    107                         ShowDisplayText(message);
    108                     }
    109                     catch (Exception ex)
    110                     {
    111                         Console.WriteLine(ex.Message);
    112                         System.Environment.Exit(System.Environment.ExitCode);
    113                     }
    114                 } while (message != "服务端 >> 断开连接");
    115 
    116 
    117                 ShowDisplayText("用户已断开连接!");
    118 
    119                 //第五:释放资源
    120                 write.Close();
    121                 read.Close();
    122                 netWorkStream.Close();
    123                 connection.Close();
    124 
    125                 Application.Exit();
    126 
    127             }
    128             catch (Exception ex)
    129             {
    130                 ShowDisplayText("错误:" + ex.Message);
    131             }
    132 
    133 
    134         }
    135 
    136         private void btnSend_Click(object sender, EventArgs e)
    137         {
    138             try
    139             {
    140                 if (write != null && inputTextBox.ReadOnly == false)
    141                 {
    142                     write.Write("客户端 >> " + inputTextBox.Text);
    143                 }
    144             }
    145             catch (Exception ex)
    146             {
    147                 MessageBox.Show(ex.Message);
    148             }
    149         }
    150 
    151         private void btnDisConnect_Click(object sender, EventArgs e)
    152         {
    153             if (write!=null)
    154             {
    155                 write.Write("客户端 >> 断开连接");
    156                 
    157                 ShowDisplayText("已断开连接!");
    158                 System.Environment.Exit(System.Environment.ExitCode);
    159             }
    160             
    161         }
    162 
    163         private void CharClientForm_FormClosing(object sender, FormClosingEventArgs e)
    164         {
    165             System.Environment.Exit(System.Environment.ExitCode);
    166         }
    167 
    168         
    169         //========================
    170     }
    171 }
    客户端代码

    运行效果:

  • 相关阅读:
    HTML 5 视频/音频
    vue 未完待续
    asp.net中使用log4net
    图片预加载:jquery 图片预加载功能,可以实现先模糊在清晰的显示
    IIS配置PHP环境
    学习ASP.Net的过滤器
    最好用的jQuery插件,240多个,绝对的JQUERY插件库
    Windows7&IIS7.5部署Discuz全攻略
    AjaxPro使用
    ASP.NET XML读取、增加、修改和删除操作
  • 原文地址:https://www.cnblogs.com/qiupiaohujie/p/11963908.html
Copyright © 2020-2023  润新知