C# 網絡編程之Tcp實現客戶端和服務器聊天
最近使用Socket網絡套接字編程中,在同步與異步通訊中客戶端與服務器總是無法響應,但在學習Tcp協議編程中完成了通訊聊天功能,下麵簡單講講我最近學到的及Tcp聊天的源代碼及詳細注釋。
Tcp協議是一個傳輸層的協議,在Tcp協議編程中它通常使用的是3個類,其命名空間為System.Net.Sockets:
1.TcpListener:基於TCP協議服務端開發,監聽IP地址和端口號是否連接。
該類常用的方法有Start()開始監聽、AcceptSocket()返回套接字接受連接請求、AcceptTcpClient()返回客戶對象接受連接請求、Stop()停止監聽
2.TcpClient:基於TCP協議客戶端編程,提供客戶端連接,通過網絡連接發送接受數據。
該類常用的方法有Connect()與服務器主機連接、GetStream()用來獲得答應的數據流、Close()關閉連接
3.NetWorkStream:用於獲取和操作網絡流,該程序中還是用寫入流和讀取流對象實現寫入和讀取數據的操作。
該類常用的方法有Read()從網絡流中讀取數據、Write()從網絡流中寫數據。
下麵是這個例子的源代碼:(該代碼是根據自己所學及《C#範例開發大全》中一個例子改變而來通過兩個控製台程序實現通話)
1.服務端代碼(TCPServer)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //添加新的命名空間 using System.Net; using System.Net.Sockets; using System.IO; //流StreamReader namespace TCPServer { class Program { static void Main(string[] args) { //Parse將字符串轉換為IP地址類型 IPAddress myIP = IPAddress.Parse("127.0.0.1"); //構造一個TcpListener(IP地址,端口)對象,TCP服務端 TcpListener myServer = new TcpListener(myIP,6688); //開始監聽 myServer.Start(); Console.WriteLine("等候一個連接..."); //構造TCP客戶端:接受連接請求 TcpClient client = myServer.AcceptTcpClient(); Console.WriteLine("客戶端已經連接..."); //構造NetworkStream類,該類用於獲取和操作網絡流 NetworkStream stream = client.GetStream(); //讀數據流對象 StreamReader sr = new StreamReader(stream); //寫數據流對象 StreamWriter sw = new StreamWriter(stream); while (true) { Console.WriteLine("客戶端:" + sr.ReadLine()); string msg = Console.ReadLine(); sw.WriteLine(msg); sw.Flush(); //刷新流 } client.Close(); //關閉客戶端 } } }
2.客戶端代碼(TCPClient)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //添加新的命名空間 using System.Net; using System.Net.Sockets; using System.IO; //流StreamReader namespace TCPClient { class Program { static void Main(string[] args) { //Parse將字符串轉換為IP地址類型 IPAddress myIP = IPAddress.Parse("127.0.0.1"); //構造一個TcpClient類對象,TCP客戶端 TcpClient client = new TcpClient(); //與TCP服務器連接 client.Connect(myIP, 6688); Console.WriteLine("服務器已經連接...請輸入對話內容..."); //創建網絡流,獲取數據流 NetworkStream stream = client.GetStream(); //讀數據流對象 StreamReader sr = new StreamReader(stream); //寫數據流對象 StreamWriter sw = new StreamWriter(stream); while (true) { string msg = Console.ReadLine(); sw.WriteLine(msg); sw.Flush(); //刷新流 Console.WriteLine("服務器:" + sr.ReadLine()); } client.Close(); Console.Read(); } } }
3.程序演示
先運行服務器(TCPServer)代碼,它會顯示“等候一個連接...”.再運行客戶端(TCPClient)代碼,運行後此時服務端顯示"客戶端已連接...",客戶端顯示"服務器已連接...請輸入對話內容".然後依次在客戶端和服務器中個輸入聊天內容,在另一方會顯示相應傳輸過來的內容,實現TCP聊天通話。下麵是在客戶端輸入"你好!我是客戶端."的反應。
更多的通話內容如下所示:
總結:這是自己認為寫得比較好的一篇文章,它比較實用,更重要的是我編寫上麵的代碼能運行。我們隻需要稍微的界麵設計就能實現一個有界麵的網絡聊天室.它涉及到的知識主要是C#網絡編程中的TCP編程知識,最近寫Socket套接字方麵的通訊總是失敗,也看了很多博客下載了很多程序,但都沒一個比較滿意的。希望上麵的文章能幫組到大家,有錯誤不足之處見諒!
最後感謝劉麗霞的《C#範例開發大全》和周存傑的《C#網絡編程實例教程》兩本書,上麵的知識點和代碼都是借鑒了他們前人的知識,希望大家也看看這兩本比較好的C#書。
(By:Eastmount 2013-7-20 https://blog.csdn.net/eastmount/)
最後更新:2017-04-03 16:48:36
上一篇:
Android 動態logo bootanimation.zip 製作
下一篇:
oracle數據庫同步技術
全球投資者聚焦阿裏巴巴新零售:天貓力量定義商業未來
struts2改springmvc過程中問題及解決辦法記錄
PostgreSQL 10.0 preview 功能增強 - CLOG oldest XID跟蹤
王堅:雲計算之後,我為什麼要做城市大腦?| 幹貨
Android計量單位px,in,mm,pt,dp,dip,sp和獲取屏幕尺寸與密度
未來安防人工智能發展最大瓶頸:人才缺口
【Android開發】采用GET方法進行網絡傳值
Sql Server統計表中某年某月某個值有多少?
PostgreSQL 10.0 preview 性能增強 - 支持64bit atomic
Centos7下配置安裝mysql5.5主從複製(一主兩從)