在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#网络编程 → Socket 服务器和客户端通讯

Socket 服务器和客户端通讯

C#网络编程

下载此实例
  • 开发语言:C#
  • 实例大小:0.08M
  • 下载次数:68
  • 浏览次数:849
  • 发布时间:2019-04-24
  • 实例类别:C#网络编程
  • 发 布 人:269476858
  • 文件格式:.zip
  • 所需积分:1
 相关标签: Socket 通讯 服务器 客户端 服务

实例介绍

【实例简介】

Socket 服务器和客户端通讯

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace SocketClient
{
    class Program
    {
        static void Main(string[] args)
        {
           udp();//可以手动切换tcp/udp代码
            
        }
        /// <summary>
        /// udp不需要建立面向连接的通信(通过广播发送数据)
        /// </summary>
        private static void udp()
        {
            Socket udp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udp.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);//允许 发送广播
            IPEndPoint iepA = new IPEndPoint(IPAddress.Broadcast, 9095);
            //IPEndPoint iepA = new IPEndPoint(IPAddress.Parse("192.168.2.160"), 5566);
            Console.WriteLine("udp已经建立,请输入您要发送的内容");
            while (true)
            {
                string sss = Console.ReadLine();
                int len = udp.SendTo(System.Text.Encoding.Unicode.GetBytes(sss), iepA);

            }
        }
     
        /// <summary>
        /// tcp需要建立面向连接的通讯,并且需要三次握手.也就是说,每次通信后,tcp都需要关闭,下次关闭前重新建立连接。(不能通过广播发送数据)
        /// </summary>
        private static void tcp()
        {
            Socket newclient;
            while (true)
            {

                Console.WriteLine("请输入您要发送的内容");
                string content = Console.ReadLine();
                using (newclient = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp))
                {
                    byte[] data = new byte[1024];
                    IPEndPoint ie = new System.Net.IPEndPoint(IPAddress.Parse("192.168.1.10"), 9050);//服务器的IP和端口

                    try
                    {
                        //因为客户端只是用来向特定的服务器发送信息,所以不需要绑定本机的IP和端口。不需要监听。
                        newclient.Connect(ie);//第一次交互
                        int recv = newclient.Receive(data);//第二次交互
                        //连接服务器成功
                        string stringdata = System.Text.Encoding.Unicode.GetString(data, 0, recv);
                        if (stringdata == "连接服务器成功")
                        {
                            newclient.Send(System.Text.Encoding.Unicode.GetBytes(content));//第三次交互
                            newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send);
                            data = new byte[1024];
                            recv = newclient.Receive(data);
                            string result = System.Text.Encoding.Unicode.GetString(data, 0, recv);
                            newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive);
                            newclient.Close();
                            Console.WriteLine(result);

                        }
                        else
                        {
                            Console.WriteLine("连接服务器失败");
                        }
                    }
                    catch (System.Net.Sockets.SocketException e)
                    {
                        Console.WriteLine(e.ToString());
                        return;
                    }
                }                
            }
        }

        static byte[] GetBytes(string str)
        {
            return System.Text.Encoding.ASCII.GetBytes(str);
        }

        //获取内网IP
        static string GetInternalIP()
        {
            IPHostEntry host;
            string localIP = "?";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    localIP = ip.ToString();
                    break;
                }
            }
            return localIP;
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SocketServer
{
    class Program
    {
        static void Main(string[] args)
        {
            udp();//可以手动切换tcp/udp代码
        }

        private static void udp()
        {
            Socket udp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udp.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);//允许 发送广播
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9095);
            udp.Bind(iep);
            if (udp != null)
            {
                Console.WriteLine("udp已经准备好,端口号链接,准备接受来自网络上的请求\r\n");
            }

            EndPoint ep = (EndPoint)iep;
            byte[] data = new byte[8000];
            while (true)
            {
                if (!udp.Poll(1000, SelectMode.SelectRead))
                {
                    continue;
                }
                int recv = udp.ReceiveFrom(data, ref ep);
                string message = System.Text.Encoding.Unicode.GetString(data, 0, recv);
                string ii = ep.ToString().Trim();
                Console.WriteLine("接收到来自" ii "端口的信息:" message);
                Thread.Sleep(10);
            }
        }


        private static void tcp()
        {
            Socket serverSocket = null;
            Thread clientThread = null;
            Socket clientSocket = null;
            IPAddress ips = null;
            IPEndPoint ipep = null;
            ips = Dns.GetHostAddresses(Dns.GetHostName())[0];
            //创建IPEndPoint实例  
            ipep = new IPEndPoint(IPAddress.Parse(GetInternalIP()), 9050);
            //创建一个套接字  
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            //将所创建的套接字与IPEndPoint绑定  
            serverSocket.Bind(ipep);
            //设置套接字为收听模式  
            serverSocket.Listen(20);
            while (true)
            {
                try
                {
                    //在套接字上接收接入的连接  
                    clientSocket = serverSocket.Accept();//第一次交互//监听是否有来自客户端的connect
                    clientThread = new Thread(new ParameterizedThreadStart(ReceiveData));
                    clientThread.Start(clientSocket);
                }
                catch (Exception)
                {
                    serverSocket.Close();
                    serverSocket = null;
                }
            }
        }

        static void ReceiveData(object obj)
        {
            Socket s = obj as Socket;
            Byte[] buffer = new Byte[1024];
            //根据收听到的客户端套接字向客户端发送信息  
            IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;
            Console.WriteLine("客户端ip:" clientep.Address " 端口:" clientep.Port);
            string welcome = "连接服务器成功";
            buffer = System.Text.Encoding.Unicode.GetBytes(welcome);
            //向客户端发送“连接服务器成功”消息
            s.Send(buffer, buffer.Length, SocketFlags.None);//第二次交互
            buffer = new Byte[1024];
            int bufLen = 0;
            string content = string.Empty;
            while (true)
            {
                //在套接字上接收客户端发送的信息  
                bufLen = 0;
                try
                {
                    bufLen = s.Receive(buffer);//第三次交互
                    if (bufLen == 0)
                    {
                        break;
                    }
                    content = System.Text.Encoding.Unicode.GetString(buffer, 0, bufLen);
                }
                catch (Exception)
                {
                    break; ;
                }
            }             
            
            Console.WriteLine("接收到信息:" content);
            buffer = System.Text.Encoding.Unicode.GetBytes("服务器接收信息成功");
            s.Send(buffer, buffer.Length, SocketFlags.None);

            s = null;
            buffer = null;
            clientep = null;
            Thread.CurrentThread.Abort();
        }

        //获取内网IP
        static string GetInternalIP()
        {
            IPHostEntry host;
            string localIP = "?";
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily.ToString() == "InterNetwork")
                {
                    localIP = ip.ToString();
                    break;
                }
            }
            return localIP;
        }

    }
}

实例下载地址

Socket 服务器和客户端通讯

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警