Từ 1 tới 2 trên tổng số 2 kết quả

Đề tài: Thiết lập On/Off TCP Server trong C#.net Winform (Socket)

  1. #1
    Ngày gia nhập
    03 2012
    Bài viết
    0

    Mặc định Thắc mắc về thiết lập On/Off TCP Server trong C#.net Winform (Socket)

    Chào các bạn!
    Hiện mình đang nghiên cứu về việc truyền nhận dữ liệu theo TCP tới server và tiến hành xử lý để nâng tính bảo mật.

    Cụ thể, ở phía Client mình sử dụng Autoit để viết 1 tool gửi các thông số tới server.
    Trên server mình có một TCP server như sau để thử nghiệm:


    Đây là code C#.net trên console do người trước làm để lại:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    using System.Windows.Forms;
    
    namespace ServerToolMap
    {
        public class Server
        {
            private TcpListener tcpListener;
            private Thread listenThread;
    
            public Server()
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 8668);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
            }
    
            private void ListenForClients()
            {
                this.tcpListener.Start();
    
                while (true)
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
    
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client);
                }
            }
    
    
            private void HandleClientComm(object client)
            {
                UTF8Encoding encoder = new UTF8Encoding();
                TcpClient tcpClient = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();
    
                byte[] message = new byte[4096];
                int bytesRead;
    
                while (true)
                {
                    bytesRead = 0;
    
                    try
                    {
                        bytesRead = clientStream.Read(message, 0, 4096);
                    }
                    catch
                    {
                        break;
                    }
    
                    if (bytesRead == 0)
                    {
                        break;
                    }
    
                    //code here
    
                    byte[] b = encoder.GetBytes("Đã nhận được tin nhé!");
                    clientStream.Write(b, 0, b.Length);
    
                    MessageBox.Show(encoder.GetString(message, 0, bytesRead));
                    break;
                }
            
                tcpClient.Close();
            }
    
    
    
    
        }
    }


    Mình thử chuyển nó qua Winform thành thế này, vì yêu cầu bài là chuyển sang C#.net winform:



    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    using System.Linq;
    
    namespace Core_Server
    {
        public partial class frmCoreServer : Form
        {
           private TcpListener tcpListener;
           private Thread listenThread;
           string mess_temp;
    
          public frmCoreServer()
            {
                InitializeComponent();   
                 
            }
    
            private void btExit_Click(object sender, EventArgs e)   //button Thoat chuong trinh
            {
                DialogResult dialogResult = MessageBox.Show("Are you sure? Your server status will be Offline!", "Exit Action Confirm", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    Close();
                }
                else if (dialogResult == DialogResult.No)
                {
                    //do something else
                }
            }
    
            private void btOn_Click(object sender, EventArgs e)     //button Start TCP server để lắng nghe dữ liệu
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 8668);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
                lbOnOff.Text = "ONLINE";
            }
    
            private void btOff_Click(object sender, EventArgs e)   //button tắt Server
            {
                //---
            }
    
            private void ListenForClients()
            {
                this.tcpListener.Start();
    
                while (true)
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client);
                }
            }
    
            private void HandleClientComm(object client)
            {
                UTF8Encoding encoder = new UTF8Encoding();
                TcpClient tcpClient = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();
    
                byte[] message = new byte[4096];
                int bytesRead;
    
                while (true)
                {
                    bytesRead = 0;
    
                    try
                    {
                        bytesRead = clientStream.Read(message, 0, 4096);
                    }
                    catch
                    {
                        break;
                    }
    
                    if (bytesRead == 0)
                    {
                        break;
                    }
    
                    //code here
    
                    byte[] b = encoder.GetBytes("Đã nhận rồi nhé!");
                    clientStream.Write(b, 0, b.Length);
    
                    MessageBox.Show(encoder.GetString(message, 0, bytesRead));
                    // mess_temp = encoder.GetString(message, 0, bytesRead);
                    break;
                }
                //tcpClient.Close();
                //MessageBox.Show(mess_temp);
                //listMess.Items.Add("a");    ListMess là 1 cái list box mình định để truyền dữ liệu nhận được vào đó
                Add();
    
            }
    
            
                
         }
    
    
    }
    Cụ thể là nó đã hoạt động khi mình bấm nút ON trên winform, nhưng không biết làm thế nào để Off được server. Mỗi lần phải thoát cả thì chả nói làm chi.
    Bên cạnh, như các bạn thấy dòng: " MessageBox.Show(encoder.GetString(message, 0, bytesRead));" là để hiện thị thông điệp từ client gửi tới. Nhưng khi mình muốn add vào Listbox thì bị báo lỗi, dạng như "ko nằm cùng thread đang dùng".

    Các bạn có thể chỉ thêm mình chút được không?
    Nhân tiện, có tài liệu về Socket xin gửi mình ít.

    Vì mình mới nghiên cứu sang C# nên các bạn nói rõ chút nhé
    Cám ơn.
    Đã được chỉnh sửa lần cuối bởi maxforummfv : 28-03-2012 lúc 10:10 AM.

  2. #2
    Ngày gia nhập
    01 2011
    Bài viết
    44

    [QUOTE=maxforummfv;356447]Chào các bạn!
    Hiện mình đang nghiên cứu về việc truyền nhận dữ liệu theo TCP tới server và tiến hành xử lý để nâng tính bảo mật.

    Cụ thể, ở phía Client mình sử dụng Autoit để viết 1 tool gửi các thông số tới server.
    Trên server mình có một TCP server như sau để thử nghiệm:


    Đây là code C#.net trên console do người trước làm để lại:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    using System.Windows.Forms;
    
    namespace ServerToolMap
    {
        public class Server
        {
            private TcpListener tcpListener;
            private Thread listenThread;
    
            public Server()
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 8668);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
            }
    
            private void ListenForClients()
            {
                this.tcpListener.Start();
    
                while (true)
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
    
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client);
                }
            }
    
    
            private void HandleClientComm(object client)
            {
                UTF8Encoding encoder = new UTF8Encoding();
                TcpClient tcpClient = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();
    
                byte[] message = new byte[4096];
                int bytesRead;
    
                while (true)
                {
                    bytesRead = 0;
    
                    try
                    {
                        bytesRead = clientStream.Read(message, 0, 4096);
                    }
                    catch
                    {
                        break;
                    }
    
                    if (bytesRead == 0)
                    {
                        break;
                    }
    
                    //code here
    
                    byte[] b = encoder.GetBytes("Đã nhận được tin nhé!");
                    clientStream.Write(b, 0, b.Length);
    
                    MessageBox.Show(encoder.GetString(message, 0, bytesRead));
                    break;
                }
            
                tcpClient.Close();
            }
    
    
    
    
        }
    }


    Mình thử chuyển nó qua Winform thành thế này, vì yêu cầu bài là chuyển sang C#.net winform:



    Code:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Threading;
    using System.Net;
    using System.Linq;
    
    namespace Core_Server
    {
        public partial class frmCoreServer : Form
        {
           private TcpListener tcpListener;
           private Thread listenThread;
           string mess_temp;
    
          public frmCoreServer()
            {
                InitializeComponent();   
                 
            }
    
            private void btExit_Click(object sender, EventArgs e)   //button Thoat chuong trinh
            {
                DialogResult dialogResult = MessageBox.Show("Are you sure? Your server status will be Offline!", "Exit Action Confirm", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    Close();
                }
                else if (dialogResult == DialogResult.No)
                {
                    //do something else
                }
            }
    
            private void btOn_Click(object sender, EventArgs e)     //button Start TCP server để lắng nghe dữ liệu
            {
                this.tcpListener = new TcpListener(IPAddress.Any, 8668);
                this.listenThread = new Thread(new ThreadStart(ListenForClients));
                this.listenThread.Start();
                lbOnOff.Text = "ONLINE";
            }
    
            private void btOff_Click(object sender, EventArgs e)   //button tắt Server
            {
                //---
            }
    
            private void ListenForClients()
            {
                this.tcpListener.Start();
    
                while (true)
                {
                    TcpClient client = this.tcpListener.AcceptTcpClient();
                    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
                    clientThread.Start(client);
                }
            }
    
            private void HandleClientComm(object client)
            {
                UTF8Encoding encoder = new UTF8Encoding();
                TcpClient tcpClient = (TcpClient)client;
                NetworkStream clientStream = tcpClient.GetStream();
    
                byte[] message = new byte[4096];
                int bytesRead;
    
                while (true)
                {
                    bytesRead = 0;
    
                    try
                    {
                        bytesRead = clientStream.Read(message, 0, 4096);
                    }
                    catch
                    {
                        break;
                    }
    
                    if (bytesRead == 0)
                    {
                        break;
                    }
    
                    //code here
    
                    byte[] b = encoder.GetBytes("Đã nhận rồi nhé!");
                    clientStream.Write(b, 0, b.Length);
    
                    MessageBox.Show(encoder.GetString(message, 0, bytesRead));
                    // mess_temp = encoder.GetString(message, 0, bytesRead);
                    break;
                }
                //tcpClient.Close();
                //MessageBox.Show(mess_temp);
                //listMess.Items.Add("a");    ListMess là 1 cái list box mình định để truyền dữ liệu nhận được vào đó
                Add();
    
            }
    
            
                
         }
    
    
    }
    Cụ thể là nó đã hoạt động khi mình bấm nút ON trên winform, nhưng không biết làm thế nào để Off được server. Mỗi lần phải thoát cả thì chả nói làm chi.
    Bên cạnh, như các bạn thấy dòng: " MessageBox.Show(encoder.GetString(message, 0, bytesRead));" là để hiện thị thông điệp từ client gửi tới. Nhưng khi mình muốn add vào Listbox thì bị báo lỗi, dạng như "ko nằm cùng thread đang dùng".

    Các bạn có thể chỉ thêm mình chút được không?
    Nhân tiện, có tài liệu về Socket xin gửi mình ít.

    Vì mình mới nghiên cứu sang C# nên các bạn nói rõ chút nhé
    Vấn đề OFF Server không phải là dễ.
    Còn muốn nó không báo lỗi khi đưa vào Listbox
    bạn thêm các dòng sau

    public delegate void updatelist(string messenger) ;
    public void setlist(string messenger)
    {
    object[]data={messenger};
    ListBox.BeginInvoke(new updatelist(updatelist1), data);
    }
    private updatelist1(string messenger)
    {
    ListBox.Item.Add(messenger);
    }

    Truyền tham số chỗ nào bạn cần truyền thì truyền vào.
    setlist(messenger);

Các đề tài tương tự

  1. Lập trình socket TCP/IP với Thread trong winform như thế nào???
    Gửi bởi giadinhvnvn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 15-05-2013, 10:33 PM
  2. Làm thế nào để gửi 1object từ 1 server đến nhiều client sử dụng socket trong Java
    Gửi bởi manhtoan2211 trong diễn đàn Công cụ, ebooks Java
    Trả lời: 1
    Bài viết cuối: 10-05-2013, 04:53 PM
  3. truyền dataset từ 1 server đến nhiều client bằng c# socket winform???
    Gửi bởi giadinhvnvn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 11-04-2013, 08:14 PM
  4. Cấu hình máy chủ SQL Server 2005 trong Winform
    Gửi bởi vgc0001 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 09-01-2011, 10:46 PM
  5. Winform:Gửi dữ liệu từ server xuống client trong mạng Lan?
    Gửi bởi quangminhhn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 02-12-2010, 10:07 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn