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);

    }

    }

    }

    }

    结果:

    表:

  • 相关阅读:
    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序
    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1
    050 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 12 continue语句
    049 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 11 break语句
    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
    047 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 09 嵌套while循环应用
    046 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 08 for循环的注意事项
    045 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 07 for循环应用及局部变量作用范围
    剑指OFFER----面试题04.二维数组中的查找
    剑指OFFER----面试题03. 数组中重复的数字
  • 原文地址:https://www.cnblogs.com/shuanglu/p/8481236.html
Copyright © 2011-2022 走看看