zoukankan      html  css  js  c++  java
  • C# socket编程第二篇

         既然有了方向,确定了方案就要一步一步的执行方案。socket+udp通信要考虑的问题很多,比如大文件传输的时候如何分包,如何校验,如何判断是否丢包,丢包后从发,如何保证文件的完整性等等一系列问题。

          在考虑这些问题的最开始,我们要解决的实现SOCKET通信,如果通信都不能实现,又谈何程序的完整性。这贴一个socket+Udp的demo。新建两个控制台应用程序,一个是服务端,一个是客户端。模拟客服端和服务端通信

    服务端
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;

    namespace Bose.XueLeCN.COM.FileReceiveControl
    {
    class Program
    {
    static void Main(string[] args)
    {
    int recv;
    byte[] data = new byte[1024];

    //构建TCP 服务器

    //得到本机IP,设置TCP端口号
    IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001);
    Socket newsock
    = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    //绑定网络地址
    newsock.Bind(ipep);

    Console.WriteLine(
    "This is a Server, host name is {0}", Dns.GetHostName());

    //等待客户机连接
    Console.WriteLine("Waiting for a client");

    //得到客户机IP
    IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
    EndPoint Remote
    = (EndPoint)(sender);
    recv
    = newsock.ReceiveFrom(data, ref Remote);
    Console.WriteLine(
    "Message received from {0}: ", Remote.ToString());
    Console.WriteLine(Encoding.ASCII.GetString(data,
    0, recv));

    //客户机连接成功后,发送欢迎信息
    string welcome = "Welcome ! ";

    //字符串与字节数组相互转换
    data = Encoding.ASCII.GetBytes(welcome);

    //发送信息
    newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
    while (true)
    {
    data
    = new byte[1024];
    //发送接受信息
    recv = newsock.ReceiveFrom(data, ref Remote);
    Console.WriteLine(Encoding.ASCII.GetString(data,
    0, recv));
    newsock.SendTo(data, recv, SocketFlags.None, Remote);
    }
    }
    }
    }
    客户端
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;

    namespace FileDistributeControl
    {
    class Program
    {
    static void Main(string[] args)
    {
    byte[] data = new byte[1024];
    string input, stringData;

    //构建TCP 服务器

    Console.WriteLine(
    "This is a Client, host name is {0}", Dns.GetHostName());

    //设置服务IP,设置TCP端口号
    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);

    //定义网络类型,数据连接类型和网络协议UDP
    Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

    string welcome = "Hello! ";
    data
    = Encoding.ASCII.GetBytes(welcome);
    server.SendTo(data, data.Length, SocketFlags.None, ipep);
    IPEndPoint sender
    = new IPEndPoint(IPAddress.Any, 0);
    EndPoint Remote
    = (EndPoint)sender;

    data
    = new byte[1024];
    //对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
    //server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100);
    int recv = server.ReceiveFrom(data, ref Remote);
    Console.WriteLine(
    "Message received from {0}: ", Remote.ToString());
    Console.WriteLine(Encoding.ASCII.GetString(data,
    0, recv));
    while (true)
    {
    input
    = Console.ReadLine();
    if (input == "exit")
    break;
    server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
    data
    = new byte[1024];
    recv
    = server.ReceiveFrom(data, ref Remote);
    stringData
    = Encoding.ASCII.GetString(data, 0, recv);
    Console.WriteLine(stringData);
    }
    Console.WriteLine(
    "Stopping Client.");
    server.Close();
    }
    }
    }
    先运行服务端,再运行客户端,否则会报错。通信实现了,下面我们要做的就是在这基础上完善我们的程序,我们的最终目的是用socket来传输文件。

  • 相关阅读:
    ECharts中悬浮图标tooltie多行显示已解决
    Linux中的$符号的三种常见用法
    Shell逐行读取文件的4种方法
    rename
    nodejs安装
    “ArcGIS Desktop遇到严重的应用程序错误,无法继续”的解决方案
    跟我一起学Redis之Redis持久化必知必会
    微服务很香--麻辣味,但要慢慢消化
    跟我一起学Redis之Redis事务简单了解一下
    跟我一起学.NetCore之EF Core 实战入门,一看就会
  • 原文地址:https://www.cnblogs.com/_fyz/p/2037794.html
Copyright © 2011-2022 走看看