demo

  一个连接由它的两个端点标识,这样的端点称为套接

  套接字是支持TCP/IP协议的网络通信的基本操作单元。

  

  可以将套接字看作不同主机间的进程进行双向通信的端点。

  上图连接1的一对套接字为: (192.168.2.23,5000)和(192.168.2.122,8888)

  上图连接2的一对套接字为: (192.168.2.23,5001)和(192.168.2.122,8888)

  对于UDP协议尽管两个进程之间没有建立连接,但是也同样存在发送端点,和接收端点,也同样使用套接字的概念。

  套接字的类型有:

  流式套接字:提供了面向连接的、可靠的、数据无错并且无重复的数据发送服务,而且接收数据的顺序和发送数据的顺序是相同的。

  数据报套接字:提供了面向无连接的服务,它以独立的数据包形式发送数据(数据包长度不能大于32KB),不提供正确性检查,也不保证各数据包的发送顺序和接收顺序相同 ,因

此,可能出现数据的重发、丢失等现象。

  原始套接字:用于直接访问协议的较低层。常用于检验新的协议实现或访问现有服务中配置的新设备,一般不提倡直接使用原始套接字。

  Socket类包含在System.Net.Sockets命名空间中。

  一个Socket实例包含了一个本地或者一个远程端点的套接字信息。 使用Socket类编程,由于很多细节都需要自己考虑,相对来说复杂一些,易出错。

  一般对套接字编程比较熟悉的人,或者使用非标准协议(自定义的新协议)进行编程的时候,才使用Socket类。

  Socket类的构造函数为:

public Socket(    
        AddressFamily addressFamily, //网络类型
        SocketType socketType, //套接字类型
        ProtocolType protocolType); //使用的协议

  参数含义:

  (1)addressFamily addressFamily表示网络类型,该参数使用AddressFamily枚举指定Socket使用的寻址方案 例如AddressFamily.InterNetwork表示IP版本4的地址。

  (2)socketType socketTyp指定Socket的类型,该参数使用SocketType枚举指定使用哪种套接字。

    例如:

    SocketType.Stream表明连接是基于流套接字的

    SocketType.Dgram表示连接是基于数据报套接字

    SocketType.Raw表示连接基于原始套接字;

  (3)protocolType protocolType指定Socket使用的协议,该参数使用ProtocolType枚举指定使用哪种协议。

    例如:

    ProtocolType.Tcp表明连接协议是TCP

    ProtocolType.Udp表明连接协议是UDP

SocketType

ProtocolType

说明

Dgram

Udp

无连接通信

Stream

Tcp

面向连接的通信

Raw

Icmp

Internet控制报文协议

Raw

Raw

简单IP包通信

  IP连接领域有两种通信类型:

    面向连接的(connection-oriented)

    无连接的(connectionless)。

  根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:

    服务器监听 客户端请求 连接确认

    服务器监听:是指服务器套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

    客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器套接字

的地址和端口号,然后再向服务器套接字提出连接请求。

    连接确认:是指当服务器套接字监听到客户端套接字的连接请求时,它就响应客户端套接字的请求,把服务器套接字的信息发给客户端,一旦客户端确认了此信息,连接即

可建立。而服务器套接字继续监听其他客户端套接字的连接请求。

  同步TCP编写服务器端程序的一般步骤为:

    (1) 创建一个包含采用的网络类型、数据传输类型和协议类型的本地套接字对象,并将其与服务器的IP地址和端口号绑定。这个过程可以通过Socket类。

      (2) 在指定的端口进行监听,以便接受客户端连接请求。

    (3) 一旦接受了客户端的连接请求,就根据客户端发送的连接信息创建与该客户端对应的Socket对象。

    (4) 根据创建的Socket对象,分别与每个连接的客户进行数据传输。

      (5) 根据传送信息情况确定是否关闭与对方的连接。

  使用同步TCP编写客户端程序的一般步骤为:

    (1) 创建一个包含传输过程中采用的网络类型、数据传输类型和协议类型的Socket对象。

    (2) 与远程服务器建立连接。

    (3) 与服务器进行数据传输。

    (4) 完成工作后,向服务器发送关闭信息,并关闭与服务器的连接。

  1.(服务器)

      // 1、创建IPEndPoint实例,用于Socket侦听时绑定
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, );
// 2、创建套接字实例
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//3、将所创建的套接字与IPEndPoint绑定
serverSocket.Bind(ipep);
//4、设置套接字为收听模式
serverSocket.Listen(); while (true)
{
try
{
// 5、在套接字上接收接入的连接
clientSocket = serverSocket.Accept();
clientThread = new Thread(new ThreadStart(ReceiveData));
clientThread.Start();
}
catch (Exception ex)
{
MessageBox.Show("listening Error: " + ex.Message);
}
}

  2.(客户端)

 byte[] data = new byte[];

            //1、创建IPEndPoint实例和套接字
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), );
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2、将套接字连接到远程服务器
try
{
clientSocket.Connect(ipep);
}
catch (SocketException ex)
{
MessageBox.Show("connect error: " + ex.Message);
return;
}
//3、接收信息
while (true)
{
//接收服务器信息
int bufLen = ;
try
{
bufLen = clientSocket.Available; clientSocket.Receive(data, , bufLen, SocketFlags.None);
if (bufLen == )
{
continue;
}
}
catch (Exception ex)
{
MessageBox.Show("Receive Error:" + ex.Message);
return;
} string clientcommand = System.Text.Encoding.ASCII.GetString(data).Substring(, bufLen); lstClient.Items.Add(clientcommand); //clientSocket.Shutdown(SocketShutdown.Both);
//clientSocket.Close();
}

  UDP使用无连接的套接字,无连接的套接字不需要在网络设备之间发送连接信息。

  注意: 必须使用Bind方法将套接字绑定到一个本地地址和端口之后才能使用ReceiveFrom方法接收数据,如果只发送而不接收,则不需要使用Bind方法。

八、套接字(Socket)的更多相关文章

  1. Linux进程间通信(八):流套接字 socket()、bind()、listen()、accept()、connect()、read()、write()、close()

    前面说到的进程间的通信,所通信的进程都是在同一台计算机上的,而使用socket进行通信的进程可以是同一台计算机的进程,也是可以是通过网络连接起来的不同计算机上的进程.通常我们使用socket进行网络编 ...

  2. Linux进程间通信(九):数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

    前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套 ...

  3. 套接字socket 的地址族和类型、工作原理、创建过程

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  4. [置顶] Java套接字Socket编程

    1)概念 网络编程基本模型就客户端到服务器的模型,也就是我们常见的C/S模型.简单的说就是两个进程间相互通信的过程.即通信双方一方作为服务器等待客户端提出请求并给以回应,另一方作为客户端向服务器提出请 ...

  5. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

  6. 套接字编程,创建套接字socket

    1.套接字地址结构: struct sockaddr { sa_family_t sa_family; char sa_data[14]; }; 其中,成员sa_family表示套接字的协议族类型,对 ...

  7. 什么是套接字(Socket)

    应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连 ...

  8. Java套接字Socket编程--TCP参数

    在Java的Socket中,主要包含了以下可设置的TCP参数. 属性 说明 默认值 SO_TIMEOUT 对ServerSocket来说表示等待连接的最长空等待时间; 对Socket来说表示读数据最长 ...

  9. pythonl练习笔记——PythonNet 套接字socket

    1 套接字socket 1.1 套接字概述 套接字,一种网络通讯工具:用于进行网络间的通信,是一种特殊文件类型, 套接字,是一个通信链的句柄,用于描述IP地址和端口,实现向网络发出请求或应答网络请求. ...

  10. 面向对象之套接字(socket)和黏包

    一丶套接字(socket) tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 基于UDP协议的socket server端: import socket udp_sk = socke ...

随机推荐

  1. 实现sqrt()函数

    求一个正数N的开方, 并且可以指定精度, 要求不能用库函数sqrt 方法一:如下所示,先求sqrt(N)的整数部分,再求小数点后1位,2位 ... ... 方法二:牛顿迭代法,根据公式 Ai+1 = ...

  2. SharePoint中修改密码的WEB Part之终极版:即可以修改AD,又可以修改本机用户密码的Web Part!!

    转:http://www.cnblogs.com/dosboy/archive/2007/08/01/838859.html 在网上查了那么多SharePoint密码修改的第三方开发,都有问题.总结下 ...

  3. matlab mex入门简介

    mex 的目的 通过C/C++语言编写代码,在Matlab中将其编译成mex文件主要可以做以下几方面的事情: 1.加快程序的执行速度. Matlab在for上如老牛拉车的速度确实让人抓狂. 2.将Ma ...

  4. 《深入Java虚拟机学习笔记》- 第1章 Java体系结构

    一.体系结构组成 当编写并运行一个Java程序时,就同时体验了这四种技术.用Java语言编写源代码,编译成Java Class文件,然后再在Java虚拟机上运行class文件.当编写程序时,通过调用类 ...

  5. HDU 1075-What Are You Talking About(Trie)

    题意: 给你一个字典 一个英文单词对应一个火星单词 给你一段火星文翻译成英文 字典上的没有的不翻译 分析: 没有给数据规模 字典树用链表 #include <map> #include & ...

  6. vs2013 报错AccessViolationException 解决方案

    最近 用vs2013 vs2010开发一个web 项目的时候  报AccessViolationException 异常 ,找不到原因 后边网上看了解决方法,试了一下 解决了,具体什么原因搞不清. 下 ...

  7. Linux与Windows的8个不同

    (整理来自网络) 对刚刚接触Linux的人来说,很容易从windows的观念去理解Linux系统.今天扒一扒Win和Linux之间常见的8个区别. 一.Linux终端输入密码不回显字符 用户的密码在L ...

  8. Leetcode OJ : Triangle 动态规划 python solution

    Total Accepted: 31557 Total Submissions: 116793     Given a triangle, find the minimum path sum from ...

  9. HW6.10

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  10. ABAP报表程序编写规范 .

    一.              程序的结构: 典型的ABAP报表程序是由多个代码区域组成,各代码区的存放位置以下列顺序为准,具体格式如下: *----------------------------- ...