C# Socket学习笔记一

小记:刚接触网络编程觉得网络是个神奇的东西,所以对它就很有兴趣,想了解下网络是如何进行进行数据传输的,那么开始第一天的学习吧!ReadyGo!!!

首先我们要了解一下几点内容:

  • 1、网络中进程之间如何通信?
  • 2、Socket是什么?
  • 3、socket的基本操作
    • 3.1、socket()函数
    • 3.2、bind()函数
    • 3.3、listen()、connect()函数
    • 3.4、accept()函数
    • 3.5、read()、write()函数等
    • 3.6、close()函数
  • 4、socket中TCP的三次握手建立连接详解
  • 5、socket中TCP的四次握手释放连接详解
  • 6、一个例子

现阶段socket通信使用TCP、UDP协议,相对应UDP来说,TCP则是比较安全稳定的协议了。本文只涉及到TCP协议来说socket通信。首先讲述TCP/IP的三次握手,在握手基础上延伸socket通信的基本过程。

下面介绍对于应届生毕业面试来说是非常熟悉的,同时也是最臭名昭著的三次握手:

1 客户端发送syn报文到服务器端,并置发送序号为x。

2 服务器端接收到客户端发送的请求报文,然后向客户端发送syn报文,并且发送确认序号x+1,并置发送序号为y。

3 客户端受到服务器发送确认报文后,发送确认信号y+1,并置发送序号为z。至此客户端和服务器端建立连接。

在此基础上,socket连接过程:

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

客户端请求:客户端clientSocket发送连接请求,目标是服务器的serverSocket。为此,clientSocket必须知道serverSocket的地址和端口号,进行扫描发出连接请求。

连接确认:当服务器socket监听到或者是受到客户端socket的连接请求时,服务器就响应客户端的请求,建议一个新的socket,把服务器socket发送给客户端,一旦客户端确认连接,则连接建立。

注:在连接确认阶段:服务器socket即使在和一个客户端socket建立连接后,还在处于监听状态,仍然可以接收到其他客户端的连接请求,这也是一对多产生的原因。

下图简单说明连接过程:

下面开始进行代码分析了:

服务器端:TcpServer.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net;
 7 using System.Net.Sockets;
 8
 9 namespace TcpServer
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             //确定端口号
16             int port = 6000;
17
18             //设定连接IP
19             string host = "127.0.0.1";
20
21             //将IP地址字符串转化为IP地址实例
22             IPAddress ip = IPAddress.Parse(host);
23
24             //将网络端点表示为 IP 地址和端口号
25             IPEndPoint ipe = new IPEndPoint(ip, port);
26
27             //建立Socket
28             //addressFamily 参数指定 Socket 类使用的寻址方案
29             //socketType 参数指定 Socket 类的类型
30             //protocolType 参数指定 Socket 使用的协议。
31             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
32
33             //socket与本地终结点建立关联
34             socket.Bind(ipe);
35             while (true)
36             {
37                 //开始监听端口
38                 socket.Listen(0);
39
40                 Console.WriteLine("服务已开启,请等待....."+ DateTime.Now.ToString());
41
42                 //为新建的连接建立新的Socket目的为客户端将要建立连接
43                 Socket serverSocket = socket.Accept();
44                 Console.WriteLine("连接已建立......" + DateTime.Now.ToString());
45
46                 string recStr =string.Empty;
47                 //定义缓冲区用于接收客户端的数据
48                 byte[] recbyte = new byte[1024];
49
50                 //返回接收到的字节数
51                 int bytes = serverSocket.Receive(recbyte, recbyte.Length, 0);
52
53                 //将接收到的字节抓获年华为string
54                 //参数一:字节数组 参数二:起始索引 参数三:总长度
55                 recStr += Encoding.ASCII.GetString(recbyte, 0, bytes);
56
57                 Console.WriteLine("服务器接收到客户端的信息:" + recStr + " " + DateTime.Now.ToString()+"\n\n");
58
59
60                 //服务端给客户端回送消息
61                 string strSend = "Hello Client!";
62                 byte[] sendByte = new byte[1024];
63                 //将发送的字符串转换为byte[]
64                 sendByte = Encoding.ASCII.GetBytes(strSend);
65
66                 //服务端发送数据
67                 serverSocket.Send(sendByte, sendByte.Length, 0);
68
69                 serverSocket.Close();
70             }
71         }
72 }

客户端的代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 using System.Net;
 7 using System.Net.Sockets;
 8
 9 namespace TcpClient
10 {
11     class Program
12     {
13         static int port = 6000;                          //监听端口号
14         static string host = "127.0.0.1";                //连接服务端IP
15         static IPAddress ip = IPAddress.Parse(host);     //将IP地址转换为IP实例
16         static IPEndPoint ipe = new IPEndPoint(ip, port);//将网络端点表示为 IP 地址和端口号
17         static Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//建立客户端Socket
18
19         static void Main(string[] args)
20         {
21
22             clientSocket.Connect(ipe);                   //客户端开始连接服务端
23
24
25             string sendStr = "Hello,Server!";            //向服务器发送消息
26             byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
27             clientSocket.Send(sendBytes);
28
29
30             string revStr = "";                          //接收来自服务器的消息
31             byte[] revBytes = new byte[4096];
32             int bytes = clientSocket.Receive(revBytes, revBytes.Length, 0);
33
34             revStr += Encoding.ASCII.GetString(revBytes, 0, bytes);
35             Console.WriteLine("来自服务端的回应:{0}",revStr);
36
37             clientSocket.Close();
38         }
39     }
40 }

下面是运行结果:

我们试一下是否可以对多个客户端进行回应:

测试发现是可以同时回应多个客户端的,一起努力,下节咱们学习异步加载数据!

时间: 2024-10-18 01:51:07

C# Socket学习笔记一的相关文章

C++ Socket 学习笔记

Socket学习笔记 以下均为整理,做参考之用. IP Address IP地址是指互联网协议地址(英语:Internet Protocol Address,又译为网际协议地址),是IP Address的缩写.IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异. IP地址被用来给Internet上的电脑一个编号.大家日常见到的情况是每台联网的PC上都需要有IP地址,才能正常通信.我们可以把"个人电脑"比作"

JAVA Socket学习笔记20140618

2014-06-18  23.59 http://blog.csdn.net/kongxx/article/details/7288896 http://blog.csdn.net/wwww1988600/article/details/8923927 http://blog.csdn.net/xunianchong/article/details/16358077 http://blog.csdn.net/wwww1988600/article/details/8924081 http://w

C# Socket学习笔记二

小记:昨天咱们已经了解了Socket的通信原理,可是点对点的一次通信并不是我们想要的,那么今天那我们就继续学习异步通信,简单来说就是服务器端和客户端可以进行多次 互发信息的通信而不用担心通道会关闭.在介绍异步通信时,客户端和服务器端的连接和上面介绍的同步通信建立连接的方式是一样的,只是接收和发送数据的方式改变了! 1.什么是异步通信? 异步:客户端请求之后,不必等到服务器回应之后就可以发送下一条请求,并行运行. 2.同步与异步的区别? 同步:我叫你吃饭,你若暂时有事情我就一直在那等,不干别的事情

socket学习笔记——实现收发文件(Windows)

记录下来,供自己学习! server.c 1 #define _CRT_SECURE_NO_DEPRECATE 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <WinSock2.h> 6 #define BUF_SIZE 1024 7 char buf[BUF_SIZE], message[BUF_SIZE], file_name[BUF_SIZE];

socket 学习笔记

#include <sys/socket.h> --------------------------------------------------------------------------------- 1. int socket(int domain, int type, int protocol) socket: return fd domain: AF_INET(IPv4), AF_INET6(IPv6) type: SOCK_DGRAM(udp), SOCK_STREAM(tc

Socket学习笔记

80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议.可以通过HTTP地址(即常说的"网址")加":80"来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入":80"了. 查询百度服务器IP地址:在cmd中输入ping www.baidu.com 什么是Buffere

Socket学习笔记(一)

1.socket介绍 我们知道两个进程如果需要进行通讯最基本的一个前提能能够唯一的标示一个进程,在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大,这时候我们需要另辟它径了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样我们可以利用ip地址+协议+端口号唯一标示网络中的一个进程. 能够唯一标示网络中的进程后,它们就可以利用socket进行通信了. 什么是socket呢?我们经常把sock

socket学习笔记——select函数的使用(windows)

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <winsock2.h> 5 6 #define BUF_SIZE 1024 7 void error_handling(char* message); 8 9 int main(int argc, char* argv[]) 10 { 11 WSADATA wsadata; 12 SOCKET hServS

socket学习笔记——select与epoll函数的使用(linux)

select.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <arpa/inet.h> 6 #include <sys/socket.h> 7 #include <sys/time.h> 8 #include <sys/socket.h> 9 10 #defi