您的位置:首页 > 理论基础 > 计算机网络

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

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

(注意:本程序使用的是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.运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: