好不容易把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. 浅析MySQL中exists与in的使用

    exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录, ...

  2. 微信接口php

    官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0,包含Token验证及基本消息接口的收发 ...

  3. 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型

    C#反射中的MakeGenericType函数可以用来指定泛型方法和泛型类的具体类型,方法如下面代码所示这里就不多讲了,详情看下面代码一切就清楚了: using System; using Syste ...

  4. Configure Visual Studio 2013 for debugging .NET framework

    https://referencesource.microsoft.com/ In order to configure Visual Studio 2013 do the following in ...

  5. [转] How to debug a ARM Cortex-M hard fault exception

    how to debug a ARM Cortex-M hard fault exception

  6. MySQL字符集转换(latin1到utf8)

    http://blog.chinaunix.net/uid-25266990-id-3344584.html

  7. maven项目和普通项目转换

     

  8. HTML初步入门

    标签元素 标签介绍 html元素包括一个或一对标签定义的包含范围.而标签就是由两个字符串"<"和">"号组成,标签包括开始标签"<& ...

  9. Android setVisibility()

    android view setVisibility(): 有三个参数:Parameters:visibility One of VISIBLE, INVISIBLE, or GONE,想对应的三个常 ...

  10. iis发布后,未能找到编译器可执行文件 csc.exe

    iis 未能找到编译器可执行文件 csc.exe在一台新安装完的Windows Server 2003上,打上Framework 3.5,配置好WebService的IIS,结果浏览时出现:未找到编译 ...