前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#中Socket的简单使用

C#中Socket的简单使用

作者头像
全栈程序员站长
发布2022-09-07 11:26:42
9130
发布2022-09-07 11:26:42
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

以前学过的Socket,后来没怎么用过,就基本忘了,所以闲来时重新回顾学习一番.

一.Socket的概念 Socket其实并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口.

当两台主机通信是,必须通过Socket连接,Socket则利用TCP/IP协议建立TCP连接.TCP连接则更依赖于底层的IP协议.Socket是控制层传输协议.

双向的通信连接实现数据的交换,连接的一端成为一个Socket.

<span role="heading" aria-level="2">C#中Socket的简单使用
<span role="heading" aria-level="2">C#中Socket的简单使用

二.网络通信三要素 IP地址(网络上主机设备的唯一标识) 端口号(定位程序) 有效端口:0~65535,其中0~1024由系统使用,开发中一般使用1024以上端口. 传输协议(用什么样的方式进行交互) 常见协议:TCP(面向连接,提供可靠的服务),UDP(无连接,传输速度快) 三.Socket的通信流程

<span role="heading" aria-level="2">C#中Socket的简单使用
<span role="heading" aria-level="2">C#中Socket的简单使用

四.C#中Socket的简单使用步骤 第一步:服务端监听某个端口

第二步:客户端向服务端地址和端口发起Socket请求

第三步:服务器接收连接请求后创建Socket连接,并维护这个连接队列

第四步:客户端和服务端就建立起了双工同信,客户端与服务端就可以实现彼此发送消息

五.简单代码实例

1.服务端代码

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

namespace SocketUtil { public class SocketServer { private string _ip = string.Empty; private int _port = 0; private Socket _socket = null; private byte[] buffer = new byte[1024 * 1024 * 2]; /// <summary> /// 构造函数 /// </summary> /// <param name=”ip”>监听的IP</param> /// <param name=”port”>监听的端口</param> public SocketServer(string ip, int port) { this._ip = ip; this._port = port; } public SocketServer(int port) { this._ip = “0.0.0.0”; this._port = port; }

public void StartListen() { try { //1.0 实例化套接字(IP4寻找协议,流式协议,TCP协议) _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2.0 创建IP对象 IPAddress address = IPAddress.Parse(_ip); //3.0 创建网络端口,包括ip和端口 IPEndPoint endPoint = new IPEndPoint(address, _port); //4.0 绑定套接字 _socket.Bind(endPoint); //5.0 设置最大连接数 _socket.Listen(int.MaxValue); Console.WriteLine(“监听{0}消息成功”, _socket.LocalEndPoint.ToString()); //6.0 开始监听 Thread thread = new Thread(ListenClientConnect); thread.Start();

} catch (Exception ex) { } } /// <summary> /// 监听客户端连接 /// </summary> private void ListenClientConnect() { try { while (true) { //Socket创建的新连接 Socket clientSocket = _socket.Accept(); clientSocket.Send(Encoding.UTF8.GetBytes(“服务端发送消息:”)); Thread thread = new Thread(ReceiveMessage); thread.Start(clientSocket); } } catch (Exception) { } }

/// <summary> /// 接收客户端消息 /// </summary> /// <param name=”socket”>来自客户端的socket</param> private void ReceiveMessage(object socket) { Socket clientSocket = (Socket)socket; while (true) { try { //获取从客户端发来的数据 int length = clientSocket.Receive(buffer); Console.WriteLine(“接收客户端{0},消息{1}”, clientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(buffer, 0, length)); } catch (Exception ex) { Console.WriteLine(ex.Message); clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); break; } } } } }

2.客户端代码

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 SocketUtil { public class SocketClient { private string _ip = string.Empty; private int _port = 0; private Socket _socket = null; private byte[] buffer = new byte[1024 * 1024 * 2];

/// <summary> /// 构造函数 /// </summary> /// <param name=”ip”>连接服务器的IP</param> /// <param name=”port”>连接服务器的端口</param> public SocketClient(string ip, int port) { this._ip = ip; this._port = port; } public SocketClient(int port) { this._ip = “127.0.0.1”; this._port = port; }

/// <summary> /// 开启服务,连接服务端 /// </summary> public void StartClient() { try { //1.0 实例化套接字(IP4寻址地址,流式传输,TCP协议) _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2.0 创建IP对象 IPAddress address = IPAddress.Parse(_ip); //3.0 创建网络端口包括ip和端口 IPEndPoint endPoint = new IPEndPoint(address, _port); //4.0 建立连接 _socket.Connect(endPoint); Console.WriteLine(“连接服务器成功”); //5.0 接收数据 int length = _socket.Receive(buffer); Console.WriteLine(“接收服务器{0},消息:{1}”, _socket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(buffer,0,length)); //6.0 像服务器发送消息 for (int i = 0; i < 10; i++) { Thread.Sleep(2000); string sendMessage = string.Format(“客户端发送的消息,当前时间{0}”, DateTime.Now.ToString()); _socket.Send(Encoding.UTF8.GetBytes(sendMessage)); Console.WriteLine(“像服务发送的消息:{0}”, sendMessage); } } catch (Exception ex) { _socket.Shutdown(SocketShutdown.Both); _socket.Close(); Console.WriteLine(ex.Message); } Console.WriteLine(“发送消息结束”); Console.ReadKey(); } } }

3.分别开启客户端和服务端

using SocketUtil; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace SocketClientApp { class Program { static void Main(string[] args) { SocketClient client = new SocketClient(8888); client.StartClient(); Console.ReadKey(); } } }

using SocketUtil; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace SocketServerApp { class Program { static void Main(string[] args) { SocketServer server = new SocketServer(8888); server.StartListen(); Console.ReadKey(); } } }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154405.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 五.简单代码实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档