C#建立网络通信详解(一)

5 篇文章 4 订阅

C#建立网络通信可以使用Socket类或者TcpListener类,本文详细讲解使用Socket类建立网络通信。

Socket简单介绍

  • Socket接口是TCP/IP网络的应用程序接口(API)。程序员可以用它们来开发TCP/IP网络应用程序。Socket可以看成是网络通信上的一个端点,也就是说,网络通信包括两台主机或两个进程,通过网络传递它们之间的数据。因此为了进行网络通信,程序在网络对话的每一端都需要一个Socket
  • TCP/IP传输层使用协议端口将数据传送给一台主机的特定应用程序,当传输层模块的网络软件模块要与另一个程序通信时,它将使用协议端口。Socket是运行在传输层的API,所以在使用Socket建立连接发送数据时,要指定一个端口给它
  • 使用Socket接口进行网络通信的简要步骤如下:
    ① 建立一个socket
    ②配置socket,就是将socket连接到远程主机或给socket指定一个本地协议端口
    ③ 通过socket发送和接收数据
    ④ 关闭此socket

C#Socket使用详解

  • 命名空间的添加
    using System.Net;
    using System.Net.Socket;

  • 构造Socket对象
    sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    参数解释:
    AddressFamily成员指定socket用来解析地址的寻址方案。例如,InterNetwork表示需要一个IP版本4的地址,InterNetworkV6表示IP版本6的地址。
    SocketType参数指定Socket的类型。例如,Raw支持对基础传输协议的访问,Stream支持可靠、双向、基于连接的数据流。
    ProtocolType指定Socket类支持的协议。例如,IP表示网际协议,TCP表示传输控制协议。

  • Socket的配置和连接
    IPAddress ServerIP=IPAdress.Parse(” 192.18.16.186”); //设定服务器IP地址
    IPEndPoint Server=new IPEndPoint(ServerIP,8866); //生成服务器网络端点
    Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,
    ProtocolType.Tcp) // 构造一个socket
    Sock.Bind(Server); //将socket和服务器绑定
    Sock.Listen(8); //开始监听,允许连接队列的长度为8(若为0表示无限制)
    Socket connectsock=sock.Accept();//用于同连接请求的socket通信
    参数解释:
    ServerIP表示IP地址,8866表示提供服务的端口号。

  • 客户端向服务器端发出连接请求
    IPEndPoint Server=new IPEndPoint(ServerIP,Port); //定义要连接的服务器端点
    Sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,
    ProtocolType.Tcp) // 构造一个socket
    Sock.Connect(Server); // 与服务器连接

  • 数据的传送和接收
    public static string data=null; //定义字符串变量存放接收到的信息
    bytes=new byte[1024];
    int bytesRec=connectsock.Receive(bytes,bytes.Lentgh,0); //接受来自客户端的数据
    Console.WriteLine(”Text received:{0}”,bytes); //显示接收到的数据
    connectsock.Send(bytes,bytes.Length,0); //发送数据到客户端
    参数解释:
    bytes表示要发送(接收)的数据;bytes.Length表示要发送(接收)数据的大小;0是Socket消息的常数值,具有允许按位组合其成员值的属性。
    返回值为发送到socket的字节数。

  • 关闭Socket
    Sock.Close();//关闭Socket连接
    注意
    在socket关闭之前,要确保已经发送和接收完所有挂起的数据,因此在关闭socket之前,要先调用
    Sock.Shutdown(SocketShutdown.Both);
    参数解释:SocketShutdown指定不再允许的操作。成员名称:Both禁止socket发送和接收;Receive禁止socket接收数据;Send禁止socket发送数据。

Socket通讯主要可以分为同步与异步两种。同步相对来说会更简单,但因为会造成线程阻塞,所以适用性不高,但从学习入门角度来看,可以更简单直接地了解整个过程。下面给出一个简单例子,是同步Socket服务端程序的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp210
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IPEndPoint iP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Bind(iP);
            socket.Listen(0);

            while (true)
            {
                Socket socke = socket.Accept();

                byte[] vs = new byte[1024];

                int lenth = socke.Receive(vs);

                richTextBox1.Text += "消息:" + Encoding.UTF8.GetString(vs) + "\r\n";

                MessageBox.Show(Encoding.UTF8.GetString(vs));

                socke.Send(Encoding.UTF8.GetBytes("已接收"));
            }
        }
    }
}

在下一篇文章里会提供异步Socket服务端和客户端程序的例子。

  • 8
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值