• 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来传输文件。

  • 相关阅读:
    CF 142B Tprimes
    CF 231A Team
    poj 2001 Shortest Prefixes ——字典树入门
    hdu 1039 Easier Done Than Said?
    poj 2528 Mayor's posters
    hdu 1061 Rightmost Digit
    poj 2503 Babelfish
    CF271 A. Beautiful Year
    poj 2752
    CF271 B. Prime Matrix
  • 原文地址:https://www.cnblogs.com/_fyz/p/2037794.html
Copyright © 2020-2023  润新知