01/10/2018, 00:17

Ứng dụng chat peer-to-peer

Em chào mọi người!

Em đang tập làm quen với lập trình mạng win form bằng C#. Cụ thể đây là chương trình em học theo trên mạng, viết ứng dụng chat peer-to-peer trong mạng LAN. Em đã chạy được ứng dụng một cách bình thường, nhưng lúc thử test tới vụ gõ tiếng Việt thì nó hoàn toàn không hiển thị đúng tiếng Việt bên người nhận (dù bên gửi hiển thị tiếng Việt bình thường).

Em đã chụp màn hình lại kèm với code bên dưới. Em thử chỗ tô đậm bên dưới bằng Encoding.UTF.GetString(sendingMessage); nhưng vẫn không thể hiển thị đúng tiếng Việt. Mong mọi người xem qua và giúp đỡ! Thanks.

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.Net;
using System.Net.Sockets;

namespace ChatLAN
{
    public partial class frm_ChatLAN : Form
    {
        Socket sck;
        EndPoint epLocal, epRemote;
        byte[] buffer;

        public frm_ChatLAN()
        {
            InitializeComponent();
        }

        private void frm_ChatLAN_Load(object sender, EventArgs e)
        {
            // Set up Socket
            sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

            //Set up IP
            txt_MineIP.Text = GetLocalIP();
            txt_OtherIP.Text = GetLocalIP();
        }

        private void btn_Connect_Click(object sender, EventArgs e)
        {
            //binding Socket
            epLocal = new IPEndPoint(IPAddress.Parse(txt_MineIP.Text), Convert.ToInt32(txt_MinePort.Text));
            sck.Bind(epLocal);
            //Connecting to remote IP
            epRemote = new IPEndPoint(IPAddress.Parse(txt_OtherIP.Text), Convert.ToInt32(txt_OtherPort.Text));
            sck.Connect(epRemote);
            //Listening the specific port
            buffer = new byte[1500];
            sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
        }

        private void MessageCallBack(IAsyncResult aResult)
        {
            try
            {
                byte[] receiveData = new byte[1500];
                receiveData = (byte[])aResult.AsyncState;
                //Converting byte[] to string
                ASCIIEncoding aEncoding = new ASCIIEncoding();
                string receiveMessage = aEncoding.GetString(receiveData);

                //Adding this message into ListBox
                lst_show.Items.Add("Friend: " + receiveMessage);

                buffer = new byte[1500];
                sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

        private void btn_send_Click(object sender, EventArgs e)
        {
            //Convert string message to byte[]
            ASCIIEncoding aEncoding = new ASCIIEncoding();
            byte[] sendingMessage = new byte[1500];
            sendingMessage = aEncoding.GetBytes(txt_typing.Text);
            //Sending the Encoded message
            sck.Send(sendingMessage);
            //Adding to the listbox
           >  lst_show.Items.Add("Me: " + txt_typing.Text);
            txt_typing.Text = "";
        }

        private void txt_typing_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.KeyCode==Keys.Enter)
            {
                btn_send.PerformClick();
            }
        }

        private string GetLocalIP()
        {
            IPHostEntry host;
            host = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in host.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)
                    return ip.ToString();
            }
            return "127.0.0.1";
        }
}
}
Văn Dương viết 02:20 ngày 01/10/2018

Sử dung UTF8 để mã hóa và giải mã byte[]/string. ASCII thì sao mà có Tiếng Việt ?

// Encoding
byte[] buffer  = Encoding.UTF8.GetBytes(string_input);
//Decoding
string str = Encoding.UTF8.GetString(buffer);
Meo Meo viết 02:29 ngày 01/10/2018

Cám ơn bạn!

Hồi tối này vừa post câu hỏi lên, sau đó ngồi đọc kĩ lại thì thấy xàm thật!

Bài liên quan
0