C#的网络传输

作者: _Arturia | 来源:发表于2017-11-22 14:33 被阅读42次

服务端

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace MySurver
{

class Program
{
    private static Socket serverSocket;
    private static int PORT = 1780;

    private const int BUFFER_SIZE = 2048;
    private static readonly byte[] buffer = new byte[BUFFER_SIZE];

    //初始化服务器
    static void InitServer()
    {
        Console.WriteLine("InitServer");
        //实例化服务器
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //IPAddress.Any IPAddress.Parse("192.168.0.147")
        //实例化一个IP端口对象
        //IPAddress.Any是自动匹配本机的IP
        IPEndPoint ep = new IPEndPoint(IPAddress.Any, PORT);

        //绑定IP端口
        serverSocket.Bind(ep);

        //设置客户端连接数量
        serverSocket.Listen(100);
    }

    //监听客户端的方法
    static void AcceptClientSocket()
    {
        //监听客户端的变化,一直等待客户端的链接
        //如果有客户端链接会终止等待跳转到 AcceptClientCallBack回掉函数里面去
        serverSocket.BeginAccept(AcceptClientCallBack, null);
    }

    //客户端连接回调函数
    static void AcceptClientCallBack(IAsyncResult ar)
    {
        Socket socket;
        //必须要终,才能重新开启一个新的连接
        try
        {
            socket = serverSocket.EndAccept(ar);
        }
        catch (ObjectDisposedException)
        {
            return;
        }
        
        //接收客户端的消息
        socket.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, socket);

        Console.WriteLine("有新的客户端连接");
        //再次重新开启一个新的连接
        serverSocket.BeginAccept(AcceptClientCallBack, null);
    }



    private static void ReceiveCallback(IAsyncResult AR)
    {
        Socket current = (Socket)AR.AsyncState;
        int received;

        try
        {
            received = current.EndReceive(AR);
        }
        catch (SocketException)
        {
            Console.WriteLine("Client forcefully disconnected");
            current.Close();
            return;
        }

        byte[] recBuf = new byte[received];
        Array.Copy(buffer, recBuf, received);
        string text = Encoding.ASCII.GetString(recBuf);
        Console.WriteLine("Received Text: " + text);

        //继续监听消息
        current.BeginReceive(buffer, 0, BUFFER_SIZE, SocketFlags.None, ReceiveCallback, current);
    }


    static void Main(string[] args)
    {
        //初始化
        InitServer();
        //接收新的客户端
        AcceptClientSocket();

        Console.ReadLine();

    }
}

}

客户端

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace MyClient
{
class Program
{

    private const int BUFFER_SIZE = 2048;

    private static byte[] buffer = new byte[BUFFER_SIZE];

    private static Socket ClientSocket = new Socket
        (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    private const int PORT = 1780;

    static void Main()
    {
        Console.Title = "Client";
        ConnectToServer();
        RequestLoop();
    }

    private static void ConnectToServer()
    {
        int attempts = 0;

        while (!ClientSocket.Connected)
        {
            try
            {
                attempts++;
                Console.WriteLine("Connection attempt " + attempts);
                ClientSocket.Connect(IPAddress.Parse("192.168.0.137"), PORT);
            }
            catch (SocketException)
            {
                Console.Clear();
            }
        }

        Console.Clear();
        Console.WriteLine("Connected");
    }

    private static void RequestLoop()
    {
        while (true)
        {
            SendRequest();
        }
    }

    private static void SendRequest()
    {
        string request = Console.ReadLine();
        SendString(request);
    }

    private static void SendString(string text)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        ClientSocket.Send(buffer, 0, buffer.Length, SocketFlags.None);
    }
}

}

相关文章

  • C#的网络传输

    服务端 using System;using System.Collections.Generic;using S...

  • C# 用LZ4压缩文本

    文本太长对网络传输是个问题,所以找了一些压缩的方法,发现LZ4不错。 对应C#版本的,找到了lz4net这个工具,...

  • 网络传输

    20世纪60年代以来, 计算机网络得到了飞速发展。 各大厂商和标准组织为了在数据通信网络领域占据主导地位, 纷纷推...

  • 网络传输

    ####IP--分类编址ipv4:的表现形式(32位二进制数)例如:255.255.255.0 表示方式: 1.网...

  • 网络传输

    网络协议这一块,应该这样理解,Ip协议、MAC地址协议、TCP协议、http协议,这些协议是这么一种关系:盖房子的...

  • 网络传输

    DHCP 你有没有想过你的计算机是如何获取 IP 地址的?首先你必须知道计算机获取 IP 地址是有两种途径的,一种...

  • Rpc 框架 Thrift 的核心概念(翻译)

    Thrift 网络栈 Apache Thrift 网络栈的简单表示 传输层 Transport 传输层为从网络读取...

  • 网络的传输方式

    1. 广播式网络(broadcast networks) 特点:所有计算机共享一条通信信道,任何一台计算机发出的信...

  • 网络数据的传输

    关于网络数据的传输大体上可以分为两步: 找到想要给他数据的人 给他可以理解的数据 就像是小刘想要找到女朋友丽丽,跟...

  • tcp 网络基础

    最大传输单元 网络包在网络上传输是对网络包的大小有限制的。其值成为MTU,即最大传输单元,一般而言,网络中的MTU...

网友评论

    本文标题:C#的网络传输

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