[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) 和接收 (从服务器接收信息). 当客户机向服务器发送按钮将接收信息并写入到文件服务器上. 当客户端收到服务器按钮从文件读取信息并发送至客户端, 客户端会显示收到了从信息. 如下图.

现在的我们将建立 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();
}
}
}



Ë问: Ë有 1 从客户账户类,如下所示:
class Account{
private string username = "";
private string password = "";
public Account(string username, string password)
{
this.username = username;
this.password = password;
}
public string Username{
get
{
return username;
}
}
public string Password
{
get
{
return password;
}
}
}
因此,服务器如何能为您的用户名和密码的工作被送到 1 帐户对象,因此爵士
在他的文章中指出,然后, 你需要使用压缩对象序列化.
Ë具有r个, 客户端已成功发送, 但接收到该错误消息繁茂SV LUM时. 这是电子SV:
IPAddress address = IPAddress.Parse("127.0.0.1");TcpListener listener = new TcpListener(address, PORT_NUMBER);
listener.Start();
Console.WriteLine("Server started on " + listener.LocalEndpoint);
Console.WriteLine("Waiting for a connection...");
Socket socket = listener.AcceptSocket();
Console.WriteLine("Connection received from " + socket.RemoteEndPoint);
byte[] data = new byte[BUFFER_SIZE];
socket.Receive(data);
VO acc = new VO();
acc = BUS.DeserializeData(data);
Console.WriteLine(acc.username + ":" + acc.password);
VO级同等级的账户, 其他人只是停止先生名字
当他们失败了, 你运行你的代码视图, cái của bạn thấy cũng ko sao mà
亲爱的朋友们, làm bài viết hướng dẫn về lập trình mạng đi 😀
谢谢, nhưng mình không theo c# nữa nên rất tiếc ko giúp bạn đk.