1. Trang chủ
  2. » Giáo án - Bài giảng

leech chương trình chat bằng c#

7 351 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 7
Dung lượng 146,96 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nội dung sử dụng luồng tại server, mỗi khi Client kết nối đến server chương trình sẽ tạo những luồng riêng biệt để xử lý các kết nối, chương trình cũng tạo ra những luồng để xử lý các Cl

Trang 1

LEECH C hưởng trìn h Chat bằng c# :

Source : http://totuan.one-forum.net/ki7871n- ang-c-t486.htm

I Giới thiệu

Chương trình cho phép thực hiện việc giao tiếp giữa các clients thông qua server,

II Nội dung

sử dụng luồng tại server, mỗi khi Client kết nối đến server chương trình sẽ tạo những luồng riêng biệt để

xử lý các kết nối, chương trình cũng tạo ra những luồng để xử lý các Client mới.

Chương trình được mô tả cụ thể như sau:

Chương trình ThreadedTcpSrvr.cs

Code:

using System;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

class ThreadedTcpSrvr

{

private TcpListener client;

public ThreadedTcpSrvr()

client = new TcpListener(9050);

client.start();

Console.WriteLine("Waiting for clients ");

while(true)

{

while (¡client.PendingO)

{

Thread.Sleep(1000);

}

ConnectionThread newconnection = new ConnectionThread();

newconnection.threadListener = this.client;

Thread newthread = new Thread(new

ThreadStart(newconnection.HandleConnection));

newthread.start();

}

}

public static void Main()

{

ThreadedTcpSrvr server = new ThreadedTcpSrvr();

}

}

class ConnectionThread

{

public TcpListener threadListener;

private statin int connections = 0;

public void HandleConnection()

{

int recv;

byte[] data = new byte[1024];

TcpClient client = threadListener.AcceptTcpClient();

Networkstream ns = client.Getstream();

connections++;

Console.WriteLine("New client accepted: {0} active connections",

Trang 2

connections);

string welcome = "Welcome to my test server";

data = Encoding.ASCII.GetBytes(welcome);

ns.Write(data, 0, data.Length);

while(true)

{

data = new byte[1024];

recv = ns.Read(data, 0, data.Length);

if (recv == 0)

break;

ns.Write(data, 0, recv);

}

ns.Close();

client.Close();

connections

Console.WriteLine("Client disconnected: {0} active connections", connections); }

Chương trình sử dụng lớp Tcp Listener để lắng nghe các kết nối TCP theo cổng cố định (9050) đồng thời phương thức starto được sử dụng để chờ các clients mới

Code:

while(true)

{

while (!client.PendingO)

£

Thread.Sleep(1000);

}

ConnectionThread newconnection = new ConnectionThread();

newconnection.threadListener = this.client;

Thread newthread = new Thread(new

ThreadStart(newconnection.HandleConnection));

newLhread.SLarL();

}

Vòng lặp while được sử dụng để kiểm tra các Client kết nối, nếu có chương trình sẽ tạo luồng để chấp nhận các kết nối

Khi server chấp nhận các kết nối từ phía Client, nó sẽ tạo ra socket riêng biệt và đưa vào một luồng mới Một Client có thể gửi tin nhắn đến một Client và nhận được phản hồi từ chính Client đó mà không ảnh hưỏng đến các Client khác Khi mỗi Client ngắt kết nối, luồng sẽ tự động ngắt

Chương trình dưới đây thực hiện việc gửi và nhận dữ liệu giữa các Client thông qua giao thức TCP

Chương trình TCPChat.cs

Code:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

Trang 3

using System.Net.Sockets;

using System.Net;

using System.Threading;

namespace TcpChat

{

public partial class TcpChat : Form

{

public TcpChatQ

{

InitializeComponent();

}

private static Socket client;

private static byte[] data = new byte[1024];

void AcceptConn(IAsyncResult iar)

{

Socket oldserver = (Socket)iar.AsyncState;

client = oldserver.EndAccept(iar);

results.Items.Add("Connection from: " +

client.RemoteEndPoint.ToString());

Thread receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start();

}

void Connected(IAsyncResult iar)

{

try

{

client.EndConnect(iar);

results.Items.Add("Connected to: " + client RemoteEndPoint T oSt ring ());

Thread receiver = new Thread(new ThreadStart(ReceiveData)); receiver.Start();

}

catch (SocketException)

{

results.Items.Add("Error connecting");

}

}

void SendData(IAsyncResult iar)

{

Socket remote = (Socket)iar.AsyncState;

int sent = remote.EndSend(iar);

}

void ReceiveData()

{

int recv;

string stringData;

while (true)

{

recv = client.Receive(data);

stringData = Encoding.ASCII.GetString(data, 0, recv);

if (stringData == "bye") break;

results.Items.Add(stringData);

}

stringData = "bye";

byte[] message = Encoding.ASCII.GetBytes(stringData);

client.Send(message);

client CloseQ;

Trang 4

results.Items.Add("Connection stopped");

return;

}

private void btnlisten_Click(object sender, EventArgs e)

{

results.Items.Add("Listening for a client ");

Socket newsock = new Socket(AddressFamily.InterNetwork,

SccketType.Stream,

ProtocolType.Tcp);

IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);

newsock.Bind(iep);

newsock.Listen(5);

newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock);

}

private void btnconnect_Click(object sender, EventArgs e)

{

results.Items.Add("Connecting ");

client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint iep = new IPEndPoint(IPAddress.Parse(txtip.Text), 9050); client.BeginConnect(iep, new AsyncCallback(Connected), client);

}

private void btnsend_Click(object sender, EventArgs e)

{

byte[] message = Encoding.ASCII.GetBytes(txttext.Text);

txttext.Clear();

client.BeginSend(message, 0, message.Length, 0,

new AsyncCallback(SendData), client);

}

}

}

Chương trình được tạo dưới dạng form đơn giản với các đối tượng cụ thể sau:

0 Một textbox (txtip) cho phép nhập địa chỉ ip kết nối

0 Textbox (txttext): nhập nội dung gửi đi

0 Nút listen chờ nhận kết nối từ máy Client khác

0 Nút connect thực hiện các kết nối đến các máy khác từ xa

0 Nũt send thực hiện gửi tin nhắn đến các máy Client được nhập vào từ textbox (txttext)

0 Listbox (result) hiển thị nội dung Chat giữa các Client với nhau

0 Khi ngưòi dùng nhấn nút listen một socket sẽ được tạo ra và lắng nghe các kết nối đang đến sử dụng phương thức beginAcceptQ:

Code:

private void htn1.isten_Click(object sender, EventArgs e)

{

results.Items.Add("Listening for a client ");

Socket newsock = new Socket(AddressFamily.InterNetwork,

SccketType.Stream,

ProtocolType.Tcp);

IPEndPoint iep - new IPEndPoint(IPAddress.Any, 9050);

newsock.Bind(iep);

newsock.Listen(5);

Trang 5

newsock.BeginAccept(new AsyncCallback(AcceptConn), newsock);

}

Khi một chương trình chat khác kết nối., phương thức AcceptConnO tạo ra những socket riêng biệt cho mỗi Client

Khi khách hàng nhấn nút connect, một socket được tao ra và cố gắng để kết nối đến host từ xa, sử dụng phương thức beginconnect() Sau khi host từ xa chấp nhận kết nối Một socket được đưa đến luồng tạm thời, mục đích của luồng tạm thời này là chờ dữ liệu đến và đưa dữ liệu vào trong listbox

Code:

void ReceiveData()

{

int recv;

string stringData;

while (true)

{ recv = client.Receive(data);

stringData = Encoding.ASCII.GetString(data, 0, recv);

if (stringData == "bye") break;

results.Items.Add(stringData);

} stringData = "bye";

byte[] message = Encoding.ASCII.GetBytes(stringData);

client.Send(message);

client.Close();

results.Items.Add("Connection stopped");

return;

Khi dữ liệu gửi đi có chuỗi “bye”, chương trình sẽ tự động đóng Socket, cả hai chương trình Chat bị ngắt và đóng kết nối Tcp

Minh họa chương trình Chat giữa 2 Client thông qua server:

Chương trình được minh họa trên 2 máy khác nhau, máy 1 với địa chĩ ip: 172.16.71.13 đóng vai trò là máy server và Client, máy 2 với địa chỉ ip: 172.17.71.160 là máy Client

Đầu tiên chạy chương trình ThreadedTcpSrvr trên máy 1

Trang 6

CÃ D:\Tmp\ThreadedTcpSrvr\ThreadedTcpSrvr\bin\Debug\ThreadedTcpSrvr.exe

Mỏ chương trình TcpChat tại máy 1 và máy 2 Giả sử hai chương trình này được chạy cùng thời điểm đang xét

I M áy 1

Ä l ü T c p C h a t 1 M áy 2 TcpChat

Nhap Dia chi IP

Nhap Dia chi IP

172.16.71 13 Listen

Nhap noi dung gui Connect

Send

Connecting

Connected to: 172.16.71.13:9050

Welcome to my test server

|172.16.71.13

Nhap noi dung gui

Connecting

Connected to: 172.16 71.13:9050 Welcome to my test server

Listen

Connect

Send

Bây giò bắt đầu kết nối 2 Client để Chat trực tiếp với nhau Giả sử máy 2 giữ vai trò chà kết nối nhấn nút Listen Máy 1 sẽ giữ vai trò kết nối, nhập địa chỉ ip máy 2:172.168.71.160 và nhấn nút Connect khi đó 2 Client có thể Chat với nhau trực tiếp

Trang 7

c ' D:\Tmp\23-05-08\ThreadedTcpSrvr\ThreadedTcpSrvr\ThreadedTcpSrvr\bin\Debug\Thread EBÜ

W a i t i n g f o r c l i e n t s

Neu c l i e n t a c c e p t e d : 1 a c t i v e c o n n e c t io n s

Neu c l i e n t a c c e p t e d : 2 a c t i v e c o n n e c t io n s

Sau khi k ê t noi diiöc thiét lâp, 2 mây cô the gûri nhân tin nhan qua lai vôi nhau:

Nhap Dia chi IP

172.16.71.1G0

Nhap noi dung gui

Connecting

Connected to: 172.16.71 13:9050

Welcome to my test server

Connecting

Connected to: 172.16.71.160:9050

Gui tu may 160

Connection stopped

May 1

Listen Connect Send

I T cpChat

Nhap D» chi IP

|172 16 71 13

Nhap noi dung gui

Connecting

Connected to: 172.16.71139050 Welcome to my test server Listening for a cSert

Connection from 17216.71 13:1677 Gui tu may 13

Connection stopped

M ây 2

Listen

Connect

Send

Ngày đăng: 28/06/2014, 12:51

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w