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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SOCKET通信的基本步骤

發(fā)布時(shí)間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SOCKET通信的基本步骤 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SOCKET通信的基本步驟

? ?1)建立一個(gè)服務(wù)器ServerSocket,并同時(shí)定義好ServerSocket的監(jiān)聽(tīng)端口;
???2)ServerSocket 調(diào)用accept()方法,使之處于阻塞。
???3)創(chuàng)建一個(gè)客戶機(jī)Socket,并設(shè)置好服務(wù)器的IP端口
???4)客戶機(jī)發(fā)出連接請(qǐng)求,建立連接。
???5)分別取得服務(wù)器和客戶端ServerSocket 和Socket的InputStream和OutputStream.
???6)??利用Socket和ServerSocket進(jìn)行數(shù)據(jù)通信。 /

在進(jìn)行網(wǎng)絡(luò)編程時(shí),我們常常見(jiàn)到同步(Sync)/異步(Async),阻塞(Block)/非阻塞(Unblock)四種調(diào)用方式:
同步:
??????
所謂同步,就是在發(fā)出一個(gè)功能調(diào)用時(shí),在沒(méi)有得到結(jié)果之前,該調(diào)用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交請(qǐng)求->等待服務(wù)器處理->處理完畢返回?這個(gè)期間客戶端瀏覽器不能干任何事

異步:
??????
異步的概念和同步相對(duì)。當(dāng)一個(gè)異步過(guò)程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實(shí)際處理這個(gè)調(diào)用的部件在完成后,通過(guò)狀態(tài)、通知和回調(diào)來(lái)通知調(diào)用者。

? ? ?例如 ajax請(qǐng)求(異步):?請(qǐng)求通過(guò)事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

阻塞
?????
阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起(線程進(jìn)入非可執(zhí)行狀態(tài),在這個(gè)狀態(tài)下,cpu不會(huì)給線程分配時(shí)間片,即線程暫停運(yùn)行)。函數(shù)只有在得到結(jié)果之后才會(huì)返回。

? ? ?有人也許會(huì)把阻塞調(diào)用和同步調(diào)用等同起來(lái),實(shí)際上他是不同的。對(duì)于同步調(diào)用來(lái)說(shuō),很多時(shí)候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒(méi)有返回而已。?例如,我們?cè)趕ocket中調(diào)用recv函數(shù),如果緩沖區(qū)中沒(méi)有數(shù)據(jù),這個(gè)函數(shù)就會(huì)一直等待,直到有數(shù)據(jù)才返回。而此時(shí),當(dāng)前線程還會(huì)繼續(xù)處理各種各樣的消息。

非阻塞
??????
非阻塞和阻塞的概念相對(duì)應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會(huì)阻塞當(dāng)前線程,而會(huì)立刻返回。
對(duì)象的阻塞模式和阻塞函數(shù)調(diào)用
對(duì)象是否處于阻塞模式和函數(shù)是不是阻塞調(diào)用有很強(qiáng)的相關(guān)性,但是并不是一一對(duì)應(yīng)的。阻塞對(duì)象上可以有非阻塞的調(diào)用方式,我們可以通過(guò)一定的API去輪詢狀?態(tài),在適當(dāng)?shù)臅r(shí)候調(diào)用阻塞函數(shù),就可以避免阻塞。而對(duì)于非阻塞對(duì)象,調(diào)用特殊的函數(shù)也可以進(jìn)入阻塞調(diào)用。函數(shù)select就是這樣的一個(gè)例子。

?

1. 同步,就是我調(diào)用一個(gè)功能,該功能沒(méi)有結(jié)束前,我死等結(jié)果。
2. 異步,就是我調(diào)用一個(gè)功能,不需要知道該功能結(jié)果,該功能有結(jié)果后通知我(回調(diào)通知)
3. 阻塞, ? ? ?就是調(diào)用我(函數(shù)),我(函數(shù))沒(méi)有接收完數(shù)據(jù)或者沒(méi)有得到結(jié)果之前,我不會(huì)返回。
4. 非阻塞, ?就是調(diào)用我(函數(shù)),我(函數(shù))立即返回,通過(guò)select通知調(diào)用者

同步IO和異步IO的區(qū)別就在于:數(shù)據(jù)拷貝的時(shí)候進(jìn)程是否阻塞!

阻塞IO和非阻塞IO的區(qū)別就在于:應(yīng)用程序的調(diào)用是否立即返回!

對(duì)于舉個(gè)簡(jiǎn)單c/s 模式:

同步:提交請(qǐng)求->等待服務(wù)器處理->處理完畢返回這個(gè)期間客戶端瀏覽器不能干任何事
異步:請(qǐng)求通過(guò)事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢 同步和異步都只針對(duì)于本機(jī)SOCKET而言的。

同步和異步,阻塞和非阻塞,有些混用,其實(shí)它們完全不是一回事,而且它們修飾的對(duì)象也不相同。
阻塞和非阻塞是指當(dāng)進(jìn)程訪問(wèn)的數(shù)據(jù)如果尚未就緒,進(jìn)程是否需要等待,簡(jiǎn)單說(shuō)這相當(dāng)于函數(shù)內(nèi)部的實(shí)現(xiàn)區(qū)別,也就是未就緒時(shí)是直接返回還是等待就緒;

而同步和異步是指訪問(wèn)數(shù)據(jù)的機(jī)制,同步一般指主動(dòng)請(qǐng)求并等待I/O操作完畢的方式,當(dāng)數(shù)據(jù)就緒后在讀寫(xiě)的時(shí)候必須阻塞(區(qū)別就緒與讀寫(xiě)二個(gè)階段,同步的讀寫(xiě)必須阻塞),異步則指主動(dòng)請(qǐng)求數(shù)據(jù)后便可以繼續(xù)處理其它任務(wù),隨后等待I/O,操作完畢的通知,這可以使進(jìn)程在數(shù)據(jù)讀寫(xiě)時(shí)也不阻塞。(等待"通知")


// 客戶端: 綜合運(yùn)用以上闡述的使用Visual C#進(jìn)行Socket網(wǎng)絡(luò)程序開(kāi)發(fā)的知識(shí),下面的程序段完整地實(shí)現(xiàn)了Web頁(yè)面下載功能。用戶只需在窗體上輸入遠(yuǎn)程主機(jī)名(Dns 主機(jī)名或以點(diǎn)分隔的四部分表示法格式的 IP 地址)和預(yù)保存的本地文件名,并利用專(zhuān)門(mén)提供Http服務(wù)的80端口,就可以獲取遠(yuǎn)程主機(jī)頁(yè)面并保存在本地機(jī)指定文件中。如果保存格式是.htm格式,你就可以在Internet瀏覽器中打開(kāi)該頁(yè)面。適當(dāng)添加代碼,你甚至可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀏覽器程序。
??
??
??實(shí)現(xiàn)此功能的主要源代碼如下:
??
??//"開(kāi)始"按鈕事件
??private void button1_Click(object sender, System.EventArgs e)? {
???//取得預(yù)保存的文件名
???string fileName=textBox3.Text.Trim();
???//遠(yuǎn)程主機(jī)
???string hostName=textBox1.Text.Trim();
???//端口
???int port=Int32.Parse(textBox2.Text.Trim());
???//得到主機(jī)信息
???IPHostEntry ipInfo=Dns.GetHostByName(hostName);
???//取得IPAddress[]
???IPAddress[] ipAddr=ipInfo.AddressList;
???//得到ip
???IPAddress ip=ipAddr[0];
???//組合出遠(yuǎn)程終結(jié)點(diǎn)
???IPEndPoint hostEP=new IPEndPoint(ip,port);
???//創(chuàng)建Socket 實(shí)例
???Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
???try
???{
???//嘗試連接
???socket.Connect(hostEP);
???}
???catch(Exception se)
???{
???MessageBox.Show("連接錯(cuò)誤"+se.Message,"提示信息
???,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
??}
??//發(fā)送給遠(yuǎn)程主機(jī)的請(qǐng)求內(nèi)容串
??string sendStr="GET / HTTP/1.1\r\nHost: " + hostName +
??"\r\nConnection: Close\r\n\r\n";
???//創(chuàng)建bytes字節(jié)數(shù)組以轉(zhuǎn)換發(fā)送串
???byte[] bytesSendStr=new byte[1024];
???//將發(fā)送內(nèi)容字符串轉(zhuǎn)換成字節(jié)byte數(shù)組
???bytesSendStr=Encoding.ASCII.GetBytes(sendStr);
??try
??{
??//向主機(jī)發(fā)送請(qǐng)求
??socket.Send(bytesSendStr,bytesSendStr.Length,0);
??}
??catch(Exception ce)
???{
???MessageBox.Show("發(fā)送錯(cuò)誤:"+ce.Message,"提示信息
???,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
???}
???//聲明接收返回內(nèi)容的字符串
???string recvStr="";
???//聲明字節(jié)數(shù)組,一次接收數(shù)據(jù)的長(zhǎng)度為1024字節(jié)
???byte[] recvBytes=new byte[1024];
???//返回實(shí)際接收內(nèi)容的字節(jié)數(shù)
???int bytes=0;
??//循環(huán)讀取,直到接收完所有數(shù)據(jù)
??while(true)
??{
?? bytes=socket.Receive(recvBytes,recvBytes.Length,0);
?? //讀取完成后退出循環(huán)
?? if(bytes<=0)
?? break;
?? //將讀取的字節(jié)數(shù)轉(zhuǎn)換為字符串
?? recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes);
??}
??//將所讀取的字符串轉(zhuǎn)換為字節(jié)數(shù)組
??byte[] content=Encoding.ASCII.GetBytes(recvStr);
???try
???{
??? //創(chuàng)建文件流對(duì)象實(shí)例
??? FileStream fs=new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
?? //寫(xiě)入文件
?? fs.Write(content,0,content.Length);
??}
??catch(Exception fe)
???{
??? MessageBox.Show("文件創(chuàng)建/寫(xiě)入錯(cuò)誤:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information);
???}
??? //禁用Socket
??? socket.Shutdown(SocketShutdown.Both);
??? //關(guān)閉Socket
??? socket.Close();
???}
???}

// /client端
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace socketsample
{
 class Class1
 {
  static void Main()
  {
   try
   {
    int port = 2000;
    string host = "127.0.0.1";
    IPAddress ip = IPAddress.Parse(host);
    IPEndPoint ipe = new IPEndPoint(ip, port);
    Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    c.Connect(ipe);
    string sendStr = "hello!This is a socket test";
    byte[] bs = Encoding.ASCII.GetBytes(sendStr);
    c.Send(bs, bs.Length, 0);
    string recvStr = "";
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = c.Receive(recvBytes, recvBytes.Length, 0);
    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
    Console.WriteLine(recvStr);
    c.Close();
   }
   catch (ArgumentNullException e)
   {
    Console.WriteLine("ArgumentNullException: {0}", e);
   }
   catch (SocketException e)
   {
    Console.WriteLine("SocketException: {0}", e);
   }
   Console.ReadLine();
  }
 }
}
//server端
using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;
namespace Project1
{
 class Class2
 {
  static void Main()
  {
   try
   {
    int port = 2000;
    string host = "127.0.0.1";
    IPAddress ip = IPAddress.Parse(host);
    IPEndPoint ipe = new IPEndPoint(ip, port);
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    s.Bind(ipe);
    s.Listen(0);
    Socket temp = s.Accept();
    string recvStr = "";
    byte[] recvBytes = new byte[1024];
    int bytes;
    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);
    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
    Console.WriteLine(recvStr);
    string sendStr = "Ok!Sucess!";
    byte[] bs = Encoding.ASCII.GetBytes(sendStr);
    temp.Send(bs, bs.Length, 0);
    temp.Shutdown(SocketShutdown.Both);
    temp.Close();
    s.Shutdown(SocketShutdown.Both);
    s.Close();
   }
   catch (ArgumentNullException e)
   {
    Console.WriteLine("ArgumentNullException: {0}", e);
   }
   catch (SocketException e)
   {
    Console.WriteLine("SocketException: {0}", e);
   }
   Console.ReadLine();
  }
 }
}

總結(jié)

以上是生活随笔為你收集整理的SOCKET通信的基本步骤的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91免费黄| 免费看黄色片的网站 | 看av的网址 | 国产精品99久久久久久久 | 国产伦子伦对白视频 | 欧美日韩国产中文字幕 | 最新av在线播放 | 伊人色网 | 亚洲人一区二区三区 | 姑娘第5集在线观看免费 | 色综合久久88色综合天天 | 国产三级全黄 | 久久青青草原 | 成人污在线观看 | 中文字幕在线免费看 | 91精品国产综合久久香蕉922 | 自宅警备员在线观看 | 婷婷综合在线观看 | 猫咪av在线 | 日本黄色小片 | 精品人妻少妇AV无码专区 | 欧美草b | 欧美激情不卡 | 亚洲av综合色区无码一区爱av | 久一区二区三区 | 波多野结衣电车痴汉 | 国产精品啪啪啪视频 | 久色电影| 精品久久精品 | 久久久天天 | 99热日韩 | 国产精品500部 | 97国产精品久久 | 国产永久毛片 | 99精品毛片 | 伊人精品一区二区三区 | 日韩一区二区三区不卡 | 久久久久久欧美 | av在线超碰 | 麻豆亚洲av成人无码久久精品 | 亚洲大逼| 伊人热久久 | 日韩精品一区二区三区不卡 | 2020自拍偷拍 | 蜜桃av一区 | 女女互磨互喷水高潮les呻吟 | 99精品网 | 欧美激情 一区 | 日本成人在线一区 | 亚洲免费观看高清在线观看 | 任我爽在线 | 夜色网 | 国产男女无遮挡猛进猛出 | 1级性生活片 | 日韩欧美大片在线观看 | 天美麻花果冻视频大全英文版 | 九九99精品 | 深夜视频在线观看免费 | 大尺度床戏揉捏胸视频 | 亚洲精品中文字幕在线播放 | 日韩 欧美 中文 | 亚洲天天综合网 | 99免费精品视频 | 吊侵犯の奶水授乳羞羞漫画 | 91精品入口| 自拍在线视频 | 99xav| 美女视频毛片 | 中文永久免费观看 | 少妇人妻丰满做爰xxx | 国产一卡二卡三卡四卡 | 伊人7| 久久先锋 | 国产成人精品在线视频 | 午夜影视体验区 | 亚洲经典一区二区三区四区 | 黄色资源网站 | 精品黑人一区二区三区久久 | 91麻豆映画传媒 | 国产精品第12页 | 久久久亚洲精品视频 | 在线看一级片 | 视频精品一区 | 免费在线看黄色片 | 午夜国产在线观看 | 国产一级做a爰片久久毛片男男 | 孕妇丨91丨九色 | 婷婷国产精品 | 久久午夜激情 | 国产情侣免费视频 | 亚洲欧美综合自拍 | 伊人在线| 日韩一区二区三区精品视频 | 超碰97色| 三级在线免费 | 在线污视频 | 先锋影音中文字幕 | 四虎三级 | 性欧美video另类hd尤物 |