socket入门教程
生活随笔
收集整理的這篇文章主要介紹了
socket入门教程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Server.cs ? 服務端程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using System.Net; using System.Net.Sockets;namespace SocketTest {public partial class Server : Form{Thread serverThread; //服務端線程Thread clientThread; //客戶端線程Socket serverSocket; //服務端socketSocket clientSocket; //客戶端socketpublic Server(){InitializeComponent();}private void ServerStart(){//創建IPEndPoint實例IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 6001);//創建一個套接字serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將所創建的套接字與IPEndPoint綁定 serverSocket.Bind(ipep);//設置套接字為收聽模式serverSocket.Listen(10);/*** 通過serverSocket.Accept()來接收客戶Socket的連接請求,* 在這里用循環可以實現該線程實時偵聽,而不是只偵聽一次。* 當程序運行serverSocket.Accept()時,會等待,直到有客戶端Socket發起連接請求時,* 獲取該客戶Socket,如上面的clientSocket。在這里我用多線程來實現與多個客戶端Socket的連接和通信,* 一旦接收到一個連接后,就新建一個線程,執行ReceiveData功能來實現信息的發送和接收。*/while (true){try{//在套接字上接收接入的連接clientSocket = serverSocket.Accept();clientThread = new Thread(new ThreadStart(ReceiveData));clientThread.Start();}catch (Exception ex){MessageBox.Show("listening Error: " + ex.Message);}}}/*** 通過IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;* 我們可以獲取連接上的遠程主機的端口和IP地址,如果想查詢該主機的其它屬性如主機名等,* 可用于上一篇講的Dns.GetHostByAddress(string ipAddress)來返回一個IPHostEntry對象,就可以得到。* 另外我們要注意的是,通過Socket發送信息,必須要先把發送的信息轉化成二進字進行傳輸,* 收到信息后也要把收到的二進字信息轉化成字符形式,* 這里可以通過Encoding.ASCII.GetBytes(welcome);和Encoding.ASCII.GetString(buffer).Substring(0, bufLen);來實現。* 以上就是服務端Socket偵聽模式的實現,只要有遠程客戶端Socket連接上后,就可以輕松的發送信息和接收信息了。* 下面我們來看看客戶端Socket是怎么連接上服務器的。**/private void ReceiveData(){bool keepalive = true;Socket s = clientSocket;Byte[] buffer = new Byte[1024];//根據收聽到的客戶端套接字向客戶端發送信息IPEndPoint clientep = (IPEndPoint)s.RemoteEndPoint;this.Invoke(new MethodInvoker(() =>{lstServer.Items.Add("Client:" + clientep.Address + "(" + clientep.Port + ")");}));string welcome = "Welcome to my test sever ";byte[] data = new byte[1024];data = Encoding.ASCII.GetBytes(welcome);s.Send(data, data.Length, SocketFlags.None);while (keepalive){//在套接字上接收客戶端發送的信息int bufLen = 0;try{bufLen = s.Available;s.Receive(buffer, 0, bufLen, SocketFlags.None);if (bufLen == 0)continue;}catch (Exception ex){MessageBox.Show("Receive Error:" + ex.Message);return;}clientep = (IPEndPoint)s.RemoteEndPoint;string clientcommand = System.Text.Encoding.ASCII.GetString(buffer).Substring(0, bufLen);this.Invoke(new MethodInvoker(() =>{lstServer.Items.Add(clientcommand + "(" + clientep.Address + ":" + clientep.Port + ")");}));}}private void btnOpen_Click(object sender, EventArgs e){serverThread = new Thread(new ThreadStart(ServerStart));serverThread.Start();lstServer.Items.Add("Server Start .....");}} }Client.cs(客戶端程序)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading;namespace Client {public partial class Client : Form{Socket clientSocket;Thread clientThread;public Client(){InitializeComponent();}/*** 客戶端Socket連接相對來說比較簡單了,另外說明一下,在執行客戶端連接前,服務端Socket偵聽必須先啟動,* 不然會提示服務器拒絕連接的信息。* 客戶端的發送信息和接收信息跟服務器的接收發送是一樣的,只不過一個是偵聽模式而另一個是連接模式。* 另外提一下,這里服務端開啟偵聽服務、客戶端連接服務端都采用線程方式來實現,這樣服務端能夠跟多個客戶端同時通信,不用等候,* 當然還有另外一種方式可以實現那就是異步socket.*/private void ConnectToServer(){byte[] data = new byte[1024];//創建一個套接字IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001);clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//將套接字與遠程服務器地址相連try{clientSocket.Connect(ipep);}catch (SocketException ex){MessageBox.Show("connect error: " + ex.Message);return;}while (true){//接收服務器信息int bufLen = 0;try{bufLen = clientSocket.Available;clientSocket.Receive(data, 0, bufLen, SocketFlags.None);if (bufLen == 0){continue;}}catch (Exception ex){MessageBox.Show("Receive Error:" + ex.Message);return;}string clientcommand = System.Text.Encoding.ASCII.GetString(data).Substring(0, bufLen);this.Invoke(new MethodInvoker(() =>{lstClient.Items.Add(clientcommand);}));//clientSocket.Shutdown(SocketShutdown.Both);//clientSocket.Close(); }}private void button1_Click(object sender, EventArgs e){clientThread = new Thread(new ThreadStart(ConnectToServer));clientThread.Start();}private void btnSend_Click(object sender, EventArgs e){//向服務器發送信息byte[] data = new byte[1024];data = Encoding.ASCII.GetBytes(txtClient.Text);clientSocket.Send(data, data.Length, SocketFlags.None);}} }?
轉載于:https://www.cnblogs.com/systemnet123/p/3237833.html
總結
以上是生活随笔為你收集整理的socket入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript- 省市联动代码
- 下一篇: [置顶] Spring中DI设置器注入