C#中Socket通信用法实例详解
本文實(shí)例講述了C#中Socket通信用法。分享給大家供大家參考。具體如下:
一、UDP方式:
服務(wù)器端代碼:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static void Main(string[] args) { ??int recv; ??byte[] data = new byte[1024]; ??IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定義一網(wǎng)絡(luò)端點(diǎn) ??Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//定義一個(gè)Socket ??newsock.Bind(ipep);//Socket與本地的一個(gè)終結(jié)點(diǎn)相關(guān)聯(lián) ??Console.WriteLine("Waiting for a client.."); ??IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);//定義要發(fā)送的計(jì)算機(jī)的地址 ??EndPoint Remote = (EndPoint)(sender);// ??recv = newsock.ReceiveFrom(data, ref Remote);//接受數(shù)據(jù)????? ??Console.WriteLine("Message received from{0}:", Remote.ToString()); ??Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ??string welcome = "Welcome to my test server!"; ??data = Encoding.ASCII.GetBytes(welcome); ??newsock.SendTo(data, data.Length, SocketFlags.None, Remote); ??while (true) ??{ ????data = new byte[1024]; ????recv = newsock.ReceiveFrom(data, ref Remote); ????Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ????newsock.SendTo(data, recv, SocketFlags.None, Remote); ??} } |
客戶端代碼:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | void MainInfo() { ??byte[] data = new byte[1024];//定義一個(gè)數(shù)組用來做數(shù)據(jù)的緩沖區(qū) ??string input, stringData; ??IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("192.168.1.21"), 9050); ??Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ??string welcome = "Hello,are you there?"; ??data = Encoding.ASCII.GetBytes(welcome); ??server.SendTo(data, data.Length, SocketFlags.None, ipep);//將數(shù)據(jù)發(fā)送到指定的終結(jié)點(diǎn) ??IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); ??EndPoint Remote = (EndPoint)sender; ??data = new byte[1024]; ??int recv = server.ReceiveFrom(data, ref Remote);//接受來自服務(wù)器的數(shù)據(jù) ??Console.WriteLine("Message received from{0}:", Remote.ToString()); ??Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); ??while (true)//讀取數(shù)據(jù) ??{ ????input = richTextBox1.Text;//從鍵盤讀取數(shù)據(jù) ????if (input == "text")//結(jié)束標(biāo)記 ????{ ??????break; ????} ????server.SendTo(Encoding.ASCII.GetBytes(input), Remote);//將數(shù)據(jù)發(fā)送到指定的終結(jié)點(diǎn)Remote ????data = new byte[1024]; ????recv = server.ReceiveFrom(data, ref Remote);//從Remote接受數(shù)據(jù) ????stringData = Encoding.ASCII.GetString(data, 0, recv); ????Console.WriteLine(stringData); ??} ??Console.WriteLine("Stopping client"); ??server.Close(); } |
二、TCP方式:
服務(wù)器端代碼:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | Socket serverSocket = null; Thread clientThread = null; Socket clientSocket = null; Thread thread = null; IPAddress ips = null; PEndPoint ipep = null; void ServerStart() { ??ips = Dns.GetHostAddresses(Dns.GetHostName())[0]; ??//創(chuàng)建IPEndPoint實(shí)例? ??ipep = new IPEndPoint(ips, 9050); ??//創(chuàng)建一個(gè)套接字? ??serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ??serverSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); ??//將所創(chuàng)建的套接字與IPEndPoint綁定? ??serverSocket.Bind(ipep); ??//設(shè)置套接字為收聽模式? ??serverSocket.Listen(20); ??while (listenalive) ??{ ????try ????{ ??????//在套接字上接收接入的連接? ??????clientSocket = serverSocket.Accept(); ??????clientThread = new Thread(new ParameterizedThreadStart(ReceiveData)); ??????clientThread.Start(clientSocket); ????} ????catch (Exception ex) ????{ ??????WriteErrorLog(ex.Message); ??????serverSocket.Close(); ??????serverSocket = null; ????} ??} } static void ReceiveData(object obj) { ??bool keepalive = true; ??Socket s = obj as Socket; ??Byte[] buffer = new Byte[1024]; ??//根據(jù)收聽到的客戶端套接字向客戶端發(fā)送信息? ??IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint; ??Console.WriteLine("客戶端ip:" + clientep.Address + " 端口:" + clientep.Port); ??string welcome = "連接服務(wù)器成功"; ??buffer = System.Text.Encoding.Unicode.GetBytes(welcome); ??//向客戶端發(fā)送“連接服務(wù)器成功”消息 ??s.Send(buffer, buffer.Length, SocketFlags.None); ??buffer = new Byte[1024]; ??int bufLen = 0; ??string content = string.Empty; ??while (true) ??{ ????//在套接字上接收客戶端發(fā)送的信息? ????bufLen = 0; ????try ????{ ??????bufLen = s.Receive(buffer); ??????if (bufLen == 0) ??????{ ????????break; ??????} ??????content += System.Text.Encoding.Unicode.GetString(buffer, 0, bufLen); ????} ????catch (Exception ex) ????{ ??????break; ; ????} ??} ??Send(s, content); ??s = null; ??buffer = null; ??clientep = null; ??Thread.CurrentThread.Abort(); } |
客戶端代碼:
?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | void Send(string content) { ??byte[] data = new byte[1024]; ??newclient = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); ??ie = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ipadd), port);//服務(wù)器的IP和端口 ??try ??{ ????//因?yàn)榭蛻舳酥皇怯脕硐蛱囟ǖ姆?wù)器發(fā)送信息,所以不需要綁定本機(jī)的IP和端口。不需要監(jiān)聽。 ????newclient.Connect(ie); ??} ??catch (System.Net.Sockets.SocketException e) ??{ ????Console.WriteLine(e.ToString()); ????return; ??} ??int recv = newclient.Receive(data); ??//連接服務(wù)器成功 ??string stringdata = System.Text.Encoding.Unicode.GetString(data, 0, recv); ??if (stringdata == "連接服務(wù)器成功") ??{ ????newclient.Send(System.Text.Encoding.Unicode.GetBytes(content)); ????newclient.Shutdown(System.Net.Sockets.SocketShutdown.Send); ????data = new byte[1024]; ????recv = newclient.Receive(data); ????string result = System.Text.Encoding.Unicode.GetString(data, 0, recv);???? ????newclient.Shutdown(System.Net.Sockets.SocketShutdown.Receive); ????newclient.Close(); ????MessageBox.Show(result); ??} ??else ??{ ????MessageBox.Show("連接服務(wù)器失敗", "友情提示"); ??} } |
希望本文所述對大家的C#程序設(shè)計(jì)有所幫助。
總結(jié)
以上是生活随笔為你收集整理的C#中Socket通信用法实例详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#Process.Start无法启动e
- 下一篇: c#中udp客户端连接遇到的问题 “远