Sử dụng lớp UDPClient để thực hiện kết nối UDP giữa hai máy hoặc giữa 1 máy với nhiều máy.. Bài tập mẫu: Chương 3_bài 1 Thực hiện gởi và nhận dữ liệu giữa hai bên sử dụng giao thức UDP.
Trang 1THỰC HÀNH TUẦN 3
SOCKETS
1 Lớp IP Address : lớp thể hiện địa chỉ IP Địa chỉ là một tập hợp gồm 4 con số có giá trị từ
0 đến 255 và được cách nhau bởi dấu chấm
IPAddress ipadd = IPAddress Parse(“127.0.0.1”);
2 Lớp IPEndpoint : lớp chứa đựng cả IPAddress và số hiệu cổng
IPEndPoint RemoteIpEndPoint = new IPEndPoint (ipadd, 8080);\
3 Kết nối UDP
Giao thức UDP là giao thức phi kết nối, nói cách khác không cần thiết lập kết nối giữa hai bên khi tiến hành trao đổi thông tin
Giao thức không tin cậy bằng giao thức TCP, nhưng tốc độ lại nhanh và dễ cài đặt Ngoài
ra có thể gửi các gói tin quảng bá (broadcast) đồng thời cho nhiều máy
Sử dụng lớp UDPClient để thực hiện kết nối UDP giữa hai máy hoặc giữa 1 máy với nhiều máy
Bài tập mẫu: (Chương 3_bài 1)
Thực hiện gởi và nhận dữ liệu giữa hai bên sử dụng giao thức UDP
Trang 2Gợi ý:
Bên A – gọi là UDP client, cần kết nối đến bên B – UDP server để gởi dữ liệu Trong bài tập này, ta cho dữ liệu là chuỗi “Hello World?”
Sự kiện cho nút Send:
private void button1_Click( object sender, EventArgs e)
{
//Tạo kết nối UDP
UdpClient udpClient = new UdpClient ();
//Lấy địa chỉ IP từ textbox và chuyển thành kiểu IPAddress
IPAddress ipadd = IPAddress Parse(tbHost.Text);
- Sử dụng ListBox để nhận dữ liệu từ bên A gởi
- Bắt sự kiện xảy ra khi Form được Load lên
Khai báo các thành phần:
private System.Windows.Forms ListBox lbConnections;
private void InitializeComponent()
Trang 3this Controls.Add( this lbConnections);
this Font = new System.Drawing Font ("Microsoft Sans Serif",
9.75F, System.Drawing FontStyle Regular,
System.Drawing GraphicsUnit Point, (( byte )(0)));
this Margin = new System.Windows.Forms Padding (4, 4, 4, 4); this Name = "Form1";
this Text = "Form1";
this Load += new System EventHandler ( this Form1_Load);
this ResumeLayout( false );
}
Hàm serverThread: đón nhận dữ liệu từ bên A gởi sang và hiện lên ListBox
public void serverThread()
Sự kiện load Form: Tạo một thread để chạy hàm nhận dữ liệu từ bên gởi
private void Form1_Load( object sender, EventArgs e)
{
Trang 4Thread thdUDPServer = new Thread ( new ThreadStart (serverThread)); thdUDPServer.Start();
}
4 Kết nối TCP
Để đảm bảo độ tin cậy trong các ứng dụng mạng, người ta sử dụng giao thức TCP _ một giao thức có kết nối
Bài 1: (Chương 3_ bài 3 single thread)
Viết chương trình lắng nghe dữ liệu từ dịch vụ Telnet sử dụng kết nối TCP ( sử dụng lớp Socket) với mô tả sau:
1 Chạy chương trình
2 Nhấn nút Listen
3 Mở CMD gõ lệnh: telnet <IP của máy> 8080
4 Vào màn hình telnet, gõ thông điệp tùy ý, sau khi kết thúc, đóng cửa sổ telnet lại thì thông báo trên sẽ được chương trình nhận và hiện lên form
5 Xem hình mẫu
Trang 5Gợi ý:
Bật telnet trong win 7: http://www.wikihow.com/Activate-Telnet-in-Windows-7
Để có thể telnet đến địa chỉ IP của máy tại cổng 8080, ta phải mở port 8080 lắng nghe kết nối TCP đến port 8080, do đó khi nhấn nút Listen có nghĩa là ta đang thực hiện lắng nghe kết nối tại địa chỉ IP của máy và cổng là 8080
Sự kiện cho nút Listen:
private void btnListen_Click( object sender, EventArgs e)
//AddressFamily: trả về họ địa chỉ của địa chỉ IP hiện hành Ở đây
là địa chỉ Ipv4 nên chọn AddressFamily.InterNetwork //SocketType: kiểu kết nối socket, ở đây dùng luồng Stream để nhận
dữ liệu //ProtocolType: sử dụng giao thức kết nối nào, ở đây sử dụng kết nối TCP
// Ba tham số của hàm đi với nhau khi ta thực hiện kết nối TCP Socket listenerSocket = new Socket (
Trang 6IPEndPoint ipepServer = new
//Đồng ý kết nối clientSocket = listenerSocket.Accept();
Trang 7Gợi ý:
static void Main( string [] args)
{
IPAddress test1 = IPAddress Parse("192.168.1.1");
IPAddress test2 = IPAddress Loopback;
IPAddress test3 = IPAddress Broadcast;
IPAddress test4 = IPAddress Any;
IPAddress test5 = IPAddress None;
//IPHostEntry ihe =
// Dns.GetHostByName(Dns.GetHostName());
IPHostEntry ihe = Dns GetHostEntry( Dns GetHostName());
IPAddress myself = ihe.AddressList[0];
Bài 3: (Chuong 3 _ bai 6)
Viêt chương trình thực hiện các yêu cầu sau:
- Khởi tạo một địa chỉ IP 127.0.0.1 với cổng 8000
- Khởi tạo một socket có tên là test, kết nối TCP
- In ra các thuộc tính Address Family, SocketType, Protocol Type của socket test
- Kiểm tra xem socket có đang ở chế độ Blocking hay không?
Trang 8- Set Blocking = false? Kiểm tra lại chế độ Blocking, Connected sau khi set blocking
bằng false
- Gán địa chỉ IP + port đến socket
- In ra địa chỉ IP + port vừa được gán tới socket
Gợi ý:
static void Main( string [] args)
{
IPAddress ia = IPAddress Parse("127.0.0.1");
IPEndPoint ie = new IPEndPoint (ia, 8000);
Socket test = new Socket ( AddressFamily InterNetwork,
SocketType Stream, ProtocolType Tcp);
Console WriteLine("new Blocking: {0}", test.Blocking);
Console WriteLine("Connected: {0}", test.Connected);
test.Bind(ie);
IPEndPoint iep = ( IPEndPoint )test.LocalEndPoint;
Trang 9Console WriteLine("Local EndPoint: {0}",
iep.ToString());
test.Close();
Console ReadLine();
}
Bài 4 (Chương 3_ bai 5)
Viêt chương trình thực hiện các yêu cầu sau:
- Khởi tạo một địa chỉ IP 127.0.0.1 với cổng 8000
- In ra địa chỉ IP và số hiệu cổng trên
- In ra các thuộc tính Address Family, địa chỉ và cổng
- In ra số hiệu cổng tối thiểu và tối đa
- Thay đổi số hiệu cổng thành 80
- In ra địa chỉ IP và số hiệu cổng đã được thay đổi
- In ra SocketAdress
Gợi ý:
static void Main( string [] args)
Trang 10{
IPAddress test1 = IPAddress Parse("192.168.1.1");
IPEndPoint ie = new IPEndPoint (test1, 8000);
Console WriteLine("The IPEndPoint is: {0}",
Bài 5: (Chương 3_bài 8)
Viết chương trình lắng nghe dữ liệu từ dịch vụ Telnet sử dụng kết nối TCP với mô tả sau:
1 Chạy chương trình
2 Một màn hình đen hiện ra chữ “Waiting for a client…”
3 Mở CMD gõ lệnh: telnet <IP của máy> 9050
4 Tại màn hình telnet hiện chữ “Welcome to my test sever”
5 Tại màn hình chương trình hiện chữ “Connect with địa chỉ IP at port số hiệu cổng”
6 Vào màn hình telnet, gõ thông điệp tùy ý thì lập tức bên màn hình chương trình hiện y chang vậy
7 Đóng màn hình telnet
8 Màn hình chương trình hiện ra chữ “ Disconnect at địa chỉ IP” và chương trình đóng
lại
9 Xem hình mô tả
Trang 11Gợi ý:
static void Main( string [] args)
{
int recv;
byte [] data = new byte [1024];
IPEndPoint ipep = new IPEndPoint ( IPAddress Any, 9050);
Socket newsock = new
Socket ( AddressFamily InterNetwork,
SocketType Stream, ProtocolType Tcp);
newsock.Bind(ipep);
newsock.Listen(10);
Console WriteLine("Waiting for a client ");
Socket client = newsock.Accept();
IPEndPoint clientep =
( IPEndPoint )client.RemoteEndPoint;
Console WriteLine("Connected with {0} at port {1}",
clientep.Address, clientep.Port);
string welcome = "Welcome to my test server";
data = Encoding ASCII.GetBytes(welcome);
client.Send(data, data.Length,
Trang 12Viết chương trình gửi và nhận dữ liệu sử dụng TCP Client và TCP Listener
Tra cưu lý thuyết:
Bật telnet trong win 7: http://www.wikihow.com/Activate-Telnet-in-Windows-7
Trang 13 IPAddress:
https://msdn.microsoft.com/en-us/library/system.net.ipaddress(v=vs.110).aspx
IPEndpoint :
https://msdn.microsoft.com/en-us/library/system.net.ipendpoint(v=vs.110).aspx
Trang 14private Stream stmReader = null;
private Stream stmWriter = null;
private void btn_open_Click(object sender, EventArgs e)
{
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100);
listen = new TcpListener(ipe);
Trang 15listClient.Add(client);
//MessageBox.Show("Client Kết Nối Thành Công");
//tao 1 tuyen moi de nhan du lieu tu client khi co ket noi moi
t = new Thread(nhandulieu);
t.Start(client);
string s = "Chào mừng 11520010 " + " đã kết nối đến máy chủ" + "\r\n";
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(s);
client.Send(data, data.Length, SocketFlags.None);
// //nhan du lieu tu client
byte[] data = new byte[1024];
int recv = sock.Receive(data);
string s = Encoding.UTF8.GetString(data, 0, recv);
rtb_hienthi.Text += s + "\r\n";
rtb_hienthi.SelectionStart = rtb_hienthi.Text.Length;
rtb_hienthi.ScrollToCaret();
//tra du lieu ve cac client
byte[] data1 = new byte[1024];
data1 = Encoding.UTF8.GetBytes(s);
foreach (Socket i in listClient)
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes("Server : "+txt_chat.Text);
foreach (Socket i in listClient)
{
i.Send(data, data.Length, SocketFlags.None);
} rtb_hienthi.Text +="Server : "+ txt_chat.Text + "\r\n";
Trang 16// BinaryWriter Writer = null;
// string Name = "book.txt";
//byte[] data = new byte[1024];
//data = Encoding.UTF8.GetBytes("Server : Send"+txtFileName.Text);
//foreach (Socket i in listClient)
//{
// i.Send(data, data.Length, SocketFlags.None);
//}
//OpenFileDialog fileDialog = new OpenFileDialog();
//if (fileDialog.ShowDialog() == DialogResult.OK)
Trang 17private void button1_Click(object sender, EventArgs e)
{
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100);
listen = new TcpListener(ipe);
listen.Start();
//MessageBox.Show("Đang Chờ Kết Nối Từ Client");
t = new Thread(ketnoi);
Trang 18string name = Dns.GetHostName();
IPHostEntry entry = Dns.GetHostEntry(name);
IPAddress[] addr = entry.AddressList;
StreamReader sr = new StreamReader(txtFileName.Text);
TcpClient tcpClient = new TcpClient();
tcpClient.Connect(new IPEndPoint(IPAddress.Parse(GetIP()), 8085));
byte[] buffer = new byte[1500];
Trang 20IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(txt_ip.Text), 100);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
client.Connect(ipe);
//MessageBox.Show("Đã Kết Nối Đến Server");
byte[] data = new byte[1024];
int recv = client.Receive(data);
rtb_hienthi.Text = Encoding.UTF8.GetString(data, 0, recv);
truyen = new Thread(new ThreadStart(nhandulieu));
byte[] data = new byte[1024*50000];
int recv = client.Receive(data);
string s = Encoding.UTF8.GetString(data, 0, recv);
Trang 21byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes("11520010" + " : " + txt_chat.Text);
client.Send(data, data.Length, SocketFlags.None);
//private Stream stmReader = null;
//private NetworkStream nwkStream = null;
//private Stream stmWriter = null;
//private TcpClient tcpClient = null;
//bool SaveData(byte[] Data)
//{
// BinaryWriter Writer = null;
// string Name = "book.txt";
Trang 22// //lay het du lieu trong file
// byte[] data = new byte[1024 * 50000];
// int recv = client.Receive(data);
// string s = Encoding.UTF8.GetString(data, 0, recv);