这一次的博客更新,主要内容是自己之前很小伙伴一起写的一个仿QQ的程序。主要的知识就是 网络编程(仅支持局域网的通信 、简单的C/S架构 、数据库(怎么使用数据库,因为我不是这个数据库的设计者) 以及 桌面开发的基础知识 。
网络通信简介
Socket还被称作“套接字”,应用程序通常通过套接字向网络发送请求或者应答网络请求。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
从这幅经典的图中,我们也可以基本了解网络应用程序的工作模式:
接下来我们就根据上图的流程开始上代码:
**二、建立客户端和服务器端**
1、查看本机ip地址
Win+R:
输入:cmd
输入:ipconfig
得到ipv4的地址,鼠标右键复制。
2、新建两个桌面应用程序
3、运行代码代码:
//添加新的命名空间
using System.Net.Sockets;
using System.Net;
using System.Threading;
//客户端程序
namespace Cli
{
class Program
{
//新建一个客户端嵌套字
static Socket client;
//键入数据像服务器端发送
static string sendStr;
static void Main(string[] args)
{
//新建一个客户端嵌套字
client = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//IP地址提供服务器端的地址
IPAddress ipAddress = IPAddress.Parse(<span style="color:red">服务器端的IP地址</span>);
//网络终端节点,端口可以任意,但是要大于1024
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress,5300);
//用嵌套字去尝试连接服务
client.Connect(ipEndPoint);
Console.WriteLine("请输入您将向服务器端发送的消息:");
//键入将要发送的信息
sendStr = Console.ReadLine();
//设置一个大小为5M的字节数组用来存放带发送的数据
byte[] sendMsg = new byte[1024 * 1024 * 5];
//可以实现多次发送信息
while (sendStr != "EXIT")
{
//将要发送的字符转化为字节流
sendMsg = Encoding.UTF8.GetBytes(sendStr);
//用Send方法直接发送
client.Send(sendMsg);
//重新开一个线程来持续接收从服务器端的数据
Thread receThread = new Thread(ReceMsg);
//设置该线程会后台线程
receThread.IsBackground = true;
//线程启动
receThread.Start();
Console.WriteLine("请输入您将向服务器端发送的消息:");
//键入将要发送的信息
sendStr = Console.ReadLine();
}
Console.ReadLine();
}
//嵌套字接收消息
static void ReceMsg()
{
string receStr;
byte[] receMsg = new byte[5 * 1024 * 1024];
int length;
while (true)
{
length = client.Receive(receMsg);
//将接收到的流转化为字符串
receStr = Encoding.UTF8.GetString(receMsg);
}
}
}
}
using System.Threading;//线程命名空间
using System.Net.Sockets;//嵌套字命名空间
using System.Net;
//服务器端
namespace Ser
{
class Program
{
static Socket server;
static void Main(string[] args)
{
//新建一个网络套接字
//第一个参数代表使用IPv4网络地址
//第二个参数代表网络数据传输时使用流形式
//第三个参数代表使用的网络协议是TCP协议
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//监听任意客户端
IPAddress ipaddress = IPAddress.Any;
//网络节点
IPEndPoint ipendpoind = new IPEndPoint(ipaddress, 5300);
//绑定该端口
server.Bind(ipendpoind);
//开始监听——最大监听队列
server.Listen(36);
Console.WriteLine("开始监听");
//重新开一个线程监听客户端嵌套字
Thread receThread = new Thread(ListenSocket);
//设置该线程会后台线程
receThread.IsBackground = true;
//线程启动
receThread.Start();
Console.ReadLine();
}
//监听客户端嵌套字
static void ListenSocket()
{
while (true)
{
Socket client = server.Accept();
Console.WriteLine("客户端:" + client.RemoteEndPoint.ToString() + "连接成功!");
//重新开一个线程来持续接收从服务器端的数据
Thread receThread = new Thread(ReceMsg);
//设置该线程会后台线程
receThread.IsBackground = true;
//线程启动
receThread.Start(client);
}
}
//嵌套字接收消息
static void ReceMsg(object obj)
{
string receStr;
byte[] receMsg = new byte[5 * 1024 * 1024];
int length;
while (true)
{
//强制转换
Socket client = obj as Socket;
length = client.Receive(receMsg);
//将接收到的流转化为字符串
receStr = Encoding.UTF8.GetString(receMsg,0,length);
Console.WriteLine("客户端:"+client.RemoteEndPoint.ToString()+"发来消息:"+receStr);
}
}
}
}
4、运行结果: