C#.net同步非同步SOCKET通訊和多執行緒總結(5)tcp傳送和接受的程式碼
基於TCP協議的傳送和接收端
TCP協議的接收端
using System.Net.Sockets ; //使用到TcpListen類
using System.Threading ; //使用到執行緒
using System.IO ; //使用到StreamReader類
int port = 8000; //定義偵聽埠號
private Thread thThreadRead; //建立執行緒,用以偵聽埠號,接收資訊
private TcpListener tlTcpListen; //偵聽埠號
private bool blistener = true; //設定標示位,判斷偵聽狀態
private.NetworkStream nsStream; //建立接收的基本資料流
private StreamReader srRead;
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ListBox listBox1; //從網路基礎資料流中讀取資料
private TcpClient tcClient ;
private void Listen ( )
{
try
{
tlTcpListen = new TcpListener ( port ) ; //以8000埠號來初始化TcpListener例項
tlTcpListen.Start ( ) ; //開始監聽
statusBar1.Text = "正在監聽..." ;
tcClient = tlTcpListen.AcceptTcpClient ( ) ; //通過TCP連線請求
nsStream = tcClient.GetStream ( ) ; //獲取用以傳送、接收資料的網路基礎資料流
srRead=new StreamReader(nsStream);//以得到的網路基礎資料流來初始化StreamReader例項
statusBar1.Text = "已經連線!";
while( blistener ) //迴圈偵聽
{
string sMessage = srRead.ReadLine();//從網路基礎資料流中讀取一行資料
if ( sMessage == "STOP" ) //判斷是否為斷開TCP連線控制碼
{
tlTcpListen.Stop(); //關閉偵聽
nsStream.Close(); //釋放資源
srRead.Close();
statusBar1.Text = "連線已經關閉!" ;
thThreadRead.Abort(); //中止執行緒
return;
}
string sTime = DateTime.Now.ToShortTimeString ( ) ; //獲取接收資料時的時間
listBox1.Items.Add ( sTime + " " + sMessage ) ;
}
}
catch ( System.Security.SecurityException )
{
MessageBox.Show ( "偵聽失敗!" , "錯誤" ) ;
}
}
//開始監聽
private void button1_Click(object sender, System.EventArgs e)
{
thThreadRead = new Thread ( new ThreadStart ( Listen ) );
thThreadRead.Start();//啟動執行緒
button1.Enabled=false;
}
// 清理所有正在使用的資源。
protected override void Dispose( bool disposing )
{
try
{
tlTcpListen.Stop(); //關閉偵聽
nsStream.Close();
srRead.Close();//釋放資源
thThreadRead.Abort();//中止執行緒
}
catch{}
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
TCP協議的傳送端
using System.Net.Sockets; //使用到TcpListen類
using System.Threading; //使用到執行緒
using System.IO; //使用到StreamWriter類
using System.Net; //使用IPAddress類、IPHostEntry類等
private StreamWriter swWriter; //用以向網路基礎資料流傳送資料
private.NetworkStream nsStream; //建立傳送資料的網路基礎資料流
private TcpClient tcpClient;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.StatusBar statusBar1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2; //通過它實現向遠端主機提出TCP連線申請
private bool tcpConnect = false; //定義識別符號,用以表示TCP連線是否建立
//連線
private void button1_Click(object sender, System.EventArgs e)
{
IPAddress ipRemote ;
try
{
ipRemote = IPAddress.Parse ( textBox1.Text ) ;
}
catch //判斷給定的IP地址的合法性
{
MessageBox.Show ( "輸入的IP地址不合法!" , "錯誤提示!" ) ;
return ;
}
IPHostEntry ipHost ;
try
{
ipHost = Dns.Resolve ( textBox1.Text ) ;
}
catch //判斷IP地址對應主機是否線上
{
MessageBox.Show ("遠端主機不線上!" , "錯誤提示!" ) ;
return ;
}
string sHostName = ipHost.HostName ;
try
{
TcpClient tcpClient = new TcpClient(sHostName,8000);//對遠端主機的8000埠提出TCP連線申請
nsStream = tcpClient.GetStream();//通過申請,並獲取傳送資料的網路基礎資料流
swWriter = new StreamWriter(nsStream);//使用獲取的網路基礎資料流來初始化StreamWriter例項
button1.Enabled = false ;
button2.Enabled = true ;
tcpConnect = true ;
statusBar1.Text = "已經連線!" ;
}
catch
{
MessageBox.Show ( "無法和遠端主機8000埠建立連線!" , "錯誤提示!" ) ;
return ;
}
}
//傳送
private void button2_Click(object sender, System.EventArgs e)
{
if (textBox2.Text !="")
{
swWriter.WriteLine(textBox2.Text);//重新整理當前資料流中的資料
swWriter.Flush();
}
else
{
MessageBox.Show("傳送資訊不能為空!","錯誤提示!");
}
}
// 清理所有正在使用的資源。
protected override void Dispose( bool disposing )
{
if ( tcpConnect )
{
swWriter.WriteLine ( "STOP" ) ; //傳送控制碼
swWriter.Flush (); //重新整理當前資料流中的資料
nsStream.Close (); //清除資源
swWriter.Close ();
}
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
非同步套接字
BeginAccept
Public IAsyncResult BeginAccept{AsyncCallback callback,object state}
AsyncCallback非同步回撥方法 object state自定義物件, 返回IasyncResult
Using System;
Namespace mySocket
{
Public class Stateobject
{
Public StateObject(){建構函式邏輯}
}
}à>
Using System;
Using System.Net;
Using System.Net.Sockets;
Using System.Threading;
Using System.Text;
Namespace mysocket
{
Public Class StateObject
{
Public Socket worksocket=null;
Public const int buffersize=1024;
Public byte[] buffer=new byte[buffersize];
Public StringBuilder sb=new StringBuilder();
Public StateObject()
{}
}
}
實現主機繫結和埠監聽:
Private IPAddress myIP=IPAddress.Parse(“127.0.0.1”);
Private IPEndPoint MyServer;
Private Socket mySocket;
Private Socket Handler;
Private Static ManualResetEvent myreset =new ManualResetEvent(false);
Try
{
IPHostEntry myhost=new IPHostEntry();
Myhost=dns.gethostbyName(“”);
String IPString =myhost.Addresslist[0].tostring();
Myip=IPAddress.Parse(IPString);
}
Catch{MessageBox.Show(“您輸入的IP地址格式不正確,重新輸入!”);}
Try
{
MyServer=new IPEndPoint(myIP,Int32.Parse(“Port”));
Mysocket=new Socket(AddressFamily.Inte.Network,SocketType.Stream,Protocol.Tcp);
Mysocket.Bind(Myserver);
Mysocket.Listen(50);
Thread thread=new Thread(new ThreadStart(target));
Thread.Start();
}
Catch(Exception ee){}
執行緒target
Private void target()
{
While(true)
{
myReset.Reset();
mysocket.BeginAccept(new AsyncCallBack(AcceptCallback),mysocket);
myReset.WaitOne();
}
}
非同步回撥方法AcceptCallBack
Private void AcceptCallback(IAsyncResault ar)
{
myReset.Set();
Socket Listener=(Socket)ar.AsyncState;
Handler=Listener.EndAccept(ar);
StateObject state=new StateObject();
State.workSocket=handler;
Try
{
Byte[] byteData=System.Text.Encoding.BigEndianUnicode.GetBytes(“通話!”+”\n\r”);
Handler.BeginSend(byuteData,0,byteData.Length,0,new AsyncCallback(SendCallback),handler);
}
Catch(Exception ee)
{MessageBox.Show(ee.Message);}
Thread thread=new Thread(new ThreadStart(begreceive));
Thread.Start();
}
相關推薦
C#.net同步非同步SOCKET通訊和多執行緒總結(5)tcp傳送和接受的程式碼
基於TCP協議的傳送和接收端 TCP協議的接收端 using System.Net.Sockets ; //使用到TcpListen類 using System.Threading ; //使用到執行緒 using System.IO ; //使用到StreamReader類 int port = 800
C#.net同步非同步SOCKET通訊和多執行緒總結2
服務端: using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; Thread mythread ; Socket socket; // 清理所有正在使用的資
Java多執行緒程式設計-(5)-使用Lock物件實現同步以及執行緒間通訊
前幾篇: 在《Java多執行緒程式設計-(4)-執行緒間通訊機制的介紹與使用》已經學習了,可以使用方法wait/notify 結合同步關鍵字syn
c++11多執行緒程式設計(二):joining和detaching 執行緒
Joining執行緒 執行緒一旦啟動,另一個執行緒可以通過呼叫std::thread物件上呼叫join()函式等待這個執行緒執行完畢std::thread th(funcPtr); th.join(); 看一個例子主執行緒啟動10個工作執行緒,啟動完畢後,main函式等待
多執行緒學習(三):isAlive()和sleep()和getId()
isAlive() isAlive()判斷執行緒是否處於活動狀態,即執行緒已經啟動但尚未終止。 例一 public class MyThread extends Thread{ @Override public void run() { System.out.prin
linux多執行緒學習(七)——實現“生產者和消費者”
在上一篇文章中,利用訊號量實現了執行緒間的互斥,這一篇將要利用訊號量的互斥同步機制來實現一個經典例項,就是“生產者和消費者”。 1、簡單描述生產者和消費者的問題。 有一個緩衝區和兩個執行緒:生產者和消費者。生產者把產品放入緩衝區,而消費者從緩衝區中拿走。當緩衝區滿時,生產者必
Java多執行緒程式設計-(13)-從volatile和synchronized的底層實現原理看Java虛擬機器對鎖優化所做的努力
一、背景 對於Java來說我們知道,Java程式碼首先會編譯成Java位元組碼,位元組碼被類載入器載入到JVM裡,JVM執行位元組碼,最終需要轉化為彙編指令在CPU上進行執行。 Java中所使用
Java多執行緒總結(6)— 執行緒池的基本使用和執行流程分析
1 執行緒池的實現原理及基本類結構 合理利用執行緒池能夠帶來三個好處。 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 提高執行緒的可管理性。執行緒是稀缺
多執行緒學習(5):synchronized 的基礎使用
2018年10月03日 目錄 前言 前言 java中已經有了內建鎖:synchronized,synchronized的特點是使用簡單,一切交給JVM去處理,不需要顯示釋放; j
同步非同步SOCKET通訊和多執行緒總結
同步套接字通訊 Socket支援下的網上點對點的通訊服務端實現監聽連線,客戶端實現傳送連線請求,建立連線後進行傳送和接收資料的功能 伺服器端建立一個socket,設定好本機的ip和監聽的埠與socket進行繫結,開始監聽連線請求,當接收到連線請求後,傳送確認,同
C# 多執行緒學習(五)執行緒同步和衝突解決
首先先說一個執行緒不同步的例子吧,以下為售票員的模擬售票,多個售票員出售100張門票,程式碼如下: using System; using System.Text; using System.Collections.Generic; using Syste
C#非同步多執行緒總結(delegate、Thread、Task、ThreadPool、Parallel、async、cancel)
同步與非同步多執行緒的區別: 1、同步方法卡介面(UI執行緒忙於計算);非同步多執行緒不卡介面(主執行緒閒置,子執行緒在計算) 2、同步方法慢(CPU利用率低、資源耗費少);非同步多執行緒快(CPU利用率高、資源耗費多) 3、同步方法是有序的;非同步方法是無序的(啟動無序、執行時間不確定、結
C++ 多執行緒框架 (2):Mutex 互斥和 Sem 訊號量
互斥和訊號量是多執行緒程式設計的兩個基礎,其原理就不詳細說了,大家去看看作業系統的書或者網上查查吧。 對於互斥的實現,無論什麼作業系統都離不開三個步驟 1.初始化互斥鎖 2.鎖操作 3.解鎖操作 對於不同的系統只是實現的函式有一些不同而已,但是功能其實都大同小異,在
Java多執行緒程式設計-(12)-Java中的佇列同步器AQS和ReentrantLock鎖原理簡要分析
原文出自 : https://blog.csdn.net/xlgen157387/article/details/78341626 一、Lock介面 在上一篇文章中: Java多執行緒程式設計-(5)-使用Lock物件實現同步以及執行緒間通訊 介紹
C++——多執行緒程式設計(二)std::mutex 執行緒同步、解決資源競爭問題
前言 執行緒同步 這裡的“同”不是同時、一起執行的意思,而是指協同、協助、互相配合。執行緒同步是指多個執行緒協同步調,按預定的先後次序進行執行。 執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下來,示意B執行;B依言執行,再將結果給A;
Socket通訊-accept+多執行緒
偶然的機會,重新寫了一下windows下socket通訊的比較基礎的程式碼, 太久沒有接觸socket以及多執行緒,查了不少部落格,但是發現大部分內容比較陳舊, 所以決定寫一篇部落格,順便自己總結一下。 內容簡介 網路通訊基本
C++多執行緒系列(一)CreateThread和_beginthreadex區別
現在在學習多執行緒,順便將蒐集到的資料整理下來以供參考和查詢。首先在開始多執行緒學習的時候遇到的首要問題便是多執行緒的建立,在查閱資料後有CreateThread和_beginthreadex兩種方法,可能不止這兩種,以後學習到了再補充。-------------------
c++11多執行緒程式設計(四):資料共享和競爭條件
在多執行緒環境中,執行緒間的資料共享很簡單,但是在程式中這種簡單的資料共享可能會引起問題,其中一種便是競爭條件。什麼是競爭條件? 競賽條件是發生在多執行緒應用程式中的一種bug 當兩個或多個執行緒並行執行一組操作,訪問相同的記憶體位置,此時,它們中的一個或多個執行緒會修改記
鎖和多執行緒:鎖的5種分類(三)
重入鎖 中斷鎖 公平鎖 讀寫鎖 自旋鎖 1.重入鎖 2.中斷鎖 3.公平鎖 4.讀寫鎖
Java多執行緒學習(十):AQS 原理以及 AQS 同步元件總結
常見問題:AQS 原理?;CountDownLatch和CyclicBarrier瞭解嗎,兩者的區別是什麼?用過Semaphore嗎? 本節思維導圖: 阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms