国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:36:36
文檔

C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信

C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信:先來(lái)講述下我自己對(duì)于整個(gè)Socket通信過(guò)程的理解,畢竟初學(xué),說(shuō)錯(cuò)見(jiàn)諒,知道錯(cuò)了會(huì)改正~ 首先在服務(wù)端新建一個(gè)serverSocket,對(duì)其進(jìn)行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數(shù)據(jù)方式,ProtoType:傳輸協(xié)議); 接
推薦度:
導(dǎo)讀C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信:先來(lái)講述下我自己對(duì)于整個(gè)Socket通信過(guò)程的理解,畢竟初學(xué),說(shuō)錯(cuò)見(jiàn)諒,知道錯(cuò)了會(huì)改正~ 首先在服務(wù)端新建一個(gè)serverSocket,對(duì)其進(jìn)行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數(shù)據(jù)方式,ProtoType:傳輸協(xié)議); 接

先來(lái)講述下我自己對(duì)于整個(gè)Socket通信過(guò)程的理解,畢竟初學(xué),說(shuō)錯(cuò)見(jiàn)諒,知道錯(cuò)了會(huì)改正~ 

首先在服務(wù)端新建一個(gè)serverSocket,對(duì)其進(jìn)行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數(shù)據(jù)方式,ProtoType:傳輸協(xié)議); 

接著我們要設(shè)置server端要綁定的IP:port;然后開(kāi)始監(jiān)聽(tīng),并設(shè)置最多同時(shí)監(jiān)聽(tīng)多少個(gè)Client.

這時(shí),服務(wù)端就在等待狀態(tài),直到某一個(gè)Client連接到這個(gè)ip:port上,這時(shí)serverSocket.Accept()工作,獲得這個(gè)連接。(此時(shí)的連接是有地址信息的哦!記得保存) 

獲得連接之后,server就可以和這個(gè)Client進(jìn)行通信了,當(dāng)加入第二個(gè)Client(我們稱其為ClientB)時(shí),Server接收到ClientB的消息,可以將這個(gè)消息轉(zhuǎn)發(fā)給前一個(gè)Client(我們稱其為ClientA),當(dāng)受到ClientA的消息,也可以轉(zhuǎn)發(fā)給ClientB。這樣就實(shí)現(xiàn)了Clients之間的通信了。(重點(diǎn)在保存連接信息!!)

那么現(xiàn)在貼上代碼講解:

Server端代碼 

namespace SocketServer
{
 class Program
 {
 private static byte[] result = new byte[1024];
 
 static Socket serverSocket;
 private static string client;
 private static Socket clientSocket;
 //我這里存了兩個(gè)Client,因?yàn)樽约弘娔X開(kāi)了兩個(gè)Client,不會(huì)有多的
 //理論上應(yīng)該開(kāi)一個(gè)Socket[]來(lái)保存信息,最好用一個(gè)二元組將client的信息和連接綁定起來(lái)
 //這樣就可以實(shí)現(xiàn)斷開(kāi)連接后下次登陸還是可以識(shí)別是這個(gè)Client
 private static Socket clientSocketA=null;
 private static Socket clientSocketB=null;
 
 static void Main(string[] args)
 {
 Program.SetPort(8885);
 }
 private static void SetPort(int port)
 {
 IPAddress ip = IPAddress.Parse("127.0.0.1");//set ip
 serverSocket = new Socket(AddressFamily.InterNetwork,
 SocketType.Stream, ProtocolType.Tcp);//initialize
 serverSocket.Bind(new IPEndPoint(ip, port));//bind
 serverSocket.Listen(10);
 //進(jìn)入監(jiān)聽(tīng)狀態(tài)
 Console.WriteLine("監(jiān)聽(tīng){0}成功", serverSocket.LocalEndPoint.ToString());
 //開(kāi)啟一個(gè)線程來(lái)監(jiān)聽(tīng)客戶端連接
 Thread myThread = new Thread(ListenClientConnect);
 myThread.Start();
 Console.ReadLine();

 }
 /// <summary>
 /// 監(jiān)聽(tīng)客戶端連接
 /// </summary>
 private static void ListenClientConnect()
 {
 while (true)
 {
 //Client連接上后 得到這個(gè)連接
 clientSocket = serverSocket.Accept();

 //這里我因?yàn)橹挥袃蓚€(gè)Client,所以就簡(jiǎn)單寫了
 if (clientSocketA == null)
 {
 clientSocketA = clientSocket;
 }
 else if (clientSocketB == null)
 {
 clientSocketB = clientSocket;
 }
 else
 {
 //當(dāng)其中一個(gè)斷開(kāi)了,又重新連接時(shí),需要再次保存連接
 if (clientSocketB.IsBound)
 {
 clientSocketA = clientSocketB;
 clientSocketB = clientSocket;
 }
 else
 {
 clientSocketB = clientSocketA;
 clientSocketA = clientSocket;
 }
 
 }
 clientSocket.Send(Encoding.ASCII.GetBytes("say hello"));
 //開(kāi)個(gè)線程接收Client信息
 Thread receivedThread = new Thread(ReceiveMessage);
 receivedThread.Start(clientSocket);

 }
 }
 
 private static void ReceiveMessage(object clientSocket)
 {
 Socket myClientSocket = (Socket) clientSocket;
 
 while (true)
 {
 try
 {
 int revceiveNumber = myClientSocket.Receive(result);
 //Console.WriteLine("接受客戶端{(lán)0}消息{1}", myClientSocket.RemoteEndPoint.ToString()
 // , Encoding.ASCII.GetString(result, 0, revceiveNumber));
 Console.WriteLine(Encoding.ASCII.GetString(result, 0, revceiveNumber));
 if (myClientSocket == clientSocketA)
 {
 Console.WriteLine("receive from A");
 if (clientSocketB!=null&&clientSocketB.IsBound)
 {
 Console.WriteLine("a IS BOUND");
 clientSocketB.Send(result, 0, revceiveNumber, SocketFlags.None);
 }
 else
 {
 myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
 Console.WriteLine("對(duì)方不在線上,發(fā)送失敗!");
 }
 }
 else
 {
 Console.WriteLine("receive from B");
 if (clientSocketA != null && clientSocketA.IsBound)
 {
 Console.WriteLine("a IS BOUND");
 clientSocketA.Send(result, 0, revceiveNumber, SocketFlags.None);
 } 
 else
 {
 myClientSocket.Send(Encoding.ASCII.GetBytes("the people is not online! Send Failed!"));
 Console.WriteLine("對(duì)方不在線上,發(fā)送失敗!");
 }

 }
 
 }
 catch(Exception ex)
 {
 Console.WriteLine(ex.Message);
 myClientSocket.Shutdown(SocketShutdown.Both);
 myClientSocket.Close();
 break;

 }
 }

 }
 }
}

Client端代碼(因?yàn)槎疾畈欢?就只貼一個(gè)了) 

namespace SocketClient
{
 class Program
 {
 private static byte[] result = new byte[1024];
 private static Socket clientSocket;
 private static void ListenServer()
 {
 while (true)
 {
 result = new byte[1024];
 int receiveLength = clientSocket.Receive(result);
 
 Console.WriteLine("{0}", Encoding.ASCII.GetString(result, 0, receiveLength));
 }
 
 }
 static void Main(string[] args)
 {

 IPAddress ip = IPAddress.Parse("127.0.0.1");
 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
 try
 {
 clientSocket.Connect(ip, 8885);
 Console.WriteLine("連接成功!");

 }
 catch (Exception e)
 {
 Console.WriteLine("連接失敗!");
 return;
 }
 Thread threadRead = new Thread(ListenServer);
 threadRead.Start();
 

 while(true)
 {
 try
 {
 Thread.Sleep(1000);
 string sendMessage = Console.ReadLine();
 clientSocket.Send(Encoding.ASCII.GetBytes("Sylvia:"+sendMessage));
 
 }
 catch (Exception ex)
 {
 clientSocket.Shutdown(SocketShutdown.Both);
 clientSocket.Close();
 break;
 }

 }
 Console.WriteLine("發(fā)送完畢 按回車退出");
 Console.ReadKey();
 }
 }
}

寫的時(shí)候要特別注意一下Send信息的時(shí)候,注意byte[]的傳輸大小,很容易變成byte[]數(shù)組的大小而不是內(nèi)容的大小。 

這個(gè)大家就自己嘗試吧。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信

C#利用服務(wù)器實(shí)現(xiàn)客戶端之間通信:先來(lái)講述下我自己對(duì)于整個(gè)Socket通信過(guò)程的理解,畢竟初學(xué),說(shuō)錯(cuò)見(jiàn)諒,知道錯(cuò)了會(huì)改正~ 首先在服務(wù)端新建一個(gè)serverSocket,對(duì)其進(jìn)行初始化(一般包含AddressFamily:IP地址類型,SocketType:Socket傳輸數(shù)據(jù)方式,ProtoType:傳輸協(xié)議); 接
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 在线观看黄a大片爽爽影院免费 | 欧洲97色综合成人网 | 欧美亚洲综合另类在线观看 | 国产在线视频在线 | 国产精品视频久久久 | 色 在线播放 | 一级毛片一级毛片一级毛片 | 欧美日韩另类国产 | 亚洲国产综合专区在线电影 | 黄毛片免费 | 日韩第七页 | 国产成人久久综合二区 | 国产91久久精品一区二区 | 久久91精品国产91久久跳舞 | 特一级大黄在线观看 | 国产成人精品第一区二区 | 精品国产高清自在线一区二区三区 | 国产精品成人久久久久久久 | 高清国产精品久久 | 看毛片的网站 | 亚洲欧美在线视频观看 | 欧美另类网 | a毛片免费| 亚洲欧美日韩网站 | 99精品在免费线视频 | 国产精品视频第一页 | 欧美日韩亚洲一区二区三区 | 欧美夜夜爽 | 欧美在线播放视频 | 欧美在线不卡视频 | 亚洲另类网 | 久久亚洲伊人中字综合精品 | 韩国精品欧美一区二区三区 | 国产日韩高清一区二区三区 | 日韩精品影视 | 欧美日韩国产综合在线 | 一级免费a | 手机在线观看国产精选免费 | 欧美国产精品 | 国产欧美一区二区三区鸳鸯浴 | 久久精品1|