日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 网络编程之使用Socket类Send、Receive方法的同步通讯

發布時間:2024/5/28 C# 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 网络编程之使用Socket类Send、Receive方法的同步通讯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? 經過幾天學習,終于解決了再C#網絡編程中使用Socket類Send和Receive方法開發的客戶端和服務端的同步通訊程序;實現了又客戶端想服務器發送消息的界面程序.主要使用的方法是:
? ? ? 1.Socket套接字編程的知識,通過IPAddress定義一個IP地址,IPEndPoint定義一個主機,Socket實例套接字對象sock和線程Thread的的成員變量;
? ? ? 2.再調用方法bind綁定端口、listen監聽端口、accept接受連接請求、connect請求連接來連接客戶端和服務器;
? ? ? 3.建立連接后通過Send和Receive方法通過線程循環接受連接請求中發送的消息,實現通信并顯示在相應的控件中;
? ? ? 4.最后調用socket的close和shutdown方法關閉套接字,停止連接監聽.
? ? ? 下面是程序運行后的結果:
? ? ? (服務端接受客戶端發送的消息:這是一個單方的通信,但實現雙方的方法相同,因為服務端的"歡飲使用本服務器"也反饋顯示在了客戶端)

? ? ? (客戶端)

? ? ? 下面是本程序的源代碼:

? ? ? 服務端

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;//添加新的命名空間 using System.Net; using System.Net.Sockets; using System.Threading;namespace tbServer {public partial class Form1 : Form{public Form1(){InitializeComponent();}//添加私有成員private IPAddress myIP = IPAddress.Parse("127.0.0.1"); //定義IP對象private IPEndPoint MyServer; //定義主機private Socket sock; //套接字對象實例private bool sign = true; //控制循環private Thread thread; //創建控制線程private Socket socklin; //臨時套接字,接受客戶端連接請求//雙擊"開始監聽"按鈕添加Click事件private void button1_Click(object sender, EventArgs e){try {myIP = IPAddress.Parse(textBox1.Text); //字符串轉換為IP}catch {MessageBox.Show("你輸入的IP地址格式錯誤!");}try {//定義主機MyServer = new IPEndPoint(myIP, Int32.Parse(textBox2.Text));//構造套接字sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//綁定端口sock.Bind(MyServer);//開始監聽sock.Listen(10);//狀態欄信息添加 textBox3替代statusStrip1(不會用)textBox3.Text = "主機" + textBox1.Text + " 端口" + textBox2.Text + " 開始監聽";//構造線程thread = new Thread(new ThreadStart(targett)); //targett自定義函數:接受客戶端連接請求//啟動線程用于接受連接和接受數據thread.Start();}catch(Exception msg) {textBox3.Text = msg.Message;}}//targett():自定義函數,該方法循環開始接受客戶端的連接請求private void targett(){socklin = sock.Accept(); //接受連接請求sign = true; //循環標志變量true//連接if (socklin.Connected){textBox3.Text = "與客戶端連接";//信息反饋給客戶端Client Byte[] byteNum = new Byte[64]; //構造字節數組byteNum = System.Text.Encoding.BigEndianUnicode.GetBytes("歡飲使用本服務器".ToCharArray());socklin.Send(byteNum,byteNum.Length,0); //發送數據//sign為true 循環接受數據while (sign){Byte[] byteNum2 = new Byte[128];socklin.Receive(byteNum2,byteNum2.Length,0); //接受數據string str = System.Text.Encoding.BigEndianUnicode.GetString(byteNum2);richTextBox1.AppendText(str+"\r\n"); //顯示字符串//獲取richTextBox1行數int length = richTextBox1.Lines.Length; //如果客戶端發送倒數第二行的字符串為"@@@" 斷開連接if(richTextBox1.Lines[length-2]=="@@@"){textBox3.Text = "與客戶端斷開連接";//關閉套接字實例(both表示發送和接受關閉)socklin.Shutdown(System.Net.Sockets.SocketShutdown.Both); socklin.Close();sign = false; //設為false退出循環}}}}//雙擊"停止監聽"按鈕添加Click事件private void button2_Click(object sender, EventArgs e){try {sign = false;sock.Close();textBox3.Text = "主機" + textBox1.Text + "端口" + textBox2.Text + "監聽停止";}catch {MessageBox.Show("監聽尚未開始,關閉無效!");}}//載入Form是設置非安全訪問,防止線程無效操作private void Form1_Load(object sender, EventArgs e){//非安全線程訪問,不檢查線程是否安全Control.CheckForIllegalCrossThreadCalls = false; }} }

? ? ? 客戶端

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;//添加新的命名空間 using System.Net; using System.Net.Sockets; using System.Threading;namespace tbClient {public partial class Form1 : Form{public Form1(){InitializeComponent();}//添加私有成員private IPAddress myIP = IPAddress.Parse("127.0.0.1"); //定義IP對象private IPEndPoint MyServer; //定義主機private Socket sock; //套接字對象實例private Thread thread; //創建控制線程//雙擊"請求連接"按鈕添加Click事件private void button1_Click(object sender, EventArgs e){try {myIP = IPAddress.Parse(textBox1.Text); //字符串轉換為IP}catch {MessageBox.Show("你輸入的IP地址格式錯誤!");}try {//構造主機MyServer = new IPEndPoint(myIP, Int32.Parse(textBox2.Text));//構造套接字sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//請求連接sock.Connect(MyServer);//構造線程thread = new Thread(new ThreadStart(targett)); //targett自定義函數:接受客戶端連接請求//啟動線程用于接受連接和接受數據thread.Start();//輸出信息textBox4.Text = "與主機" + textBox1.Text + " 端口" + textBox2.Text + " 連接成功";}catch(Exception msg) {MessageBox.Show(msg.Message);}}//targett():自定義函數,該方法循環開始接受客戶端的連接請求private void targett(){//構造字節數組Byte[] byteNum = new Byte[64]; //接受數據 sock.Receive(byteNum, byteNum.Length, 0); //將字符數組轉換為字符串string str = System.Text.Encoding.BigEndianUnicode.GetString(byteNum);textBox3.Text = str;}//雙擊"發送消息"按鈕添加Click事件private void button2_Click(object sender, EventArgs e){//構造字節數組Byte[] byteNum = new Byte[64]; //發送內容string send = richTextBox1.Text + "\r\n";//將字符串轉換為字節數組byteNum = System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());//發送數據sock.Send(byteNum,byteNum.Length,0);//構造線程Thread threadSend = new Thread(new ThreadStart(targett));//啟動線程接受數據threadSend.Start();}//雙擊"關閉連接"按鈕添加Click事件private void button3_Click(object sender, EventArgs e){Byte[] byteNum = new Byte[64];string send = "@@@" + "\r\n";byteNum = System.Text.Encoding.BigEndianUnicode.GetBytes(send.ToCharArray());sock.Send(byteNum, byteNum.Length, 0); //將"@@@"發送給服務器try {sock.Close();textBox4.Text="主機" + textBox1.Text + "端口" + textBox2.Text + "斷開連接";}catch {MessageBox.Show("連接尚未建立,斷開無效!");}}//載入Form是設置非安全訪問,防止線程無效操作private void Form1_Load(object sender, EventArgs e){//非安全線程訪問,不檢查線程是否安全Control.CheckForIllegalCrossThreadCalls = false; }} }

? ? ? 該程序中我遇到的幾個主要問題及解決方法如下:

? ? ? 1.程序初期總是很卡,出現多次未響應情況?
? ? ? 因為socket的Accept()函數是阻塞模式,它的執行會造成程序的阻塞,應該把它放置到線程中執行,否則會阻塞當前線程,出現卡死狀態不響應消息,后續代碼也不會執行,所以需要把accept放到創建的線程thread中,放入targett()函數中的“socklin = sock.accept()”即可實現;

? ? ? 2.在定義的socket對象實例中sock與socklin(臨時接受客戶端連接請求)中混淆?
? ? ? socklin = sock.accept,它就是客戶端發送連接的請求,因此在判斷連接時是if(socklin.Connected),同時使用socklin的send和receive方法發送和接受數據;

? ? ? 3.總是出現“線程間操作無效:從不是創建控件的線程訪問它”的錯誤?
? ? ? 因為windows窗體控件不是線程安全的,如果幾個線程操作某一控件的狀態,可能會使該控件的狀態不一致,出現爭用或死鎖狀態.我采用的解決方法是添加Form的載入load事件,在load時將CheckForIllegalCrossThreadCalls 屬性的值設置為 false .這樣進行非安全線程訪問時,運行環境就不去檢驗它是否是線程安全的.這是來自與該博客,詳細情況見:http://blog.csdn.net/wangchao0605/article/details/5010864

? ? ? 總結:
? ? ? 最后經過一星期的學習與查閱資料,還是把這個程序弄出來了,也學到了很多東西,同時感謝上面的博主和一些書籍.希望這篇文章對大家有用,有錯或不足之處見諒!
? ? ? (BY:Eastmount 2013-7-22 ?http://blog.csdn.net/eastmount/)

總結

以上是生活随笔為你收集整理的C# 网络编程之使用Socket类Send、Receive方法的同步通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人人干人人澡 | 亚洲aaaaaa| 少妇精品一区二区三区 | 一区二区三区精品国产 | 成色网| 在线黄色免费网站 | 国产嫩草影视 | 性色福利 | 91在线观看网站 | 日本不卡一区二区 | 亚洲一二三四区 | 成人免费一级视频 | 日日摸日日添日日碰9学生露脸 | 午夜影剧院 | 国产伦理一区二区三区 | 国产chinese中国hdxxxx | 国产玖玖视频 | 国产伦精品一区二区三区千人斩 | 学生调教贱奴丨vk | cao国产| 亚洲精品小视频在线观看 | 黄色大片91 | 97视频一区二区 | 91偷拍精品一区二区三区 | 午夜香蕉网 | 青青青手机在线视频 | 又色又爽又黄无遮挡的免费视频 | 91午夜精品亚洲一区二区三区 | 日韩中文字幕一区二区三区四区 | av解说在线观看 | 日本中文字幕视频在线 | いいなり北条麻妃av101 | 亚洲免费在线观看av | 午夜久久| 久久久久人妻一区 | 人人草人人搞 | 日剧网| 国产丝袜视频在线观看 | 少妇被躁爽到高潮无码人狍大战 | 色图一区 | 国产精品videossex国产高清 | 午夜久久福利 | 色小说在线观看 | 日韩精品视频在线观看免费 | 欧美色图激情 | 久久精品丝袜高跟鞋 | 亚洲第99页 | 国产日批| 在线观看污网站 | 国产思思 | 国产裸体舞一区二区三区 | 人人看人人射 | 日本成人午夜 | 亚洲午夜在线播放 | 操你啦在线视频 | www.亚洲精品| 京香julia在线观看 | 国产中文字幕精品 | 日韩中文字幕av | 中文字幕在线视频不卡 | 亚洲精品网站在线 | 91色拍| 国产精品伦一区二区三级古装电影 | 欧美性视频一区二区三区 | 精品国产鲁一鲁一区二区三区 | 婷婷丁香激情五月 | 和漂亮岳做爰3中文字幕 | 午夜丰满寂寞少妇精品 | 成人在线观看网 | 欧美日韩亚洲国产 | 日本h片在线观看 | 性——交——性——乱免费的 | 欧美青青草 | 这里只有久久精品 | 成人天堂网 | 电影《两个尼姑》免费播放 | 丁香七月婷婷 | 亚洲av无一区二区三区久久 | 午夜影院日本 | 久热一区| 亚洲黄色小说网 | 国产大片aaa | 91成人在线播放 | 欧美一区二区在线免费观看 | 伊久久| 久久久看 | 成人高潮片免费网站 | 男生插女生视频在线观看 | 久久亚洲精精品中文字幕早川悠里 | 久伊人网| 中文字幕88| 亚洲免费视 | 黄色一级片在线看 | free性满足hd国产精品久 | 丨国产丨调教丨91丨 | 1515hh成人免费看 | 11一12免费毛片 | 少妇av导航 | 成人hd |