BÀi thực hành môn lập trình mạng gv trưƠng vĩnh hảo I. Mục đích



tải về 42.28 Kb.
Chuyển đổi dữ liệu30.08.2016
Kích42.28 Kb.
#29211
BÀI THỰC HÀNH MÔN LẬP TRÌNH MẠNG

GV TRƯƠNG VĨNH HẢO

-----
I. Mục đích

Làm quen với kỹ thuật lập trình mạng qua WinSock và thư viện API trong ngôn ngữ lập trình C# (Visual C++)

Sử dụng các port và giao thức mạng (TCP/IP, TCP, UDP) để hỗ trợ trong kỹ thuật lập trình kết nối mạng.
II. Yêu cầu

Viết chương trình chat trên mạng LAN sử dụng ngôn ngữ C hay C# chạy trên nền DOS hay Windows (phần mềm ứng dụng)


III. Mô tả cách thực hiện
1. Server

- Server thực thi một thread lắng nghe và chấp nhận các client kết nối đến.

- Nếu có client kết nối đến thì khởi tạo một hàm truyền nhận dữ liệu bất đồng bộ với client đó

- Nắm giữ client đó (socket)

- Khi có client kết nối đến sẽ gửi list client về cho tất cả các client

- Mỗi client sẽ gửi dữ liệu lên server, server xử lý gói dữ liệu và gửi về cho tất cả các client.


2. Client

- Client kết nối vào máy chủ


- Truyền đi một gói tin thông báo kết nối

- Nhận và xử lý gói tin chứa các client từ máy chủ

- Sau khi nhận một port từ máy chủ cấp client sẻ tạo ra một thread mới để đóng vai trò là server đợi các client khác kết nối đến.

- Truyền nhận dữ liệu bình thường


IV. Phương pháp thực hiện

- Làm việc nhóm, nhóm có từ 2 đến 4 thành viên

- Sau khi hoàn tất, nhóm viết file hướng dẫn và thuyết trình phần mềm của nhóm trước tập thể lớp và giáo viên.

- Thực hiện Demo



V. Hướng dẫn thực hành

Các nội dung hướng chỉ mang tính chất tham khảo, sinh viên dựa vào các code dưới dây hay yêu cầu các phần trên để thực hiện và hoàn chỉnh bài yêu cầu.


1. Giới thiệu:

Chat (trao đổi thông tin) trong mạng Lan (rộng ra là mạng Internet), có thể dùng các phần mềm thông dụng từ miễn phí (free software) đến phải trả phí (bản quyền) như Yahoo Messenger, Windows Messenger, Google Talk… để trao đổi với một người nào đó thông qua hệ thống mạng.

Khuyết điểm: Thường hạn chế gửi, nhận file (dữ liệu) với dung lượng lớn… với một đồng nghiệp thông qua mạng LAN.

Để giúp người dùng học có khái niệm tổng quan giới thiệu và so sánh các tiện ích giao tiếp trong mạng nội bộ như sau: Net send, Winchat, NetMeeting, Achat, BORGChat và LimPro.



a/ – Net send:

Net send là một câu lệnh của hệ điều hành Windows giúp các máy trong mạng lan có thể gửi tin nhắn cho nhau.

Sử dụng môi trường dòng lệnh (MS-DOS), thực hiện câu lệnh theo cú pháp: Net send rồi nhấn Enter.

Ví dụ, ta muốn nhắn nội dung cho các máy trong cùng một nhóm: “Toàn bộ công ty nghỉ 20-10” ta gõ câu lệnh Net send * Toan bo cong ty nghi 20-10 rồi nhấn Enter.

Với Net Send, thông tin được trao đổi tức thời, tuy nhiên tại một thời điểm chỉ có thể trao đổi với 1 máy hoặc nhiều máy trong cùng một nhóm! “Net send” chạy ở chế độ dòng lệnh, cú pháp khó nhớ với người mới sử dụng máy tính, hơn nữa phải biết trước tên máy/Ip máy cần gửi, không hiển thị danh sách các máy trong cùng một nhóm(Workgroup) do đó câu lệnh này chỉ thích  hợp cho những người am hiểu máy tính và có nhu cầu trao đổi thông tin hết sức cơ bản.
  b/- Winchat

Khác với lệnh Net send, Winchat là một ứng dụng tích hợp trong Hệ điều hành Windows XP. Khi làm việc, nó sẽ mở một cửa sổ riêng, yêu cầu bạn kết nối trực tiếp đến một máy trong cùng một nhóm. Khi 2 máy được kết nối trực tiếp với nhau rồi thì phiên làm việc mới bắt đầu.

Muốn sử dụng chương trình này, chúng ta bật Windows Explorer, từ đường dẫn Windows/System32 tìm tới tệp Winchat.exe rồi click đúp chuột vào nó hoặc từ của sổ RUN ta gõ vào Winchat.

Các máy đang chạy Winchat trong cùng 1 mạng nội bộ có thể chát với nhau. Nếu muốn chat với máy nào, chúng ta bấm chuột nút Dial trong thanh công cụ hay dùnh lệnh Dial trong menu Conversation. Biểu tượng chat trong máy được gọi sẽ chớp sáng và phát âm thanh, nếu người được gọi chấp nhận trả lời sẽ bấm nút Answers rồi hai bên trao đổi thông điệp với nhau. Nửa cửa sổ bên trên là thông điệp gửi đi, nửa cửa sổ phía dưới là thông điệp nhận về.

Chúng ta có thể mở nhiều cửa sổ chat để chat cùng lúc với nhiều người, khi không muốn chat với ai bạn bấm nút Hangs up trong cửa sổ tương ứng để ngắt kết nối.

Như vậy, winchat bên cạnh giao diện đồ họa thì cũng như net send cho phép người dùng trao đổi nội dung tức thời và khá dễ dàng khi sử dụng.

 

c/-NetMeeting

Chương trình Microsoft NetMeeting cung cấp cho chúng ta phương thức hoàn toàn mới trong việc hội thoại, hội nghị, giao tiếp trong mạng LAN hoặc qua Intetnet. Chương trình đòi hỏi cấu hình máy thấp, hỗ trợ nhắn tin và truyền tải tệp tin hiệu quả, cho phép hội thoại bằng Video và âm thanh. Tốc độ khởi động nhanh, ít tiêu tốn tài nguyên hệ thống.  Ngoài ra, NetMeeting còn cho phép điều khiển máy tính từ xa, chia sẻ màn hình làm việc. Chương trình với giao diện trực quan, tính năng phong phú, dễ sử dụng là sự lựa chọn hoàn hảo cho nhu cầu giao tiếp trên mạng. Tuy nhiên, nó lại không hỗ trợ tin nhắn tiếng Việt (Unicode), không tự phát hiện được những máy đang có NetMeeting hoạt động trong cùng một mạng, bạn phải chỉ định kết nối bằng Ip máy hoặc tên của máy tính bạn muốn kết nối tới.


d/- Yahoo Messenger
e/- Skype
2/ Code tham khao “Cách làm một chương trình chát qua mạng LAN”

a) Chương trình Chat chạy trên môi trường Dos

using System;

using System.Threading;

using Orekaria.Lib.P2P;


namespace Orekaria.Test.P2P.ConUI

{

internal class Program : IDisposable



{

private readonly BroadcastHelper _broadcast;

private readonly Thread _th;


private Program() {

_broadcast = new BroadcastHelper(8010, "K_*?gR@Ej");

_th = new Thread(DequeueMessages);

_th.Start();

}
#region IDisposable Members


public void Dispose() {

_th.Abort();

}
#endregion
private void Run() {

var isExit = false;

do {

var s = Console.ReadLine();



if (s != null && s.ToLower() == "exit")

isExit = true;

else

_broadcast.Send(string.Format("{0}: {1}", Environment.UserName, s));

} while (!isExit);

}
private void DequeueMessages() {

while (_th.IsAlive) {

Thread.Sleep(100);

while (_broadcast.Received.Count > 0)

Console.WriteLine(string.Format("{0}", _broadcast.Received.Dequeue()));

}

}


private static void Main() {

var p = new Program();

p.Run();

p.Dispose();

}

}

}


b/ - 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,

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.Pending())

{

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 static 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",
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 start() được sử dụng để chờ các clients mới.
Code: ------------------------------------------------------------------------------------------

while(true)


{
while (!client.Pending())
{
Thread.Sleep(1000);
}
ConnectionThread newconnection = new ConnectionThread();
newconnection.threadListener = this.client;
Thread newthread = new Thread(new
ThreadStart(newconnection.HandleConnection));
newthread.Start();
}

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;

using System.Net.Sockets;


using System.Net;

using System.Threading;

namespace TcpChat
{
public partial class TcpChat : Form
{
public TcpChat()
{
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.ToString());
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.Close();
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, SocketType.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:

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

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

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

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

o 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).

o Listbox (result) hiển thị nội dung chat giữa các client với nhau.

o 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 beginAccept():
Code: ---------------------------------------------------------------------------------------
private void btnlisten_Click(object sender, EventArgs e)
{
results.Items.Add("Listening for a client...");
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);
newsock.Bind(iep);
newsock.Listen(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 AcceptConn() 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





tải về 42.28 Kb.

Chia sẻ với bạn bè của bạn:




Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2022
được sử dụng cho việc quản lý

    Quê hương