[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.