基于C#的同步Socket程序(TCP)

我们来编写一套简单的网络程序,这套网络程序分为客户端和服务端俩部分,客户端发送一行文本给服务器,服务器收到后将文本稍作改动后发回给客户端。

(注意:本程序使用的是TCP协议,并且为同步模式,后续我会再补充异步模式)

1.下图展示了一套基本的Socket通信流程。


2.Socket通信的基本流程具体步骤如下所示:

(1)开启一个连接之前,需要先完成Socket和Bind俩个步骤。Socket是新建一个套接字,Bind指定套接字的IP和端口(客户端在调用Connect时会由系统分配端口,因此可以省去Bind)

(2)服务器通过Listen开启监听,等待客户端接入。

(3)客户端通过Connect连接服务器,服务器通过Accept接收客户端连接。在connect-accept过程中,操作系统将会进行三次握手。

(4)客户端和服务端通过send(),receive()发送和接收数据,操作系统将会完成TCP数据的确认,重发等步骤。

(5)通过close关闭连接,操作系统会进行四次握手。

3.服务端代码如下:

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

namespace SyncTCPServer
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			//socket
			Socket listenfd = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
			//bind
			//本机的ip地址和端口号
			IPAddress ipAdr = IPAddress.Parse ("127.0.0.1");
			IPEndPoint ipEp = new IPEndPoint (ipAdr, 1234);
			listenfd.Bind (ipEp);
			//Listen
			listenfd.Listen(0);
			Console.WriteLine ("[服务器]启动成功");
			while (true) {
				//Accept
				Socket connfd = listenfd.Accept ();
				Console.WriteLine ("[服务器]Accept");
				//Recv
				byte[] readBuff = new byte[1024];
				int count = connfd.Receive (readBuff);
				string str = System.Text.Encoding.UTF8.GetString (readBuff, 0, count);
				Console.WriteLine ("[服务器接收]" + str);
				//Send
				byte[] bytes = System.Text.Encoding.Default.GetBytes ("serv echo:" + str);
				connfd.Send (bytes);
			}
		}
	}
}
4.客户端代码如下:

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

namespace SyncTCPClient
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			//Socket
			Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
			Console.WriteLine (socket.LocalEndPoint);
			//Connect
			//要连接的服务器的ip地址与端口号
			IPAddress ipAdr=IPAddress.Parse("127.0.0.1");
			IPEndPoint ipEp = new IPEndPoint (ipAdr, 1234);
			socket.Connect (ipEp);
			//Send
			string str = "Hello World";
			byte[] bytes = System.Text.Encoding.Default.GetBytes (str);
			socket.Send (bytes);
			//Recv
			byte[] readBuff=new byte[1024];
			int count=socket.Receive(readBuff);
			str = System.Text.Encoding.UTF8.GetString (readBuff,0,count);
			Console.WriteLine (str);
			//Close
			socket.Close();

			Console.Read ();
		}
	}
}
5.运行结果如下:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值