Announcement

Collapse
No announcement yet.

lỗi lập trình Socket

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C#] lỗi lập trình Socket

    minh đang thực hành xây dựng 1 Server và 1 Client trên window form,


    còn Server chỉ có 1 button Start để bắt đầu lắng nghe yêu cầu kết nối của Client, 1 textbox tbReceive để hiển thị dữ liệu nhận từ Client

    mình sử dụng lớp TcpListener để tạo ra Server và lớp TcpClient để tạo Client
    còn đây là lỗi Object reference not set to an instance of an object. ở Client đoạn code mình để highlight. mong các pro giúp đỡ giùm cho. thanks mọi người đã đọc bài.

    code của Server
    Code:
    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;
    using System.Threading;
    using System.IO;
    
    namespace network_form_server
    {
        public partial class frmSERVER : Form
        {
            public frmSERVER()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }
            IPAddress ip;
            IPEndPoint iep;
            TcpListener tcplServer;
            TcpClient client;
            StreamReader sr;
            StreamWriter sw;
    
    
            private void Start_Click(object sender, EventArgs e)
            {
                //tạo ipEndPoint
                ip = IPAddress.Parse("127.0.0.1");
                iep = new IPEndPoint(ip, 13000);
                //tạo tcplistener Server
                tcplServer = new TcpListener(iep);
                tcplServer.Start();     //bắt đầu lắng nghe
      
                //tạo kết nối vơi client
                client = tcplServer.AcceptTcpClient();
    
                //tạo các stream để gửi và nhận dữ liệu từ client
                sr = new StreamReader(client.GetStream(),Encoding.UTF8);
                sw = new StreamWriter(client.GetStream(),Encoding.UTF8);
                tbReceive.Text = "chấp nhận kết nối từ : " + client.ToString() + "\r\n";
                sw.WriteLine("connneted succeed \r\n");
                sw.Flush();
    
                //tạo thread để nhận dữ liệu
                Thread receive = new Thread(new ThreadStart(Receive));
                receive.Start();
            }
            private void Receive()
            {
                while (true)
                {
                    //nhận dữ liệu từ client
                    string s = sr.ReadLine();
                    tbReceive.Text += s + "\r\n";
                    Send(s);
                    if (s.ToUpper().Equals("QUIT")) break;
    
                }
                sw.Close();
                sr.Close();
                client.Close();
                tcplServer.Stop();
            }
            private void Send(string s)
            {
                if (s.ToUpper().Equals("GETDATE"))
                {
    
                    sw.WriteLine(DateTime.Now.ToShortDateString());
                    sw.Flush();
                }
                else if (s.ToUpper().Equals("GETTIME"))
                {
                    sw.WriteLine(DateTime.Now.ToShortTimeString());
                    sw.Flush();
                }
    
            }
           
        }
    }
    code của Client

    Code:
    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;
    using System.Threading;
    using System.IO;
    
    namespace network_from_client
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
            }
    
            IPAddress ip;
            IPEndPoint iep;
            TcpClient tcpClient;
    
            private void btnStart_Click(object sender, EventArgs e)
            {
                //tạo ClientTCP
                ip = IPAddress.Parse("127.0.0.1");
                iep = new IPEndPoint(ip, 13000);
                TcpClient tcPClient = new TcpClient();
                [COLOR="#FFD700"]tcpClient.Connect(iep);[/COLOR]
    
                //tạo Thread để nhận dữ liệu
                Thread thReceive = new Thread(new ThreadStart(Receive));
                thReceive.Start();
            }
            private void Receive()
            {
                while (true)
                {
                    //tạo 1 stream để nhận dữ liệu
                    StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
                    String s = sr.ReadLine();
                    tbReceive.Text += s + "\r\n";
                    if (s.ToUpper().Equals("QUIT")) break;
                }
            }
    
            private void btnSend_Click(object sender, EventArgs e)
            {
                //tạo 1 stream để gửi dữ liệu đi
                
                StreamWriter sw = new StreamWriter(tcpClient.GetStream(),Encoding.UTF8);
                sw.WriteLine(tbSend.Text);
                sw.Flush();
                tbReceive.Text += tbSend.Text + "\r\n";
                if (tbSend.Text.ToUpper().Equals("QUIT"))
                {
                    sw.Close();
                    tcpClient.Close();
                }
            }
        }
    }

  • #2
    Ở đoạn code client :
    Code:
    private void Receive()
            {
                while (true)
                {
                    //tạo 1 stream để nhận dữ liệu
                    StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
                    String s = sr.ReadLine();
                    tbReceive.Text += s + "\r\n";
                    if (s.ToUpper().Equals("QUIT")) break;
                }
            }
    Anh sửa lại thành:
    Code:
    private void Receive()
            {
               StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
                while (true)
                 {
                    //tạo 1 stream để nhận dữ liệu
                   
                    String s = sr.ReadLine();
                    tbReceive.Text += s + "\r\n";
                    if (s.ToUpper().Equals("QUIT")) break;
                }
            }
    Xem thử có chạy được không! Không có win nên không test được!

    Comment


    • #3
      TcpClient tcPClient = new TcpClient();
      tcpClient.Connect(iep);
      =))
      Áo rách vai vì lòng tri kỷ
      Quần thủng đích vì ý chí kiên cường
      Vành mũ cối che đời trai trẻ
      Dép cao su dẫm nát mối tình đầu..

      Comment


      • #4
        bó tay, lỗi sai tên biến. @@ khuyên bạn nên dùng Ctrl+Space đề lấy tên biến cho đúng nhé hì
        AI là người đặt chân đầu tiên là Mặt Trăng ????
        --> Ai cũng sẽ trả lời là Neil Armstrong
        Vậy ai là người thứ 2 ????
        ---> Không ai quan tâm cả
        Bạn phải là người dẫn đầu. Không ai chú ý đến người thứ 2 cả !
        Hãy học bằng cả trái tim, thành công sẽ theo đuổi bạn

        Comment


        • #5
          Sai tên biến=> lỗi basic! còn :
          Code:
          StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
          để trong vòng lập while có hợp lí không nhỉ ??

          Comment


          • #6
            ý bạn là sao ? có thể nói rỏ hơn được không ?

            Originally posted by 11520486 View Post
            Sai tên biến=> lỗi basic! còn :
            Code:
            StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
            để trong vòng lập while có hợp lí không nhỉ ??

            Comment


            • #7
              Thứ nhất: Anh nên chuyễn chuỗi thành kiểu BYTE, rồi gửi nhận theo kiểu BYTE!
              Thứ hai: chỗ client :
              Code:
              private void Receive()
                      {
                          while (true)
                          {
                              //tạo 1 stream để nhận dữ liệu
                              StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
                              String s = sr.ReadLine();
                              tbReceive.Text += s + "\r\n";
                              if (s.ToUpper().Equals("QUIT")) break;
                          }
                      }
              
                      private void btnSend_Click(object sender, EventArgs e)
                      {
                          //tạo 1 stream để gửi dữ liệu đi
                          
                          StreamWriter sw = new StreamWriter(tcpClient.GetStream(),Encoding.UTF8);
                          sw.WriteLine(tbSend.Text);
                          sw.Flush();
                          tbReceive.Text += tbSend.Text + "\r\n";
                          if (tbSend.Text.ToUpper().Equals("QUIT"))
                          {
                              sw.Close();
                              tcpClient.Close();
                          }
                      }
              Mỗi lần gửi nhận liệu lại tạo mới sw( StreamWriter) và sr(StreamReader).Trong khi đó chưa đóng lại(sw.close() ,sr.close() ),Muốn tái sử dụng lại sw và sr thì phải đóng trước đã. Nhưng đối với bài này thì chỉ cần khởi tạo 1 lần và khi kết thúc chương trình thì đóng lại.

              Comment


              • #8
                - nếu mà dùng stream rồi thì đâu cần chuyển về mảng byte[] nữa, còn đóng tream thì mình củng bổ xung rồi. dù sao củng thanks bạn nhiệt tình.

                Originally posted by 11520486 View Post
                Thứ nhất: Anh nên chuyễn chuỗi thành kiểu BYTE, rồi gửi nhận theo kiểu BYTE!
                Thứ hai: chỗ client :
                Code:
                private void Receive()
                        {
                            while (true)
                            {
                                //tạo 1 stream để nhận dữ liệu
                                StreamReader sr = new StreamReader(tcpClient.GetStream(), Encoding.UTF8);
                                String s = sr.ReadLine();
                                tbReceive.Text += s + "\r\n";
                                if (s.ToUpper().Equals("QUIT")) break;
                            }
                        }
                
                        private void btnSend_Click(object sender, EventArgs e)
                        {
                            //tạo 1 stream để gửi dữ liệu đi
                            
                            StreamWriter sw = new StreamWriter(tcpClient.GetStream(),Encoding.UTF8);
                            sw.WriteLine(tbSend.Text);
                            sw.Flush();
                            tbReceive.Text += tbSend.Text + "\r\n";
                            if (tbSend.Text.ToUpper().Equals("QUIT"))
                            {
                                sw.Close();
                                tcpClient.Close();
                            }
                        }
                Mỗi lần gửi nhận liệu lại tạo mới sw( StreamWriter) và sr(StreamReader).Trong khi đó chưa đóng lại(sw.close() ,sr.close() ),Muốn tái sử dụng lại sw và sr thì phải đóng trước đã. Nhưng đối với bài này thì chỉ cần khởi tạo 1 lần và khi kết thúc chương trình thì đóng lại.

                Comment


                • #9
                  Nên chuyễn về mảng byte[] cho dễ tình toán gửi nhận bao nhiêu byte (đơn vị chuẩn)!
                  Đoạn code client anh post lên em chỉ thấy stream đóng khi kết thúc chương trình! Khi khởi tạo lại không có đóng

                  Comment

                  LHQC

                  Collapse
                  Working...
                  X