亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

基于c#用Socket做一個局域網聊天工具

2020-01-24 00:57:50
字體:
來源:轉載
供稿:網友

程序設計成為簡單的服務端和客戶端之間的通信, 但通過一些方法可以將這兩者進行統一起來, 讓服務端也成為客戶端, 讓客戶端也成為服務端, 使它們之間可以互相隨時不間斷的通信. 考慮到實現最原始的服務端和客戶端之間的通信所需要的步驟對于寫這樣的程序是很有幫助的.

作為服務端, 要聲明一個Socket A并綁定(Bind)某一個IP+這個IP指定的通信端口, 比如這個是127.0.0.1:9050, 然后開始監聽(Listen), Listen可以監聽來自多個IP傳過來的連接請求, 具體可以同時連接幾個客戶端, Listen方法中可以設定一個參數. 如果Listen到某一個客戶端發來連接請求了, 這時定義一個新的Socket B專門負責與這個客戶端的通信, Socket B = A.Accept(). 這時可以獲取這個客戶端的IP和端口,  IPEndPoint C = (IPEndPoint)B.RemoteEndPoint, C.Address和C.Port分別表示客戶端C的IP地址和端口. 這時通過B.Send()方法就可以給C發送消息了, B.Receive()可以接收客戶端C發來的信息.

作為客戶端, 也需要聲明一個Socket D并綁定某一個IP+本機一個未被占用的端口, 定義IPEndPoint E表示要進行連接的服務端Socket, 要指明E的IP和端口, 這樣才可以進行端口對端口之間的通信, 接下來就可以嘗試D.Connect(E), 連接成功之后就可以發送和接收數據了, D.Send(), D.Receive.

發送消息時, 數據都是以字節或字節數組為單位進行傳輸的, 比如我客戶端D要發送"Hello World"則要這樣寫: D.Send(Encoding.ASCII.GetBytes("Hello World")).  接受消息時, 也是以字節或字節數組, 比如服務端要接受D剛才發送的Hello World, 可以這樣寫: Byte[] data = new Byte[1024]; int receivedDataLength = B.Receive(data); string stringdata = Encoding.ASCII.GetString(data, 0, receivedDataLength); stringdata這時就是Hello World.

上面只是大概的闡述了服務端與客戶端之間的通信過程, 在網上找到了具體的代碼例子, 也貼過來參考參考. 這個例子沒有將服務端與客戶端統一起來, 他是分別寫服務端和客戶端的.

服務端代碼

using System;using System;using System.Net;using System.Net.Sockets;using System.Text;namespace tcpserver{   ///  <summary>    /// Class1 的摘要說明。   ///  </summary>    class server  {     ///  <summary>      /// 應用程序的主入口點。     ///  </summary>     [STAThread]     static  void Main( string [] args)    {       //        // TODO: 在此處添加代碼以啟動應用程序       //      int recv; // 用于表示客戶端發送的信息長度      byte [] data;// = new  byte [ 1024 ]; // 用于緩存客戶端所發送的信息,通過socket傳遞的信息必須為字節數組       IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050 ); // 本機預使用的IP和端口       Socket newsock = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);      newsock.Bind(ipep); // 綁定      newsock.Listen( 10 ); // 監聽      Console.WriteLine( " waiting for a client " );      Socket client = newsock.Accept(); //當有可用的客戶端連接嘗試時執行,并返回一個新的socket,用于與客戶端之間的通信       IPEndPoint clientip = (IPEndPoint)client.RemoteEndPoint;      Console.WriteLine( " connect with client: " + clientip.Address + " at port: " + clientip.Port);      string welcome = " welcome here! " ;      data = Encoding.ASCII.GetBytes(welcome);      client.Send(data,data.Length,SocketFlags.None); // 發送信息       while ( true )      { // 用死循環來不斷的從客戶端獲取信息         data = new  byte [ 1024 ];        recv = client.Receive(data);        Console.WriteLine( " recv= " + recv);        if (recv == 0 ) // 當信息長度為0,說明客戶端連接斷開            break ;        Console.WriteLine(Encoding.ASCII.GetString(data, 0 ,recv));        client.Send(data,recv,SocketFlags.None);      }      Console.WriteLine( " Disconnected from " + clientip.Address);      client.Close();      newsock.Close();    }  }}

客戶端代碼

using System;using System.Net;using System.Net.Sockets;using System.Text;namespace tcpclient{  ///  <summary>   /// Class1 的摘要說明。  ///  </summary>   class client  {    ///  <summary>     /// 應用程序的主入口點。    ///  </summary>     [STAThread]    static void Main(string[] args)    {      //       // TODO: 在此處添加代碼以啟動應用程序      //      byte[] data = new byte[1024];      Socket newclient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);      newclient.Bind(new IPEndPoint(IPAddress.Any, 905));      Console.Write(" please input the server ip: ");      string ipadd = Console.ReadLine();      Console.WriteLine();      Console.Write(" please input the server port: ");      int port = Convert.ToInt32(Console.ReadLine());      IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port); // 服務器的IP和端口      try      {        // 因為客戶端只是用來向特定的服務器發送信息,所以不需要綁定本機的IP和端口。不需要監聽。         newclient.Connect(ie);      }      catch (SocketException e)      {        Console.WriteLine(" unable to connect to server ");        Console.WriteLine(e.ToString());        return;      }      int receivedDataLength = newclient.Receive(data);      string stringdata = Encoding.ASCII.GetString(data, 0, receivedDataLength);      Console.WriteLine(stringdata);      while (true)      {        string input = Console.ReadLine();        if (input == " exit ")          break;        newclient.Send(Encoding.ASCII.GetBytes(input));        data = new byte[1024];        receivedDataLength = newclient.Receive(data);        stringdata = Encoding.ASCII.GetString(data, 0, receivedDataLength);        Console.WriteLine(stringdata);      }      Console.WriteLine(" disconnect from sercer ");      newclient.Shutdown(SocketShutdown.Both);      newclient.Close();    }  }}

上面的服務端和客戶端都是控制臺應用程序, 想辦法做一個窗體類型的, 思路就是另起一個線程, 這個線程專門負責兩端建立連接. 如果不采用另起線程的方法, 當等待連接而沒有連接上, 或者主動連接, 服務端還沒有相應時, 程序就會出現沒有響應的假死狀態.

當這個線程將兩個端口連接成功后, 就讓程序進入一個死循環, 這個死循環負責不斷的接收是否有消息傳來, 傳來的話就在txtGetMsg中顯示出來:

while (true)  // 用死循環來不斷的獲取信息{  data = new byte[1024];  recv = newclient.Receive(data);   uiContext.Send(new SendOrPostCallback(  state =>  {    int txtGetMsgLength = txtGetMsg.Text.Length;    string recMsg = "Friend:    " + System.DateTime.Now.ToString() + "/n  " +Encoding.Unicode.GetString(data, 0, recv) + "/n";    txtGetMsg.AppendText(recMsg);    txtGetMsg.Select(txtGetMsgLength, recMsg.Length - Encoding.Unicode.GetString(data, 0, recv).Length - 1);    txtGetMsg.SelectionColor = Color.Red;  }), null);}

如果按下發送消息的按鈕, 則發送txtSendMsg中的文本, 我寫的是用Unicode編碼, 所以可以發送中文字符.

private void btnSendMsg_Click(object sender, EventArgs e){  string input = txtSendMsg.Text;  if (input == "")  {    MessageBox.Show("消息不能為空!", "發送消息出錯");    txtSendMsg.Focus();  }  else  {    if (meIsClient)    {      newclient.Send(Encoding.Unicode.GetBytes(input));      string showText = "Me:      " + System.DateTime.Now.ToString() + "/n  "      + input + "/n";      int txtGetMsgLength = txtGetMsg.Text.Length;      txtGetMsg.AppendText(showText);      txtGetMsg.Select(txtGetMsgLength, showText.Length - 1 - input.Length);      txtGetMsg.SelectionColor = Color.Blue;      txtSendMsg.Text = "";    }    else    {      client.Send(Encoding.Unicode.GetBytes(input));      string showText = "Me    " + System.DateTime.Now.ToString() + "/n  "      + input + "/n";      int txtGetMsgLength = txtGetMsg.Text.Length;      txtGetMsg.AppendText(showText);      txtGetMsg.Select(txtGetMsgLength, showText.Length - 1 - input.Length);      txtGetMsg.SelectionColor = Color.Blue;      txtSendMsg.Text = "";    }  }}

程序的運行效果:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲男女性事视频| 国产精品自产拍在线观看中文| 韩国精品美女www爽爽爽视频| 日韩在线一区二区三区免费视频| 久久99亚洲精品| 91亚洲精品视频| 中文字幕免费精品一区高清| 精品国产美女在线| 欧美大片va欧美在线播放| 久久久www成人免费精品| 欧美激情xxxx性bbbb| 97国产一区二区精品久久呦| 综合国产在线观看| 久青草国产97香蕉在线视频| 日韩欧美在线国产| 欧美天堂在线观看| 久热精品在线视频| 亚洲老头同性xxxxx| 日韩成人激情视频| 亚洲欧美激情一区| 国产精品网红福利| 国产欧美在线看| 欧美小视频在线观看| 久久亚洲精品一区二区| 精品久久久久国产| 日韩精品极品视频免费观看| 国产在线视频2019最新视频| 亚洲女人天堂色在线7777| 亚洲天堂精品在线| 亚洲国产日韩欧美在线动漫| 91天堂在线视频| 日韩电视剧免费观看网站| 91国内揄拍国内精品对白| 奇门遁甲1982国语版免费观看高清| 成人免费观看网址| 欧美一级视频一区二区| 欧美专区第一页| 伦伦影院午夜日韩欧美限制| 国产免费亚洲高清| 热门国产精品亚洲第一区在线| 日韩精品免费在线播放| 在线精品国产成人综合| 亚洲精品乱码久久久久久按摩观| 亚洲人成欧美中文字幕| 亚洲国产天堂久久国产91| 日韩中文字幕视频在线观看| 日韩国产精品视频| 91精品国产高清久久久久久91| 日韩免费在线免费观看| 91免费版网站入口| 国产亚洲欧洲高清| 欧美性猛交xxxx免费看久久久| 正在播放欧美一区| 91性高湖久久久久久久久_久久99| 久久久999精品免费| 欧美午夜激情小视频| 亚州国产精品久久久| 欧美性做爰毛片| 51久久精品夜色国产麻豆| 97精品国产97久久久久久| 亚洲欧美日韩另类| 国产自摸综合网| 91高潮在线观看| 亚洲美女激情视频| 日韩精品中文字幕视频在线| 成人欧美一区二区三区在线| 亚洲性日韩精品一区二区| 国产日韩欧美夫妻视频在线观看| 成人精品视频久久久久| 欧美电影《睫毛膏》| 日韩成人在线视频| 日本午夜在线亚洲.国产| 91免费的视频在线播放| 国内精品久久久久影院优| 日韩黄在线观看| 色婷婷综合久久久久| 成人在线观看视频网站| 欧美专区国产专区| 一区二区三区视频在线| 另类图片亚洲另类| 欧美成人合集magnet| 日韩精品一二三四区| 日韩欧美高清视频| 亚洲二区在线播放视频| 欧洲成人在线观看| 91亚洲精品视频| 国产精品久久激情| 一区二区三区四区视频| 日韩免费观看网站| 美女国内精品自产拍在线播放| 国产成人精品999| 欧美精品少妇videofree| 久久久精品免费| 欧美精品做受xxx性少妇| 欧美人与性动交a欧美精品| 国产精品羞羞答答| 亚洲一区二区三| 亚洲老头同性xxxxx| 国产精品成熟老女人| 精品中文视频在线| 国产成人免费91av在线| 2020国产精品视频| 亚州精品天堂中文字幕| 日韩黄在线观看| 亚洲精品美女视频| 欧美精品电影在线| 国产日韩欧美综合| 亚洲一区二区在线播放| 中文字幕在线看视频国产欧美| 久久99国产精品久久久久久久久| 国产精品爱啪在线线免费观看| 欧美日韩国产中字| 精品日本美女福利在线观看| 国产成人久久精品| 大伊人狠狠躁夜夜躁av一区| 欧美精品第一页在线播放| 中文字幕一区二区精品| 国产成人涩涩涩视频在线观看| 欧美视频在线视频| 国产美女久久久| 欧洲成人午夜免费大片| 少妇高潮久久久久久潘金莲| 91精品国产九九九久久久亚洲| 欧美精品制服第一页| 在线观看欧美日韩国产| 国产一区二区视频在线观看| 亚洲韩国日本中文字幕| 亚洲一区二区三区在线视频| 亚洲理论电影网| 成人免费福利视频| 91丨九色丨国产在线| 国产精品人成电影在线观看| 美女福利视频一区| 日韩精品亚洲元码| 92看片淫黄大片看国产片| 中文字幕av一区二区三区谷原希美| 91精品在线观| 国产福利精品视频| 国产日韩综合一区二区性色av| 成人国产在线激情| 欧美大片网站在线观看| 国产女人精品视频| 日韩av一区在线观看| 中文字幕欧美在线| 91视频88av| 精品久久久久久| 91精品国产91久久久久久最新| 亚洲黄色www| 国产美女直播视频一区| 亚州成人av在线| 亚洲视频免费一区| 亚洲国产成人久久综合| 91中文字幕在线| 日韩av网址在线| 日本免费一区二区三区视频观看| 国产91色在线播放| 欧美有码在线观看视频| 2018中文字幕一区二区三区| 热草久综合在线| 欧日韩不卡在线视频| 日韩av在线网址| 色婷婷综合久久久久| 色综合久久天天综线观看| 日产日韩在线亚洲欧美|