好不容易把socket通信搞懂一点,比较喜欢做笔记,嘿嘿~

希望共同学习,共同进步!

socket通信是C#中非常基础的一个知识点,我这里用到的是基于Tcp协议的socket通信。Tcp会有三次握手连接通信.

一、 创建服务端socket的步骤:

1.首先需要引用socket通信中所用到的名称空间;

using System.Net;
using System.Threading;
using System.Net.Sockets;

这三个名称空间是为socket通信打基础,没有这三个名称空间无法实现socket通信.

2.接下来就是要创建一个socket的对象了,创建socket对象是为了方便客户端与服务端之间的通信,如果你还不明白,就请往下继续看;

Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

在这里面有几个知识点我要补充一下:

socket类中的参数我做简要阐述,AddressFamily.InterNetwork简单来说就是使用内网,啥,你不知道内网是什么东东?至于内网是啥,内网就是不能上互联网的局域网;SocketType.Stream是流式的套接字类型,这种套接字类型是一种可靠且双向,基于连接的字节流,不重复数据,简单一点就是支持双向通信;ProtocolType.Tcp指的是使用基于tcp协议的通信协议。

3.绑定IP地址和端口号;

            //将字符串类型的IP地址转换为IPAddress类型
IPAddress ip = IPAddress.Parse("173.168.5.15");
//标识网络地址
EndPoint point = new IPEndPoint(ip,port);
serverSocket.Bind(point);

如果你想实现socket通信就必须绑定IP地址和端口号,IP地址是计算机的通信地址,端口号指向计算机中某个软件或者说是应用程序;

4.监听客户端的连接;

serverSocket.Listen();

参数指的是监听客户端的最大数量。

5.为连接到的客户端新建一个socket;

Socket ListenClientSocket= serverSocket.Accept();

这是规定,如果不新建一个socket无法通信。

这一步完成时客户端给服务端发送消息且客户端会连接到服务端,完成第一次握手。

6.向客户端发送消息;

ListenClientSocket.Send(data);

此时服务端给客户端发送消息完成第二次握手。

7.接受客户端消息;

            byte[] data2 = new byte[];

            int length=ListenClientSocket.Receive(data2);
string message2=Encoding.UTF8.GetString(data2,,length);
Console.WriteLine("接收到客户端传来的消息:"+message2);

服务端接收到客户端的消息完成第三次握手。

服务端socket   完整代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets; namespace serverSocketTest2
{
class Program
{
static int port = ;
static void Main(string[] args)
{
//创建一个socket的对象
Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//将字符串类型的IP地址转换为IPAddress类型
IPAddress ip = IPAddress.Parse("173.168.5.15");
//标识网络地址
EndPoint point = new IPEndPoint(ip,port);
serverSocket.Bind(point);
//开始监听
serverSocket.Listen();
Console.WriteLine("等待客户端连接..."); //为连接客户端需要新建一个线程
Socket ListenClientSocket= serverSocket.Accept();//暂停当前线程,等待客户端连接之后再执行之后的语句
Console.WriteLine("客户端连接成功! 真是令人振奋!");
//传送的消息
string message = "Hello Client!";
//将字符串类型的数据转换为byte类型的数组
byte[] data=Encoding.UTF8.GetBytes(message);
//发送消息
ListenClientSocket.Send(data); /////接受客户端数据
byte[] data2 = new byte[]; int length=ListenClientSocket.Receive(data2);
string message2=Encoding.UTF8.GetString(data2,,length);
Console.WriteLine("接收到客户端传来的消息:"+message2); Console.ReadKey();
}
}
}

二、 创建客户端socket的步骤如下:

1.引用进行socket通信的名称空间;

using System.Net;
using System.Threading;
using System.Net.Sockets;

原因我不再赘述了,相信聪明的你们都懂.

2.客户端向服务端发送连接的请求,建立客户端和服务端的连接;

clientSocket.Connect(ip,port);

这是第一次握手。本次握手与服务端里的第一次握手同步执行,其实这次握手也是服务端里的第一次握手。

3.接收数据;

clientSocket.Receive(data);

在这里需要将客户端接收到的数据返回一个长度并存储到byte数组里。

4.将字节型数据转换成字符串型的数据;

string message=Encoding.UTF8.GetString(data,,length);

5.发送数据

clientSocket.Send(data2);

第二次握手连接。本次握手与服务端里的第二次握手同步执行,其实这次握手也是服务端里的第二次握手。

客户端socket   完整代码如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;
using System.Net.Sockets; namespace clientSocketTest2
{
class Program
{
static int port = ;
static void Main(string[] args)
{
//新建一个socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse("173.168.5.15"); //客户端向服务端发送连接的请求,建立客户端和服务端的连接
clientSocket.Connect(ip,port);
//存储数据,接收数据
byte[] data=new byte[];
int length=clientSocket.Receive(data);
//转换为字符串型的数据
string message=Encoding.UTF8.GetString(data,,length);//0,length 表示的是发送的数据的长度
Console.WriteLine("接收到来自服务端的数据:"+message); /////// 发送数据
string message2 = Console.ReadLine();
byte[] data2=Encoding.UTF8.GetBytes(message2);
clientSocket.Send(data2); Console.ReadKey(); }
}
}

这是我的理解,如果有不足的地方,请指教,共同学习!希望共同进步!

浅谈C#Socket的更多相关文章

  1. 浅谈tcp socket的backlog参数

    最近看netty源码碰到ChannelOption.SO_BACKLOG参数,通过跟踪代码发现其实是用于设置底层tcp socket的backlog参数,由于不了解这个参数,有必要彻底的理解一下. 底 ...

  2. 浅谈android Socket 通信及自建ServerSocket服务端常见问题

    摘  要:TCP/IP通信协议是可靠的面向连接的网络协议,它在通信两端各建立一个Socket,从而在两端形成网络虚拟链路,进而应用程序可通过可以通过虚拟链路进行通信.Java对于基于TCP协议的网络通 ...

  3. [转]浅谈Flash Socket通信安全沙箱

    用过Flash socket的同学都知道,Flash socket通讯有安全沙箱问题.就是在Flash Player发起socket通信时,会向服务端获取安全策略,如果得不到服务端响应,flash将无 ...

  4. 浅谈Socket编程

    浅谈Socket编程 说到Socket,想必大家会觉得陌生又熟悉.许多同学听说过Socket,但仅仅知道它翻译成中文叫做套接字,除此之外似乎并没有太多的了解了.那么今天我就来抛砖引玉地聊一聊Socke ...

  5. 浅谈IM软件怎样建立安全socket连接、登录

    ----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...

  6. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

  7. TODO:浅谈pm2基本工作原理

    TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...

  8. [转]浅谈https\ssl\数字证书

    浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...

  9. Web服务器和动态语言如何交互--CGI&FastCGI&FPM浅谈

    一个用户的Request是如何经过Web服务器(Apache,Nginx,IIS,Light)与后端的动态语言(如PHP等)进行交互并将结果返回给用户的呢? 本文浅谈个人观点,可能有误,欢迎拍砖,共同 ...

随机推荐

  1. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  2. mvc api 返回json

    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); }

  3. 7.Git的版本退回

    现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...

  4. windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点(转)

    windows下使用火狐浏览器插件AutoProxy+MyEnTunnel+SSH访问海外站点   平时需要查阅一些技术资料,光走VPN太浪费流量,所以这儿教大家一种使用火狐浏览器的插件 AutoPr ...

  5. nodejs ejs 请求路径和静态资源文件路径

    /XXX 会跳转到  http://域名:端口/XXX ./XXX  会跳转到 当前路径+/XXX XXX(../XXX) 会跳转到 当前路径父级+XXX

  6. Dynamics AX 2012 的工业物联网解决方案

    Dynamics AX 2012 的工业物联网解决方案 物联网 物联网的概念在这两年非常火,包括近期很火的共享单车初创公司--摩拜单车,在产品中运用了Azure Iot物联网技术.但是,物联网并不是一 ...

  7. [转]SSAS没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)的解决办法

    转自:http://www.cnblogs.com/xvqm00/archive/2011/07/15/2107338.html 打开SSAS 数据源视图浏览数据时,提示 没有注册类别 (异常来自 H ...

  8. maven的使用--初级篇

    一.前言         早就知道maven 在java 项目的管理方面名声显赫,于是就想着学习掌握之,于是查阅了大量文档.发现这些文档的作者都是java 的大腕,大多都是站在掌握了一定maven 基 ...

  9. 什么是Unicode letter

    起因:从一段代码说起 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...

  10. mysql压缩包安装配置

    1.在环境变量中添加:MYSQL_HOME:C:\05_study\mysql-5.7.10-winx64,在path路径中加入:%MYSQL_HOME%\bin.配置环境变量不是必须的,只是为了能更 ...