Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 106 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
106
Dung lượng
2,35 MB
Nội dung
004.6 TRƯỜNG ĐẠI HỌC VINH KHOA ĐIỆN TỬ - VIỄN THÔNG ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC Đề tài: SỬ DỤNG LẬP TRÌNH SOCKET – XÂY DỰNG CHƯƠNG TRÌNH CHÁT LAN SV thực hiện: LÊ ANH TUẤN GV hướng dẫn: ThS ĐẶNG THÁI SƠN Lớp:51K2 - ĐTVT Khóa học: 2010 – 2015 NGHỆ AN - 01/2015 TRƯỜNG ĐẠI HỌC VINH BẢN NHẬN XÉT ĐỒ ÁN TỐT NGHIỆP Họ tên sinh viên: Lê Anh Tuấn Mssv: 1051080525 Ngành: Điện Tử Viễn Thơng Niên Khóa: 2010 - 2015 Giảng viên hướng dẫn: ThS Đặng Thái Sơn Cán phản biện: Ks Đinh Văn Nam Nội dung thiết kế tốt nghiệp: Nhận xét cán phản biện: Ngày tháng năm Cán phản biện ( Ký, ghi rõ họ tên ) ii MỤC LỤC MỞ ĐẦU I TÓM TẮT ĐỒ ÁN II DANH MỤC BẢNG BIỂU .III DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ IV CHƯƠNG 1.TỔNG QUAN VỀ LẬP TRÌNH MẠNG 1.1 Mơ hình tham chiếu OSI 1.2 Giao thức TCP/IP 1.3 Mơ hình truyền thơng cấu trúc mạng .6 1.3.1 Nguyên tắc truyền thông .6 1.3.2 Nguyên tắc phương pháp phân tầng .6 1.4 Địa IP – Các địa IP dành riêng 1.5 Giao thức truyền file .9 1.5.1 Khái niệm giao thức FTP 1.5.2 Đặc điểm nguyên lý hoạt động .10 1.5.3 Thiết lập kênh điều khiển chứng thực người dùng FTP 13 1.5.4 Quản lý kênh dữ liệu FTP .14 1.5.5 Các phương thức truyền dữ liệu FTP 18 1.6 Phân loại số mạng thông dụng .19 1.6.1 Mạng LAN 19 1.6.2 Mạng WAN 28 1.6.3 Mạng Internet 30 1.7 Lập trình mạng với sockets 32 1.7.1 Socket 32 1.7.2 Lập trình mạng với UDP socket 35 1.7.3 Ưu, nhược điểm giao thức UDP 37 1.8 Mô hình Client/ Server 38 1.8.1 Tổng quan 38 iii 1.8.2 Giao thức cho ứng dụng Client/Server 44 CHƯƠNG LẬP TRÌNH C# CĂN BẢN VÀ PHẦN MỀM VISUAL STUDIO 2013 47 2.1 Ngơn ngữ lập trình C# 47 2.1.1 Tổng quan C# .47 2.1.2 Các thành phần 47 2.1.3 Kiểu dữ liệu 48 2.1.4 Câu lệnh .49 2.1.5 Các toán tử 53 2.2 Lập trình mạng với C# 55 2.2.1 Lập trình mạng với socket 55 2.2.2 Lập trình với C# socket helper 57 2.3 Giới thiệu phần mềm Visual Studio .61 CHƯƠNG XÂY DỰNG VÀ THIẾT KẾ GIAO DIỆN CHƯƠNG TRÌNH 3.1 Giới thiệu chương trình .64 3.2 Kết nối Client/Server với TCP/IP 64 3.3 Tạo kết nối - Gửi nhận tin 66 3.4 Xây dựng thiết kế chương trình .74 TỔNG KẾT 76 TÀI LIỆU THAM KHẢO 77 PHỤ LỤC 78 iv MỞ ĐẦU Có thể nói phát triển vượt bậc công nghệ thông tin giúp người giải nhiều toán điều quan trọng không đơn giải tốn mà phương pháp để giải tốn cho có hiệu Hầu hết tất ứng dụng trình duyệt web, yahoo, teamviewer, … sử dụng socket để truyền nhận dữ liệu Đối với máy tính nối mạng đánh địa IP định Tương tự vậy socket xem địa chương trình Nên việc sử dụng soket để truyền nhận dữ liệu khó tránh khỏi.Trong nước ta vấn đề nhiều người quan tâm sử dụng rộng rãi Mục đích đồ án là: Tìm hiểu q trình giao tiếp giữa máy tính không sử dụng mạng, việc trao đổi dữ liệu giữa máy hay đơn giản q trình nói chuyện địi hỏi người lập trình phải nắm rõ nguyên tắc truyền tải dữ liệu, qua trình xây dựng phần mềm cần có yếu tố hay sử dụng công cụ hỗ trợ nào? Từ người lập trình bắt tay vào xây dựng chương trình Để thực đề tài chúng tơi thực nhiệm vụ sau: Tìm hiểu mạng LAN, thành phần cấu tạo nên mạng LAN; Tìm hiểu tổng quan lập trình mạng, sau vào phần lập trình socket giao thức TCP/IP; Tìm hiểu ngơn ngữ lập trình C#, Lập trình socket C# Với đề tài “Sử dụng lập trình socket - Xây dựng chương trìnhchat LAN” mong giúp người hiểu hơn, nắm vững kiến thức IP, TCP, Socket đặc biệt ứng dụng chattrong mạng LAN, mà em trình bày đề tài Nội dung đề tài gồm Chương 1: Tổng quan lập trình mạng Trong chương tìm hiểu cách tổng quan lập trình mạng, giao thức, phương thứ truyền dữ liệu Một số khái niệm liên quan đến lập trình mạng i Chương 2: Lập trình C# phần mềm Visual studio Đồ án sử dụng ngơn ngữ lập trình C# để xây dựng giao diện chương trình nên chương sâu vào tìm hiểu hàm biến vịng lặp ngơn ngữ lập trình C# Ở chương ta vào tìm hiểu phần mêm Visual Studio – Một cơng cụ hỗ trợ đắc lực cho việc lập trình Chương 3: Xây dựng thiết kế chương trình Trong chương này, ta xây dựng giao diện chương trình, xây dựng hàm hồn thiện chương trình Khác phục số lỗi định mắc phải trình làm Do hạn chế thời gian lực nên chắn khơng thể tránh khỏi những thiếu sót Em kính mong nhận thơng cảm góp ý thầy giáo, cô giáo bạn để đồ án hoàn chỉnh Xin chân thành cảm ơn ThS Đặng Thái Sơn giúp em thực tốt đồ án Xin chân thành cảm ơn thầy giáo, cô giáo khoa Điện tử Viễn thông giảng dạy, giúp đỡ em hồn thành chương trình ðào tạo Sinh viên thực Lê Anh Tuấn ii TÓM TẮT Đồ án vào tìm hiểu trình giao tiếp giữa máy tính với nhau, cách thức truyền tải đoạn text, hình ảnh hay file dữ liệu giữa chúng cùng mạng LAN Qua phần xây dựng cshương trình chat mà đáp ứng số yêu cầu tối thiểu người sử dụng Trong đồ án trình bày ngơn ngữ lập trình c#, lập trình mạng ngơn ngữ c# phần mềm visual studio ABSRACT The project goes to learn the process of communicating between computers to each other, hows to convey a snippet of text, an image or a data file between them in the same LAN That may be partly built a char program that meets some minimum requirements of users In this thesis also presents the basics of programing languages c#, network programming in languages c# and visual studio software iii DANH MỤC BẢNG BIỂU Bảng 2.1 Bảng hàm thành phần 54 Bảng 2.2 Bảng tham số 56 Bảng 2.3 Bảng trạng thái thread 60 iv DANH MỤC CÁC HÌNH VẼ, ĐỒ THỊ Hình 1.1 Mơ hình OSI Hình 1.2 Mơ hình TCP/IP Hình 1.3 Mơ hình truyền thơng đơn giản tầng Hình 1.4 Trao đổi giữa tầng Hình 1.5 Các tiến trình mơ hình FTP 12 Hình 1.5 Tiến trình làm việc dạng chủ động FTP 15 Hình 1.6 Tiến trình làm việc dạng bị động FTP 16 Hình 1.8 Kết nối hình 22 Hình Kết nối kiểu bus 22 Hình 1.10 Cáp UTP .23 Hình 1.11 Thiết bị Hub 24 Hình 1.12 Thiết bị Switch 25 Hình 1.13 Thiết bị Router 26 Hình 1.14 Cấu hình mạng LAN 27 Hình 1.15 Các giao thức lập trình Socket 32 Hình 1.16 Dạng thức gói tin UDP 35 Hình 2.1 Giao diện visual studio 2013 62 Hình 2.2 Giao diện tạo form 62 Hình 2.3 Giao diện viết code 62 Hình 3.1 Quá trình kết nối 64 Hình 3.2 Quy trình kết nối 66 Hình 3.3 Tạo server 66 Hình 3.4 Hàm lấy địa IP Server 67 Hình 3.5 IP server 67 Hình 3.6 Hàm khởi tạo socket 68 Hình 3.7 Textbox hiển thị giao diện 68 Hình 3.8 Hàm AcceptCallback 69 Hình 3.9 Hàm startsocket 69 Hình 3.10 Thơng báo Client gửi file 70 v Hình 3.11 Hàm xử lý dữ liệu gửi 71 Hình 3.12 Hàm đóng kết nối Server 71 Hình 3.13 Hàm đóng Socket Sever 72 Hình 3.14 Thơng báo hiển thị lên Client sau Server ngắt kết nối 72 Hình 3.15 Hàm ConnectoServer 73 Hình 3.16 Dao diện Server 74 Hình 3.17 Giao diện Client 74 Hình 3.18 Giao diện tương tác giữa Server Client 74 Hình 3.19 Gửi file powerpoint 75 Hình 3.20 Xem file nhận 75 Hình 3.21 File nhận 75 vi " is not supportedby this control."); } this.rtbMsg.ReadOnly = true; } privatevoidsendImageToolStripMenuItem_Click(object sender, EventArgs e) { SelectImageToSend(); } privatevoidSelectFileToSend() { OpenFileDialog res = newOpenFileDialog(); res.Filter = "All Files|*.*"; if (res.ShowDialog() == DialogResult.OK) { if (!CheckFileSize(res.FileName)) return; AppendText("#SERVER", "Gửi file: " + System.IO.Path.GetFileName(res.FileName)); DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); byte[] byteDATA = System.IO.File.ReadAllBytes(res.FileName); msg.CreateBINARY_DATA("#SERVER", System.IO.Path.GetFileName(res.FileName), byteDATA); _frmMainServer.SendMsgToAllClient(msg); } } privatevoidsendFileToolStripMenuItem_Click(object sender, EventArgs e) { SelectFileToSend(); } privatevoidcloseToolStripMenuItem_Click(object sender, EventArgs e) { 82 this.Hide(); } privatevoidtxtMsg_KeyDown(object sender, KeyEventArgs e) { stringstrText = txtMsg.Text.Trim(); if (strText != ""&&e.KeyCode == Keys.Return) { AppendText("#ME", strText); DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); msg.CreateTEXT_DATA("#SERVER", "TEXT", strText); _frmMainServer.SendMsgToAllClient(msg); txtMsg.Text = ""; } } privatevoidshowDownloadFilesToolStripMenuItem_Click(object sender, EventArgs e) { stringstrDir = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.Exec utablePath); strDir += "\\Download"; if (!System.IO.Directory.Exists(strDir)) { System.IO.Directory.CreateDirectory(strDir); } System.Diagnostics.Process.Start(strDir); } privatevoidfrmChatServer_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); 83 e.Cancel = true; } publicvoidSetEnableChat(boolblnEnable) { this.txtMsg.Enabled = blnEnable; } publicboolCheckFileSize(stringstrFileName) { System.IO.FileInfofInfo = newSystem.IO.FileInfo(strFileName); if (fInfo.Length>= 1024 * 1024 * ) { MessageBox.Show("Dung lượng file giớihạn< 5MB"); returnfalse; } returntrue; } } } ServerHelper using System; usingSystem.Collections.Generic; usingSystem.Text; using System.Net; usingSystem.Windows.Forms; usingSystem.Net.Sockets; usingSystem.Threading; usingMessageClassLibrary; namespaceChatServer { classServerHelper { 84 publicfrmChatServer _frmChat; constint MAXBUFFER = 1024; privateSocket _sListener; privateSocketPermission _sPermission; List _lstConnection = newList(); publicServerHelper() { } privatedelegatevoidUpdateUI_InvokeDelegate(stringstrMsg); privatevoidvoidUpdateUI_InvokeDelegate(stringstrMsg) { _frmChat.AppendText("#SERVER", strMsg); } publicboolStartListen(stringstrIpAddress, intintPort) { try { _sPermission = newSocketPermission(NetworkAccess.Accept, TransportType.Tcp, "", SocketPermission.AllPorts); _sListener = null; _sPermission.Demand(); _sListener = newSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _sListener.Bind(newIPEndPoint(IPAddress.Parse(strIpAddress), intPort)); _sListener.Listen(10); AsyncCallbackaCallback = newAsyncCallback(AcceptCallback); _sListener.BeginAccept(aCallback, _sListener); stringstrMsg = "Khởiđộng SERVER vàolúc: " + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss"); 85 _frmChat.BeginInvoke(newUpdateUI_InvokeDelegate(voidUpdateUI_Invoke Delegate), strMsg); returntrue; } catch (Exception ex) { MessageBox.Show("StartListen Error: " + ex.Message); returnfalse; } } privatevoidAcceptCallback(IAsyncResultar) { Socket listener = null; Socket handler = null; try { listener = (Socket)ar.AsyncState; handler = listener.EndAccept(ar); handler.NoDelay = false; ConnectionHelpernewConnection = newConnectionHelper(handler, _frmChat); if(newConnection.StartSocket()) { _lstConnection.Add(newConnection); } IPEndPointremoteIpEndPoint = handler.RemoteEndPointasIPEndPoint; stringstrMsg = "KếtnốimớitừIp: " + remoteIpEndPoint.Address + ", Port: " + remoteIpEndPoint.Port; 86 _frmChat.BeginInvoke(newUpdateUI_InvokeDelegate(voidUpdateUI_Invoke Delegate), strMsg); AsyncCallbackaCallback = newAsyncCallback(AcceptCallback); listener.BeginAccept(aCallback, listener); } catch (Exception) { } } publicvoidStopListen() { try { _sListener.Close(); _sListener = null; for (int i = 0; _lstConnection.Count> 0;) { DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); msg.CreateTEXT_DATA("#SERVER", "TEXT", ""); _lstConnection[i].SendMsg(msg.GetBytesData()); while (_lstConnection[i]._blnIsSending) { Thread.Sleep(200); } _lstConnection[i].StopSocket(); _lstConnection.RemoveAt(i); } 87 stringstrMsg = "Đóng SERVER vàolúc: " + DateTime.Now.ToString("yyyy/MM/ddhh:mm:ss"); _frmChat.BeginInvoke(newUpdateUI_InvokeDelegate(voidUpdateUI_Invoke Delegate), strMsg); } catch (Exception ex) { MessageBox.Show("StopListen Error: " + ex.Message); } } publicListGetServerAddress() { ListlstIpAddress = newList(); try { IPHostEntry host; host = Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddressipinhost.AddressList) { if (ip.AddressFamily == AddressFamily.InterNetwork) { lstIpAddress.Add(ip.ToString()); } } } catch (Exception ex) { MessageBox.Show("GetServerAddress Error: " + ex.Message); } returnlstIpAddress; } 88 publicvoidSendMsgToAllClient(byte[] byteDATA ) { for (int i = 0; i < _lstConnection.Count; i++) { _lstConnection[i].SendMsg(byteDATA); } } publicvoidSendMsgToAllClientAnother(stringstrIpAddres, byte[] byteDATA) { for (int i = 0; i < _lstConnection.Count; i++) { if (_lstConnection[i]._strClientIp != strIpAddres) _lstConnection[i].SendMsg(byteDATA); } } publicvoidDisconnectFromClient(stringstrIpAddres, byte[] byteDATA) { int j = -1; for (int i = 0; i < _lstConnection.Count; i++) { if (_lstConnection[i]._strClientIp != strIpAddres) _lstConnection[i].SendMsg(byteDATA); else { j = i; } } if(j != -1) { _lstConnection[j].StopSocket(); _lstConnection.RemoveAt(j); 89 } } } } Client using System; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Text; usingSystem.Windows.Forms; namespaceChatClient { publicpartialclassfrmChatClient :Form { int _intX = 0; int _intY = 0; publicfrmMainClient _frmMainClient; publicfrmChatClient() { InitializeComponent(); } publicvoidMoveLocation(intintX, intintY) { _intX = intX; _intY = intY; this.Location = newPoint(_intX, _intY); } privatevoidfrmChatClient_Load(object sender, EventArgs e) { 90 this.Location = newPoint(_intX, _intY); } publicvoidAppendText(stringstrFrom, stringstrText) { int start = this.rtbMsg.TextLength; this.rtbMsg.AppendText(strFrom); int end = this.rtbMsg.TextLength; this.rtbMsg.Select(start, end - start); { if(strFrom == "#SERVER") this.rtbMsg.SelectionColor = Color.Red; elseif(strFrom == "#ME") this.rtbMsg.SelectionColor = Color.Yellow; else this.rtbMsg.SelectionColor = Color.Blue; } this.rtbMsg.SelectionFont = newFont("Microsoft Sans Serif", 9, FontStyle.Underline); this.rtbMsg.SelectionLength = 0; stringstrContent = ": " + strText + "\n"; start = this.rtbMsg.TextLength; this.rtbMsg.AppendText(strContent); end = this.rtbMsg.TextLength; this.rtbMsg.Select(start, end - start); this.rtbMsg.SelectionColor = Color.Black; this.rtbMsg.SelectionFont = newFont("Microsoft Sans Serif", 9, FontStyle.Regular); this.rtbMsg.SelectionLength = 0; this.rtbMsg.Select(this.rtbMsg.Text.Length - 1, 0); this.rtbMsg.ScrollToCaret(); } 91 publicvoidAppendImage(stringstrFrom, byte[] byteImage) { BitmapmyBitmap = BINARY_CONVERT.BytesToBitmap(byteImage); Clipboard.SetDataObject(myBitmap); DataFormats.FormatmyFormat = DataFormats.GetFormat(DataFormats.Bitmap); this.rtbMsg.ReadOnly = false; if (this.rtbMsg.CanPaste(myFormat)) { AppendText(strFrom, ""); this.rtbMsg.Paste(myFormat); } else { MessageBox.Show("The data format that you attempted site" + " is not supportedby this control."); } this.rtbMsg.ReadOnly = true; } publicvoidAppendFileDownload(stringstrFrom, stringstrFileName, byte[] byteFileData) { stringstrDir = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.Exec utablePath); strDir += "\\Download"; if (!System.IO.Directory.Exists(strDir)) { System.IO.Directory.CreateDirectory(strDir); 92 } System.IO.File.WriteAllBytes(strDir + "\\" + strFileName, byteFileData); AppendText("#FILE", " Đãnhận file: " + strFileName + " từ " + strFrom + "\nVào menu CHAT -> Show Download Files đểxem!!!"); } privatevoidSelectImageToSend() { OpenFileDialog res = newOpenFileDialog(); res.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.gif;*.tif; "; if (res.ShowDialog() == DialogResult.OK) { if (!CheckFileSize(res.FileName)) return; InsertImage(res.FileName); } } publicvoidInsertImage(stringstrFileName) { BitmapmyBitmap = newBitmap(strFileName); Clipboard.SetDataObject(myBitmap); DataFormats.FormatmyFormat = DataFormats.GetFormat (DataFormats.Bitmap); this.rtbMsg.ReadOnly = false; if(this.rtbMsg.CanPaste(myFormat)) { AppendText("#ME", ""); this.rtbMsg.Paste(myFormat); DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); byte[] byteDATA = System.IO.File.ReadAllBytes(strFileName); msg.CreateBINARY_DATA("#CLIENT", "IMAGE", byteDATA); _frmMainClient.SendMsgToServer(msg); } else { 93 MessageBox.Show("The data format that you attempted site" + " is not supportedby this control."); } this.rtbMsg.ReadOnly = true; } privatevoidsendImageToolStripMenuItem_Click(object sender, EventArgs e) { SelectImageToSend(); } privatevoidSelectFileToSend() { OpenFileDialog res = newOpenFileDialog(); res.Filter = "All Files|*.*"; if (res.ShowDialog() == DialogResult.OK) { if (!CheckFileSize(res.FileName)) return; AppendText("#ME", "Gửi file: " + System.IO.Path.GetFileName(res.FileName)); DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); byte[] byteDATA = System.IO.File.ReadAllBytes(res.FileName); msg.CreateBINARY_DATA("#CLIENT", System.IO.Path.GetFileName(res.FileName), byteDATA); _frmMainClient.SendMsgToServer(msg); } } privatevoidsendFileToolStripMenuItem_Click(object sender, EventArgs e) { SelectFileToSend(); } privatevoidcloseToolStripMenuItem_Click(object sender, EventArgs e) { 94 this.Hide(); } privatevoidtxtMsg_KeyDown(object sender, KeyEventArgs e) { stringstrText = txtMsg.Text.Trim(); if (strText != ""&&e.KeyCode == Keys.Return) { AppendText("#ME", strText); DEFINE_MSG_DATAmsg = newDEFINE_MSG_DATA(); msg.CreateTEXT_DATA("#CLIENT", "TEXT", strText); _frmMainClient.SendMsgToServer(msg); txtMsg.Text = ""; } } privatevoidshowDownloadToolStripMenuItem_Click(object sender, EventArgs e) { stringstrDir = System.IO.Path.GetDirectoryName(System.Windows.Forms.Application.Exec utablePath); strDir += "\\Download"; if (!System.IO.Directory.Exists(strDir)) { System.IO.Directory.CreateDirectory(strDir); } System.Diagnostics.Process.Start(strDir); } privatevoidfrmChatClient_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); 95 e.Cancel = true; } publicvoidSetEnableChat(boolblnEnable) { this.txtMsg.Enabled = blnEnable; } publicvoidDisconnectFromServer() { _frmMainClient.Disconnect(); } publicboolCheckFileSize(stringstrFileName) { System.IO.FileInfofInfo = newSystem.IO.FileInfo(strFileName); if (fInfo.Length>= 1024 * 1024 * 5) { MessageBox.Show("Dung lượng file giớihạn< 5MB"); returnfalse; } returntrue; } } } 96 ... cho việc lập trình Chương 3: Xây dựng thiết kế chương trình Trong chương này, ta xây dựng giao diện chương trình, xây dựng hàm hồn thiện chương trình Khác phục số lỗi định mắc phải trình làm Do... mạng LAN; Tìm hiểu tổng quan lập trình mạng, sau vào phần lập trình socket giao thức TCP/IP; Tìm hiểu ngơn ngữ lập trình C#, Lập trình socket C# Với đề tài ? ?Sử dụng lập trình socket - Xây dựng. .. chương trìnhchat LAN? ?? mong giúp người hiểu hơn, nắm vững kiến thức IP, TCP, Socket đặc biệt ứng dụng chattrong mạng LAN, mà em trình bày đề tài Nội dung đề tài gồm Chương 1: Tổng quan lập trình