1. 程式人生 > >C# UDP 網路聊天程式

C# UDP 網路聊天程式

   學習了UDP協議的使用以及TCP協議的對比,各有各的優勢!

個人理解優勢區別如下:

1:UDP協議稱為不可靠的傳輸協議,因為在從傳送方接收方的傳遞過程中出現的資料丟失,協議本身並不能做出任何檢測或者提示。

2:UDP速度比TCP快,因為UDP不需要先與對方建立連線,也不需要連線確認,因此速度要快的多。

理解下使用情景:

並不是說一個程式用UDP就用UDP 用TCP就用TCP,比如說QQ聊天,我們要開視訊,語音,傳送檔案,文字。

其中開視訊,語音就可以用UDP協議去做,文字也可以用UDP協議去做。而傳送檔案就用TCP去做啦,因為傳送檔案比較大的話 中途資料丟失,造成檔案的完整性。。也會導致出問題。。而視訊,線上電影這些就無所謂了,丟一點點也是看不出來的。

-------------------------------------------------分割線---------------------------------------

該程式測試了局域網,外網。

下面也說下連線區域網和外網的方式:

區域網:直接在軟體上指向目標機的內網IP地址即可(如:192.168.1.223)

外網:指向目標機的外網IP地址,並且本機與目標機的路由器務必對映埠8889(可自行在原始碼裡更改)

以下是截圖與完整程式碼:

截圖:

完整程式碼:

引入名稱空間:

using System.Net;
using System.Net.Sockets;
using System.Threading;

程式碼:

namespace UdpChatExample
{
    public partial class FormChat : Form
    {
        /// <summary>接收用</summary>
        private UdpClient receiveUdpClient;
        /// <summary>傳送用</summary>
        private UdpClient sendUdpClient;
        /// <summary>和本機繫結的埠號</summary>
        private const int port = 18001;
        /// <summary>本機IP</summary>
        IPAddress ip;
        /// <summary>遠端主機IP</summary>
        IPAddress remoteIp;
        public FormChat()
        {
            InitializeComponent();
            //獲取本機可用IP地址
            IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
            ip = ips[ips.Length - 1];
            //為了在同一臺機器除錯,此IP也作為預設遠端IP
            remoteIp = ip;
            textBoxRemoteIP.Text = remoteIp.ToString();
            textBoxSend.Text = "你好!";
        }
        private void FormChat_Load(object sender, EventArgs e)
        {
            //建立一個執行緒接收遠端主機發來的資訊
            Thread myThread = new Thread(ReceiveData);
            //將執行緒設為後臺執行
            myThread.IsBackground = true;
            myThread.Start();
            textBoxSend.Focus();
        }
        private void ReceiveData()
        {
            IPEndPoint local = new IPEndPoint(ip, port);
            receiveUdpClient = new UdpClient(local);
            IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
            while (true)
            {
                try
                {
                    //關閉udpClient時此句會產生異常
                    byte[] receiveBytes = receiveUdpClient.Receive(ref remote);
                    string receiveMessage = Encoding.Unicode.GetString(
                        receiveBytes, 0, receiveBytes.Length);
                    AddItem(listBoxReceive, string.Format("來自{0}:{1}", remote, receiveMessage));
                }
                catch
                {
                    break;
                }
            }
        }
        private void buttonSend_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(SendMessage);
            t.IsBackground = true;
            t.Start(textBoxSend.Text);
        }
        /// <summary>傳送資料到遠端主機</summary>
        private void SendMessage(object obj)
        {
            string message = (string)obj;
            sendUdpClient = new UdpClient(0);
            byte[] bytes = System.Text.Encoding.Unicode.GetBytes(message);
            IPEndPoint iep = new IPEndPoint(remoteIp, port);
            try
            {
                sendUdpClient.Send(bytes, bytes.Length, iep);
                AddItem(listBoxStatus, string.Format("向{0}傳送:{1}", iep, message));
                ClearTextBox();
            }
            catch (Exception ex)
            {
                AddItem(listBoxStatus, "傳送出錯:" + ex.Message);
            }
        }
        delegate void AddListBoxItemDelegate(ListBox listbox, string text);
        private void AddItem(ListBox listbox, string text)
        {
            if (listbox.InvokeRequired)
            {
                AddListBoxItemDelegate d = AddItem;
                listbox.Invoke(d, new object[] { listbox, text });
            }
            else
            {
                listbox.Items.Add(text);
                listbox.SelectedIndex = listbox.Items.Count - 1;
                listbox.ClearSelected();
            }
        }
        delegate void ClearTextBoxDelegate();
        private void ClearTextBox()
        {
            if (textBoxSend.InvokeRequired)
            {
                ClearTextBoxDelegate d = ClearTextBox;
                textBoxSend.Invoke(d);
            }
            else
            {
                textBoxSend.Clear();
                textBoxSend.Focus();
            }
        }
    }
}

如果編譯有問題的朋友,可以到下面地址下載我上傳的資原始檔,謝謝。

下載地址:http://download.csdn.net/source/3504525

相關推薦

C# UDP 網路聊天程式

   學習了UDP協議的使用以及TCP協議的對比,各有各的優勢! 個人理解優勢區別如下: 1:UDP協議稱為不可靠的傳輸協議,因為在從傳送方到接收方的傳遞過程中出現的資料丟失,協議本身並不能做出任何檢測或者提示。 2:UDP速度比TCP快,因為UDP不需要先與對方建立連線,

基於TCP/UDP網路聊天程式

最近網路結課剛好梳理一下所學的知識。 想要做一個網路聊天的程式,就要先知道需要用到什麼知識和工具。 分享下別人寫的Socket程式設計知識連結  Socket程式設計 基於TCP實現網路聊天1.0(無圖形化介面): 伺服器端Service: /*伺服器端*/ impor

Java UDP通訊聊天程式

 編寫兩個新的VC程式,完成以下功能:  一個程式為服務端,建立UDP服務端套接字。  另外一個程式為客戶端,建立UDP客戶端套接字。  這兩個新程式可以互聯,完成一個基於TCP/IP網路的文字聊天程式。 因為TCP需要三次握手,所以只能一來一回的實現聊天程式,而UDP可以只負責

Java之UDP傳輸聊天程式小Demo(多執行緒)

ChatDemo.java import java.net.DatagramSocket; public class ChatDemo { public static void main(String[] args) { try {

boost asio非同步讀寫網路聊天程式客戶端 例項詳解

// // chat_server.cpp // ~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boos

VS2010編寫UDP網路通訊程式的問題(借用孫鑫老師《深入VC++》書中程式

一開始安照老師書上寫的程式敲上去後,按照先伺服器端後客戶端的編譯順序,編譯結果總是“燙燙燙”,網上查找了“燙燙燙”的原因,因為在這本書上面有個不好的程式設計習慣,他沒有把陣列初始化,所以每次輸出的是不確定值“燙燙燙”。然後除錯的過程中 發現是函式recvfrom函式的問題

基於多程序的網路聊天程式

參考:linux高效能伺服器程式設計,作者:遊雙 程式簡介:該程式用了共享記憶體來實現程序間的同步,由於只是同時讀取共享記憶體,所以沒有用到鎖。該程式的功能是伺服器監聽網路連線,當有一個客戶端連線時,伺服器建立一個子程序處理該連線。每個子程序只負責自己的客戶端以及和父程序通

網路程式設計套接字、網路位元組序及用udp寫客戶端和服務端聊天程式

認識IP地址 IP協議有兩個版本:IPV4和IPV6。 IPV4:IPV4版本的IP地址是4位元組無符號整數。那麼就存在IP地址資源匱乏的時候,這時可以採用兩種方法: DHCP:ip地址動態分配(應用層協議); NAT: 地址替換; 但是這兩種方法只是暫時的有I

linux c 基於UDP的多人聊天程式

client.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #

網路程式設計與多執行緒的應用--基於socket udp編寫一個簡單聊天程式

void CChatDlg::OnBnClickedButtonSend() {// TODO: Add your control notification handler code here//獲取對方IPCIPAddressCtrl* pIPAddress = ((CIPAddressCtrl*)GetD

windows網絡編程-C語言實現簡單的UDP協議聊天

無連接 ipv4地址 ast 電腦 tdi data rcp proto 生生   與TCP協議下編寫服務端程序代碼類似,但因為是無連接的形式,所以不需要監聽。   這次,我用了一點不同的想法:我建立一個服務端,用了兩個端口和兩個套接字,把服務端作為一個數據轉發的中轉站,

JAVA——基於UDP協議的文字聊天程式

基於UDP協議的文字聊天程式 1.要求 使用JAVA完成一個基於TCP協議的文字聊天程式,建立TCP客戶端套接字,分別為服務端和客戶端,並使兩端可以互聯。 2.UDP協議 在UDP協議中,沒有TCP中所謂的伺服器端和客戶端,而是有資料的傳送端和接收端。也就是說UDP

udp網路程式-埠問題

會變的埠號 重新執行多次指令碼,然後在“網路除錯助手”中,看到的現象如下: 說明: 1)每重新執行一次網路程式,上圖中紅圈中的數字,不一樣的原因在於,這個數字標識這個網路程式,當重新執行時,如果沒有確定到底用哪個,系統預設會隨機分配 2)記住一點:這個網路程式在執行的過程中

udp網路程式-傳送資料

創一個udp客戶端程式的流程是簡單,具體步驟如下: 1. 建立客戶端套接字 2. 傳送/接收資料 3. 關閉套接字 程式碼如下: #coding=utf-8 from socket import * #1. 建立套接字 udpSocket = socket(AF_INE

python網路程式設計之udp聊天

import socket def main(): #建立套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp_socket.bind(("192.168.227.129",7567

Python C/S 網路程式設計(一)之 三種方法實現天氣預報小程式

1. 首先明白下協議棧和庫的概念: 協議棧(Protocol Stack): 是指網路中各層協議的總和,其形象的反映了一個網路中檔案傳輸的過程:由上層協議到底層協議,再由底層協議到上層協議。 庫(Library):主要用來解析要使用的網路通訊協議,包含Python內建標準庫

C++開發的UDP網路通訊工具類(相容window和linux)

前段時間做專案用到了網路通訊,自己造了UDP通訊的輪子,能同時在window和linux下執行,並且封裝成類,方便以後使用,考慮到自己也一直在網際網路上獲取資源,現在也把我做的輪子也分享給大家,歡迎參考~ 完整程式碼附在下面,如果大家不想複製,可直接從這下載:https://download

[原始碼和文件分享]基於java語言的C/S模式網路聊天室軟體

一 需求分析 採用C/S模式,基於TCP協議程式設計的方式,使得各個使用者通過伺服器轉發實現聊天的功能 分為三大模組:客戶端模組、伺服器端模組和公共輔助類模組 客戶端模組的主要功能: 登陸功能:使用者可以註冊,然後選擇伺服器登入聊天室

Linux中用socket實現UDP網路程式

這篇部落格的目的是想實現一個簡單的UDP伺服器程式,完成客戶端與伺服器端的通訊。 因為涉及的小知識點比較多,所以本篇部落格的篇幅較長,但是會講的很詳細。 在下一篇部落格裡,我會總結Linux中用socket實現TCP網路程式 1.程式的第一步是建立套接字(so

JAVA——基於TCP/IP網路的文字聊天程式

基於TCP/IP網路的文字聊天程式 1.要求 使用JAVA完成一個基於TCP/IP網路的文字聊天程式,建立TCP客戶端套接字,分別為服務端和客戶端,並使兩端可以互聯。 2.TCP協議 在TCP協議中,有伺服器端(Server端)和客戶端(Client端)的概念