[C#] 通过C#Socket通信对象

Hôm trước mình đã hướng dẫn các bạn làm ví dụ đơn giản truyền nhận quan socket trong c#, hôm nay tiếp tục hướng dẫn các bạn truyền đối tượng qua socket 😉

Bài này hướng dẫn các bạn viết chuơng trình truyền nhận đối tượng giữa client và server. Client là 1 From thông tin của 1 cuốn sách (Book) gồm tiêu đề, tác giả, năm xuất bản và thể loại. Client có 2 nút là gửi (sẽ gửi thông tin đến server) 和接收 (从服务器接收信息). 当客户机向服务器发送按钮将接收信息并写入到文件服务器上. 当客户端收到服务器按钮从文件读取信息并发送至客户端, 客户端会显示收到了从信息. 如下图.

插座仲C#

现在的我们将建立 2 项目BookClient和BookServer结构是这样:

通过在C#插座电视观众它类似于前一天, 我们唯一需要发扬字节数组的对象,然后发送给接收. 在接收到对象的需要从字节数组恢复功能对象.

火腿招 1 字节数组,并且反之亦然的对象.

// nen data thanh 1 mang byte
public byte[] SerializeData(Object o)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf1 = new BinaryFormatter();
    bf1.Serialize(ms, o);
    return ms.ToArray();
}

// giai nen 1 mang byte thanh 1 doi tuong (bject)
public object DeserializeData(byte[] theByteArray)
{
    MemoryStream ms = new MemoryStream(theByteArray);
    BinaryFormatter bf1 = new BinaryFormatter();
    ms.Position = 0;
    return bf1.Deserialize(ms);
}

但是请注意,您可以执行压缩对象序列化应该有一个关键字的对象类 [连载] 课前. 具体为以下类图书 (在客户端项目Book类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BookClient
{
    [Serializable]
    class Book
    {
        public String title, author, yearOfPublication, genre;
    }
}

随后的代码从客户端 (界面设计你NHE)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;

namespace BookClient
{
    public partial class Form1 : Form
    {
        Socket client;
        private const int BUFFER_SIZE = 1024;
        private const int PORT_NUMBER = 7826;
        static ASCIIEncoding encoding = new ASCIIEncoding();
        public Form1()
        {
            InitializeComponent();
            connectServer();
        }


        // ket noi den server
        private void connectServer()
        {
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), PORT_NUMBER);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            client.Connect(iep);
        }


// nen data thanh 1 mang byte
public byte[] SerializeData(Object o)
{
    MemoryStream ms = new MemoryStream();
    BinaryFormatter bf1 = new BinaryFormatter();
    bf1.Serialize(ms, o);
    return ms.ToArray();
}

// giai nen 1 mang byte thanh 1 doi tuong (bject)
public object DeserializeData(byte[] theByteArray)
{
    MemoryStream ms = new MemoryStream(theByteArray);
    BinaryFormatter bf1 = new BinaryFormatter();
    ms.Position = 0;
    return bf1.Deserialize(ms);
}

        // gui du lieu cho server
        private void btnSend_Click(object sender, EventArgs e)
        {
            // tao va lay du lieu tu form
            Book b = new Book();
            b.title = tbTitle.Text;
            b.author = tbAuthor.Text;
            b.yearOfPublication = tbYear.Text;
            b.genre = tbGenre.Text;

            // gui lenh yeu cau la client muon gui du lieu
            client.Send(encoding.GetBytes("send"));

            // gui du lieu
            client.Send(SerializeData(b));
        }

        private void btnReceive_Click(object sender, EventArgs e)
        {
            // gui lenh yeu cau lay du lieu tu server
            client.Send(encoding.GetBytes("receive"));
            byte[] data = new byte[BUFFER_SIZE];

            // nhan du lieu tu server gui xuong
            int rec = client.Receive(data);

            // hien thi thong tin nhan duoc len form
            Book b = (Book)DeserializeData(data);
            tbTitle.Text = b.title;
            tbAuthor.Text = b.author;
            tbYear.Text = b.yearOfPublication;
            tbGenre.Text = b.genre;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

服务器代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
using System.Runtime.Serialization.Formatters.Binary;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Net;
using System.Text;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;
namespace BookServer
{
    class Program
    {
        private const int BUFFER_SIZE = 1024;
        private const int PORT_NUMBER = 7826;

        static ASCIIEncoding encoding = new ASCIIEncoding();
        Socket server;

        // ghi data xuong file
        protected bool SaveData(byte[] Data)
        {
            BinaryWriter Writer = null;
            string Name = "book";

            try
            {
                Writer = new BinaryWriter(File.OpenWrite(Name));          
                Writer.Write(Data);
                Writer.Flush();
                Writer.Close();
            }
            catch
            {
                return false;
            }

            return true;
        }

        private void initServer()
        {
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), PORT_NUMBER);
            // tao server
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Console.WriteLine("dang cho client ket noi...");
            
            // lang nghe ket noi
            server.Bind(iep);
            server.Listen(10);

            // chap nhan client ket noi
            Socket client = server.Accept();
            Console.WriteLine("Chap nhan ket noi tu: " + client.RemoteEndPoint.ToString());
            byte[] data = new byte[BUFFER_SIZE];

            // vong lap vo han thuc hien viec nhan va gui du lieu
            while (true)
            {
                // nhan lenh: gui hoac nhan du lieu
                int rec = client.Receive(data);
                String command = encoding.GetString(data, 0, rec);
                Console.WriteLine("command = " + command);
                
                // client send data den server
                if (command.Equals("send"))
                {
                    client.Receive(data);
                    Console.WriteLine("Nhan thanh cong");
                    if (SaveData(data))
                    {
                        Console.WriteLine("Ghi thanh cong");
                    }
                    else
                    {
                        Console.WriteLine("Ghi that bai");
                    }
                }
                // client muon lay data tu server
                else
                {
                    Console.WriteLine("Dang gui...");
                    // doc du lieu tu file
                    byte[] arraydata = File.ReadAllBytes("book");
                    // gui du lieu doc duoc cho client
                    client.Send(arraydata);
                }
            }
        }

        static void Main(string[] args)
        {
            new Program().initServer();

        }
    }
}

您可以下载 2 客户端和服务器在这个项目.