zoukankan      html  css  js  c++  java
  • 记C#一次服务器搭建和数据库应用

    服务器端

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Net.Sockets;

    using System.Text;

    using System.Threading.Tasks;

    namespace Servece

    {

    class Program

    {

    static void Main(string[] args)

    {

    //搭建

    Socket serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

    IPAddress ip = IPAddress.Parse("192.168.1.14");

    IPEndPoint ipPoint = new IPEndPoint(ip, 1234);

    serverSocket.Bind(ipPoint);//建立连接

    serverSocket.Listen(0);//监听

    //Socket clientSocket = serverSocket.Accept(); 只能接收一个客户端

    serverSocket.BeginAccept(AcceptCall, serverSocket);

    Console.ReadKey();//很重要,不然会报错。作用:等待键盘输入,退出程序,使调试时能看到输出结果。如果没有此句,命令窗口会一闪而过。

    }

    static void AcceptCall(IAsyncResult ar) {

    Socket severSocket = ar.AsyncState as Socket;

    //给客户端发送信息

    Socket clientSocket =severSocket.EndAccept(ar);

    string msg = "你已连上服务器";

    byte[] data = Encoding.UTF8.GetBytes(msg);

    clientSocket.Send(data);

    //接收客户端发来的信息

    dataBuffer = new byte[1024];

    clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReciveClient, clientSocket);

    severSocket.BeginAccept(AcceptCall, severSocket);

    }

    static byte[] dataBuffer=new byte[1024];

    static void ReciveClient(IAsyncResult ar)

    {

    Socket clientSocket = null;

    //用try来处理客户端突然关闭的情况

    try

    {

    clientSocket = ar.AsyncState as Socket;

    int count = clientSocket.EndReceive(ar);

    //当没有传过来信息的时候,关闭客户端

    if (count == 0) {

    clientSocket.Close();

    return;

    }

    string msg = Encoding.UTF8.GetString(dataBuffer, 0, count);

    Console.WriteLine("从客户端接收到消息:" + msg);

    clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReciveClient, clientSocket);

    }

    catch (Exception e)

    {

    clientSocket.Close();

    Console.WriteLine(e);

    }

    }

    }

    }

    客户端

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Net.Sockets;

    using System.Text;

    using System.Threading.Tasks;

    namespace ClientSocket

    {

    class Program

    {

    static void Main(string[] args)

    {

    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    //与服务器建立连接

    client.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.14"), 1234));

    //接收服务器发送的消息

    byte[] data = new byte[1024];

    int count = client.Receive(data);

    string msg = Encoding.UTF8.GetString(data, 0, count);

    Console.WriteLine(msg);

    while (true)

    {

    string s = Console.ReadLine();

    if (s == "q") {//按回车不发送

    client.Close();

    return;

    }

    client.Send(Encoding.UTF8.GetBytes(s));//给服务器发送

    Console.ReadKey();

    }

    }

    }

    }

    Console.ReadKey()//暂停

    运行多个客户端

    粘包解决:

    服务器端:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Net.Sockets;

    using System.Text;

    using System.Threading.Tasks;

    namespace Servece

    {

    class Program

    {

    static void Main(string[] args)

    {

    //搭建服务器

    Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    IPAddress ip = IPAddress.Parse("192.168.1.14");

    IPEndPoint ipPoint = new IPEndPoint(ip, 1234);

    serverSocket.Bind(ipPoint);//建立连接

    serverSocket.Listen(0);//监听

    //Socket clientSocket = serverSocket.Accept(); 只能接收一个客户端

    serverSocket.BeginAccept(AcceptCall, serverSocket);

    Console.ReadKey();//很重要,不然会报错。作用:等待键盘输入,退出程序,使调试时能看到输出结果。如果没有此句,命令窗口会一闪而过。

    }

    static Message ms = new Message();

    static void AcceptCall(IAsyncResult ar)

    {

    Socket severSocket = ar.AsyncState as Socket;

    //给客户端发送信息

    Socket clientSocket = severSocket.EndAccept(ar);

    string msgStr = "你已连上服务器";

    byte[] data = Encoding.UTF8.GetBytes(msgStr);

    clientSocket.Send(data);

    //异步接收客户端发来的信息

    dataBuffer = new byte[1024];

    clientSocket.BeginReceive(ms.Data, ms.StartIndex, ms.RemainSize, SocketFlags.None, ReciveClient, clientSocket);

    severSocket.BeginAccept(AcceptCall, severSocket);

    }

    static byte[] dataBuffer;

    static void ReciveClient(IAsyncResult ar)

    {

    Socket clientSocket = null;

    //用try来处理客户端突然关闭的情况

    try

    {

    clientSocket = ar.AsyncState as Socket;

    int count = clientSocket.EndReceive(ar);

    //当没有传过来信息的时候,关闭客户端

    if (count == 0)

    {

    clientSocket.Close();

    return;

    }

    ms.AddCount(count);

    ms.ReadMessage();

    clientSocket.BeginReceive(ms.Data, ms.StartIndex, ms.RemainSize, SocketFlags.None, ReciveClient, clientSocket);

    }

    catch (Exception e)

    {

    clientSocket.Close();

    Console.WriteLine(e);

    }

    }

    }

    }

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace Servece

    {

    class Message

    {

    private byte[] data = new byte[1024];

    private int startIndex;//数组 总长度

    public byte[] Data

    {

    get

    {

    return data;

    }

    set

    {

    data = value;

    }

    }

    public int RemainSize {

    get { return data.Length - StartIndex; }

    }//余空间

    public int StartIndex

    {

    get

    {

    return startIndex;

    }

    set

    {

    startIndex = value;

    }

    }

    public void AddCount(int count) {

    StartIndex += count;

    }

    public void ReadMessage() {

    while (true) {

    if (StartIndex <= 4) return;

    int count = BitConverter.ToInt32(data, 0);//读四位

    if (StartIndex - 4 >= count)

    {

    string s = Encoding.UTF8.GetString(data, 4, count);

    Console.WriteLine("result is:" + s);

    Array.Copy(data, count + 4, data, 0, StartIndex - 4 - count);

    StartIndex -= (count + 4);

    }

    else{

    break;

    }

    }

    }

    }

    }

    客户端

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Net;

    using System.Net.Sockets;

    using System.Text;

    using System.Threading.Tasks;

    namespace ClientSocket

    {

    class Program

    {

    static void Main(string[] args)

    {

    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    client.Connect(new IPEndPoint(IPAddress.Parse("192.168.1.14"), 1234));

    byte[] data = new byte[1024];

    int count = client.Receive(data);

    string msg = Encoding.UTF8.GetString(data, 0, count);

    Console.WriteLine(msg);

    //while (true)

    //{

    // string s = Console.ReadLine();

    // if (s == "q") {//按回车不发送

    // client.Close();

    // return;

    // }

    // client.Send(Encoding.UTF8.GetBytes(s));

    // Console.ReadKey();

    //}

    for (int i = 0; i < 100; i++)

    {

    //client.Send(Encoding.UTF8.GetBytes(i.ToString()));

    client.Send(Message.GetByte(i.ToString()));

    }

    }

    }

    }

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    namespace ClientSocket

    {

    class Message

    {

    //粘包的解决办法:将客户端发送给服务器的信息前四位设置成信息的长度,后面是内容。

    public static byte[] GetByte(string data) {

    //1.接收要发送给服务器的内容,将其转换成字节数组。

    //2.记录消息的长度将长度(int)转换成字节数组类型。

    //3.新的字节数组将两个数组结合起来。

    byte[] dataByte = Encoding.UTF8.GetBytes(data);

    int dataLength = dataByte.Length;

    byte[] lengthBytes = BitConverter.GetBytes(dataLength);

    byte[] newByte = lengthBytes.Concat(dataByte).ToArray();

    return newByte;

    }

    }

    }

    丢包了。

    重新运行没丢。

    解决粘包

    数据库

    引入dll文件

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using MySql.Data.MySqlClient;

    namespace Test4

    {

    class Program

    {

    static void Main(string[] args)

    {

    //本地ip localhost 127.0.0.1

    //使用MySqlConnection连接数据库,需要指定 数据库名称 ip 端口 用户名 密码

    string connStr="Database=test1;Data Source=127.0.0.1;port=3306;User Id=root;Password=user";

    MySqlConnection conn = new MySqlConnection(connStr);//创建连接通道

    conn.Open();//打开连接

    // Insert(conn);

    // Delete(conn);

    Update(conn);

    Find(conn);

    conn.Close();

    }

    static void Find(MySqlConnection conn)

    {

    MySqlCommand cmd = new MySqlCommand("select * from user", conn);//使用Mysql命令查询id

    MySqlDataReader reader = cmd.ExecuteReader();//执行查询

    while (reader.Read())//判断是否读到了数据

    {

    //读取一行记录

    string username = reader.GetString("username");

    string password = reader.GetString("password");

    Console.WriteLine(username + "+" + password);

    }

    reader.Close();

    }//查询

    static void Insert(MySqlConnection conn)//插入

    {

    string username = "zhangsan";

    string password = "123';delete from user;";

    //SQl注入

    //MySqlCommand cnd = new MySqlCommand("insert into user set username='"+username+"',password='"+password+"'",conn);

    MySqlCommand cnd = new MySqlCommand("insert into user set username=@un,password=@pwd",conn);

    cnd.Parameters.AddWithValue("un",username);

    cnd.Parameters.AddWithValue("pwd", password);

    cnd.ExecuteNonQuery();//执行和查询无关的语句

    }

    static void Delete(MySqlConnection conn)//删除

    {

    MySqlCommand cmd = new MySqlCommand("delete from user where id=@id", conn);

    cmd.Parameters.AddWithValue("id", 3);

    cmd.ExecuteNonQuery();

    }

    static void Update(MySqlConnection conn)//更新

    {

    MySqlCommand cmd = new MySqlCommand("update user set password=@pwd where id=4", conn);

    cmd.Parameters.AddWithValue("pwd", "qwer");

    cmd.ExecuteNonQuery();

    }

    }

    }

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using MySql.Data.MySqlClient;//引入命名空间

    namespace Database

    {

    class Program

    {

    static void Main(string[] args)

    {

    string constr = "Database=test;Data Source=127.0.0.1;port=3306;User Id=root;Password=root";

    MySqlConnection conn = new MySqlConnection(constr);

    conn.Open();

    MySqlCommand cmd = new MySqlCommand("select * from user", conn);

    MySqlDataReader reader=cmd.ExecuteReader();

    //reader.HasRows 只执行了一次结果是满足条件的第一条记录

    if (reader.Read()) {

    //reader.Read();遍历出所有的结果

    string user = reader.GetString("username");

    string pass = reader.GetString("userpass");

    Console.WriteLine(user+" "+pass);

    }

    }

    }

    }

    结果:

    表:

  • 相关阅读:
    Echarts 源码解读 一:zrender源码分析1var zr = zrender.init(document.getElementById(‘main‘));
    Vue3 script setup 语法糖详解
    TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)
    vuerouter路由懒加载
    ECharts 源码解读 二
    前端必备10种设计模式
    VUE路由懒加载的3种方式
    RewriterConfig 配置
    JQ弹出层插件(tipsWindow 2.8)
    一个jQuery弹出层(tipsWindown)
  • 原文地址:https://www.cnblogs.com/shuanglu/p/8481236.html
Copyright © 2011-2022 走看看