背景
报了轩辕的活动,用TCP请求完成一个类似IIS服务器的东西,当然我没跟上啦,但这个自己接着再搞搞,就打算搞成类似聊天的那种。加油!
目标
- 用Socket完成服务器代码的编写,能够实现接收客户端的请求,并返回"I've received the msg."本节目标
- 用Socket完成客户端代码的编写,能够实现向服务端发送请求。本节目标
- 实现客户端、服务端双向通信
- 实现服务端响应多个客户端
- 将Socket请求可以封装起来,后续就可以减少一些重复代码
- 实现聊天的功能
- 待开发。。。
准备工作
- Windows 10 2016 64位
- VS 2019
- using System.Text; Encoding
- using System.Net; IPAddress
- using System.Net.Sockets; Socket
带System的命名空间一般是vs自带的,只要你安装的时候选了,大多都会自带。
简单介绍
概念
Socket简单理解IP+PORT(IP地址+端口)。
为什么要用Socket
解决HTTP协议单向通讯的问题(你可以回我消息,但不能主动给我发消息)。
Socket协议可实现双向通信,保留通信信道。
代码怎么写
服务端代码
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Server
{
/// <summary>
/// Socket 第一次建立连接(向服务器发起请求)的时候,使用的是http协议
/// 连接成功后,使用socket协议进行交流(双向交流,类似QQ)。
/// </summary>
/// <param name="args"></param>
class Program
{
static void Main(string[] args)
{
try
{
// 1.使用http协议建立连接
// 创建一个套接字 IPV4 数据流 使用tcp协议
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 绑定监听的IP地址与端口
IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8899);
server.Bind(point);
// The maximum length of the pending connections queue.
// 最大连接数 队列
server.Listen(10);
// 输出服务器启动信息
Console.WriteLine("Active Port Service...");
Console.WriteLine("Local Point:{0}:{1}", point.Address, point.Port);
Console.WriteLine("Wait connecting.....");
// 等待客户端的连接
Socket client = server.Accept();
Console.WriteLine("Connecting from {0}" , client.RemoteEndPoint);
// 2.使用死循环用socket协议进行持续通信(write,read;send,receive)
// 接收客户端信息
byte[] rce = new byte[1024];
int ire = client.Receive(rce);
Console.WriteLine("Client Msg:{0}" , Encoding.UTF8.GetString(rce));
// 响应客户端
client.Send(Encoding.UTF8.GetBytes("This is a message from server."));
// 释放资源,结束侦听
client.Close();
server.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message +" \n "+ ex.StackTrace);
}
Console.WriteLine("\n This service has ended.");
Console.ReadLine();
}
}
}
客户端代码
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace Client
{
/// <summary>
/// Socket 第一次建立连接(向服务器发起请求)的时候,使用的是http协议
/// 连接成功后,使用socket协议进行交流(双向交流,类似QQ)。
/// </summary>
/// <param name="args"></param>using System;
class Program
{
static void Main(string[] args)
{
try
{
// 1.使用http协议建立连接
// 创建套接字
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 向服务器发送连接请求
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8899));
if (client.Connected)
Console.WriteLine("Connecting Success, Please enter your message.");
// 2.使用死循环用socket协议进行持续通信(write,read;send,receive)
String s = Console.ReadLine();
// 发送信息给服务器
client.Send(Encoding.UTF8.GetBytes(s));
// 接收服务器返回的信息
byte[] rec = new byte[1024];
int ire = client.Receive(rec);
Console.WriteLine(Encoding.UTF8.GetString(rec));
// 关闭套接字
client.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message + "\n" + ex.StackTrace);
}
Console.WriteLine("\rI'm leaving, bye!");
Console.ReadLine();
}
}
}
展示(一次性的通讯)
如果想要一直通讯,两边需加一个死循环
while(true)
{
//代码块
}