国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

C#-Socket監(jiān)聽消息處理

2019-11-10 18:18:34
字體:
供稿:網(wǎng)友

搬運整合三個使用C#實現(xiàn)Socket編程的例子,包含服務(wù)器端和客戶端。

原文鏈接:

C# socket監(jiān)聽

C#-Socket監(jiān)聽消息處理

基于C#的socket編程的TCP同步實現(xiàn)

按照鏈接順序貼上原文。

例子一:

網(wǎng)絡(luò)通訊流程如上

服務(wù)器:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace _06Server{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        PRivate void btnStart_Click(object sender, EventArgs e)        {            try            {                //當點擊開始監(jiān)聽的時候 在服務(wù)器端創(chuàng)建一個負責監(jiān)ip地址跟端口號的Socket                Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text);                //創(chuàng)建端口號對象                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));                //監(jiān)聽                socketWatch.Bind(point);                ShowMsg("監(jiān)聽成功");                socketWatch.Listen(10);                Thread th = new Thread(Listen);                th.IsBackground = true;                th.Start(socketWatch);            }            catch            {                           }        }        /// <summary>        /// 等待客戶端的連接 并且創(chuàng)建與之通信用的Socket        /// </summary>        ///         Socket socketSend;        void Listen(object o)        {            Socket socketWatch = o as Socket;            //等待客戶端的連接 并且創(chuàng)建一個負責通信的Socket            while (true)            {                try                {                    //負責跟客戶端通信的Socket                    socketSend = socketWatch.Accept();                    //將遠程連接的客戶端的IP地址和Socket存入集合中                    dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);                    //將遠程連接的客戶端的IP地址和端口號存儲下拉框中                    cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());                    //192.168.11.78:連接成功                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "連接成功");                    //開啟 一個新線程不停的接受客戶端發(fā)送過來的消息                    Thread th = new Thread(Recive);                    th.IsBackground = true;                    th.Start(socketSend);                }                catch                { }            }        }        //將遠程連接的客戶端的IP地址和Socket存入集合中        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();        /// <summary>        /// 服務(wù)器端不停的接受客戶端發(fā)送過來的消息        /// </summary>        /// <param name="o"></param>        void Recive(object o)        {            Socket socketSend = o as Socket;            while (true)            {                try                {                    //客戶端連接成功后,服務(wù)器應(yīng)該接受客戶端發(fā)來的消息                    byte[] buffer = new byte[1024 * 1024 * 2];                    //實際接受到的有效字節(jié)數(shù)                    int r = socketSend.Receive(buffer);                    if (r == 0)                    {                        break;                    }                    string str = Encoding.UTF8.GetString(buffer, 0, r);                    ShowMsg(socketSend.RemoteEndPoint + ":" + str);                }                catch                { }            }        }        void ShowMsg(string str)        {            txtLog.AppendText(str + "/r/n");        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }        /// <summary>        /// 服務(wù)器給客戶端發(fā)送消息        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSend_Click(object sender, EventArgs e)        {            string str = txtMsg.Text;            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);            List<byte> list = new List<byte>();            list.Add(0);            list.AddRange(buffer);            //將泛型集合轉(zhuǎn)換為數(shù)組            byte[] newBuffer = list.ToArray();            //buffer = list.ToArray();不可能            //獲得用戶在下拉框中選中的IP地址            string ip = cboUsers.SelectedItem.ToString();            dicSocket[ip].Send(newBuffer);            //     socketSend.Send(buffer);        }        /// <summary>        /// 選擇要發(fā)送的文件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSelect_Click(object sender, EventArgs e)        {            OpenFileDialog ofd = new OpenFileDialog();            ofd.InitialDirectory = @"C:/Users/SpringRain/Desktop";            ofd.Title = "請選擇要發(fā)送的文件";            ofd.Filter = "所有文件|*.*";            ofd.ShowDialog();            txtPath.Text = ofd.FileName;        }        private void btnSendFile_Click(object sender, EventArgs e)        {            //獲得要發(fā)送文件的路徑            string path = txtPath.Text;            using (FileStream fsRead = new FileStream(path, FileMode.Open, Fileaccess.Read))            {                byte[] buffer = new byte[1024 * 1024 * 5];                int r = fsRead.Read(buffer, 0, buffer.Length);                List<byte> list = new List<byte>();                list.Add(1);                list.AddRange(buffer);                byte[] newBuffer = list.ToArray();                dicSocket[cboUsers.SelectedItem.ToString()].Send(newBuffer, 0, r+1, SocketFlags.None);            }        }        /// <summary>        /// 發(fā)送震動        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnZD_Click(object sender, EventArgs e)        {            byte[] buffer = new byte[1];            buffer[0] = 2;            dicSocket[cboUsers.SelectedItem.ToString()].Send(buffer);        }    }}客戶端:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace _07Client{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        Socket socketSend;        private void btnStart_Click(object sender, EventArgs e)        {            try            {                //創(chuàng)建負責通信的Socket                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPAddress ip = IPAddress.Parse(txtServer.Text);                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));                //獲得要連接的遠程服務(wù)器應(yīng)用程序的IP地址和端口號                socketSend.Connect(point);                ShowMsg("連接成功");                //開啟一個新的線程不停的接收服務(wù)端發(fā)來的消息                Thread th = new Thread(Recive);                th.IsBackground = true;                th.Start();            }            catch            { }                    }        /// <summary>        /// 不停的接受服務(wù)器發(fā)來的消息        /// </summary>        void Recive()        {            while (true)            {                try                {                    byte[] buffer = new byte[1024 * 1024 * 3];                    int r = socketSend.Receive(buffer);                    //實際接收到的有效字節(jié)數(shù)                    if (r == 0)                    {                        break;                    }                    //表示發(fā)送的文字消息                    if (buffer[0] == 0)                    {                        string s = Encoding.UTF8.GetString(buffer, 1, r-1);                        ShowMsg(socketSend.RemoteEndPoint + ":" + s);                    }                    else if (buffer[0] == 1)                    {                        SaveFileDialog sfd = new SaveFileDialog();                        sfd.InitialDirectory = @"C:/Users/SpringRain/Desktop";                        sfd.Title = "請選擇要保存的文件";                        sfd.Filter = "所有文件|*.*";                        sfd.ShowDialog(this);                        string path = sfd.FileName;                        using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))                        {                            fsWrite.Write(buffer, 1, r - 1);                        }                        MessageBox.Show("保存成功");                    }                    else if (buffer[0] == 2)                    {                        ZD();                    }                                }                catch { }            }        }        /// <summary>        /// 震動        /// </summary>        void ZD()        {            for (int i = 0; i < 500; i++)            {                this.Location = new Point(200, 200);                this.Location = new Point(280, 280);            }        }        void ShowMsg(string str)        {            txtLog.AppendText(str + "/r/n");        }        /// <summary>        /// 客戶端給服務(wù)器發(fā)送消息        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSend_Click(object sender, EventArgs e)        {            string str = txtMsg.Text.Trim();            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);            socketSend.Send(buffer);        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }        private void txtServer_TextChanged(object sender, EventArgs e)        {        }    }}例子二:

TCP/IP:Transmission Control Protocol/Internet Protocol,傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又名網(wǎng)絡(luò)通訊協(xié)議。簡單來說:TCP控制傳輸數(shù)據(jù),負責發(fā)現(xiàn)傳輸?shù)膯栴},一旦有問題就發(fā)出信號,要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡兀鳬P是負責給因特網(wǎng)中的每一臺電腦定義一個地址,以便傳輸。TCP協(xié)議在許多分布式應(yīng)用程序中進行消息命令傳遞是必不可少的部分。

TCP通信的三次握手:三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務(wù)器總共發(fā)送3個包。

第一次握手:客戶端發(fā)送一個TCP的SYN標志位置1的包指明客戶打算連接的服務(wù)器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里。第二次握手:服務(wù)器發(fā)回確認包(ACK)應(yīng)答。即SYN標志位和ACK標志位均為1同時,將確認序號(Acknowledgement Number)設(shè)置為客戶的I S N加1以.即X+1。第三次握手:客戶端再次發(fā)送確認包(ACK) SYN標志位為0,ACK標志位為1.并且把服務(wù)器發(fā)來ACK的序號字段+1,放在確定字段中發(fā)送給對方.并且在數(shù)據(jù)段放寫ISN的+1

先看下服務(wù)端Socket監(jiān)聽代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace SocketDome{    /// <summary>    /// 處理Socket監(jiān)聽邏輯    /// </summary>    public class SocketProvider    {        private static Socket serviceSocketListener; //Socke監(jiān)聽處理請求        /// <summary>        /// 開啟Socket監(jiān)聽        /// </summary>        public static void Init()        {            serviceSocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            serviceSocketListener.Bind(new IPEndPoint(IPAddress.Parse("10.0.0.217"), 20000)); //IP和端口應(yīng)該是可配置            serviceSocketListener.Listen(1024);            Thread handleSocket = new Thread(new ThreadStart(HandleSocket));            handleSocket.Start();        }        /// <summary>        /// 監(jiān)聽鏈接        /// </summary>        private static void HandleSocket()        {            while (true)            {                try                {                    Socket currSocket = serviceSocketListener.Accept();  //為新建連接創(chuàng)建新的 System.Net.Sockets.Socket                    Thread processThread = new Thread(new ParameterizedThreadStart(ProcessSocket));                    processThread.Start(currSocket);                }                catch { }            }        }        /// <summary>        /// 處理Socket信息        /// </summary>        /// <param name="obj">新建連接創(chuàng)建新Socket對象</param>        private static void ProcessSocket(object obj)        {            Socket currSocket = (Socket)obj;            try            {                byte[] recvBytess = new byte[1048576];                int recbytes;                recbytes = currSocket.Receive(recvBytess, recvBytess.Length, 0);                if (recbytes > 0)                {                    var contentStr = Encoding.UTF8.GetString(recvBytess, 0, recbytes);                    var _order = contentStr.Split('~');                    byte[] sendPass = Encoding.UTF8.GetBytes(_order[0].ToUpper() + "#SUCCESS"); //先相應(yīng)對話,然后去異步處理                    currSocket.Send(sendPass, sendPass.Length, SocketFlags.None);                    switch (_order[0].ToUpper())                    {                         case"ADDCACHE":                            Console.WriteLine("添加緩存消息" + _order[1]);                           //處理ADDCACHE邏輯                           Console.WriteLine("寫Log日志");                            break;                        default :                            Console.WriteLine("命令錯誤");                            Console.WriteLine("寫Log日志");                            break;                    }                }            }            catch (Exception ex)            {                Console.WriteLine("寫Error日志" + ex.Message);            }        }    }}

這個服務(wù)端,監(jiān)聽著客戶端發(fā)來的命令,格式定義為:命令~參數(shù),在服務(wù)端接受到客戶端的命令消息后立即回傳接到命令并開始處理,進行異步處理避免客戶端等待。

下面看下客戶端的Socket客戶端主動請求服務(wù)端代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;namespace Consoleapplication7{    /// <summary>    /// Socket Helper    /// </summary>    public class SocketHelper    {        private string ip;        private IPEndPoint ex;        private Socket socket;        public SocketHelper(string ip, int port)        {            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            this.ip = ip;            this.ex = new IPEndPoint(IPAddress.Parse(ip), port);        }        /// <summary>        /// Socket 進行連接        /// </summary>        /// <returns>連接失敗OR成功</returns>        public bool Socketlink()        {            try            {                socket.Connect(ex);                return true;            }            catch (Exception ex)            {                return false;            }        }        /// <summary>        /// Socket 發(fā)送消息        /// </summary>        /// <param name="strmsg">消息</param>        public void SendVarMessage(string strmsg)        {            try            {                byte[] msg = System.Text.Encoding.UTF8.GetBytes(strmsg);                this.socket.Send(msg);            }            catch (Exception ex)            {                this.socket.Close();            }        }        /// <summary>        /// Socket 消息回傳        /// </summary>        /// <returns></returns>        public string ReceiveMessage()        {            try            {                byte[] msg = new byte[1048576];                int recv = socket.Receive(msg);                this.socket.Close();                return System.Text.Encoding.UTF8.GetString(msg, 0, recv);            }            catch (Exception ex)            {                this.socket.Close();                return "ERROR";            }        }    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication7{    class Program    {        static void Main(string[] args)        {            SocketHelper socket = new SocketHelper("10.0.0.217",20000);            if(socket.Socketlink())            {                Console.WriteLine("連接成功");                socket.SendVarMessage("ADDCACHE~張三");                string strReposon = socket.ReceiveMessage();                Console.WriteLine(strReposon);            }            Console.Read();        }    }}首先以管理園身份開啟服務(wù)端查詢,然后客戶端主動請求服務(wù)端進行消息請求。

例子三:

一、摘要

  總結(jié)一下基于C#的TCP傳輸協(xié)議的涉及到的常用方法及同步實現(xiàn)。

二、實驗平臺

  Visual Studio 2010

三、socket編程的一些常用方法(同步實現(xiàn))

3.1 命名空間

  需要添加的命名空間

using System.Net;using System.Net.Socket;

3.2 構(gòu)造新的socket對象

socket原型:
public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)

(1) AddressFamily 用來指定socket解析地址的尋址方案,Inte.Network標示需要ip版本4的地址,Inte.NetworkV6需要ip版本6的地址;

(2) SocketType 參數(shù)指定socket類型,Raw支持基礎(chǔ)傳輸協(xié)議訪問,Stream支持可靠,雙向,基于連接的數(shù)據(jù)流;

(3) ProtocolType 表示socket支持的網(wǎng)絡(luò)協(xié)議,如常用的TCP和UDP協(xié)議。

3.3 定義主機對象(1) IPEndPoint類

原型:

a)  

public IPEndPoint(IPAddress address,int port)  

參數(shù)address可以直接填寫主機的IP,如"192.168.2.1";

b)

public IPEndPoint(long address,int port)

參數(shù)address整型int64如123456,參數(shù)port端口int32,如6655。

(2) 利用DNS服務(wù)器解析主機,使用Dns.Resolve方法

原型:

public static IPHostEntry Resolve(string hostname)

參數(shù):待解析的主機名稱,返回IPHostEntry類值,IPHostEntry為Inte.Net主機地址信息提供容器,該容器提供存有IP地址列表,主機名稱等。

(3) Dns.GetHostByName獲取本地主機名稱

原型:

public static IPHostEntry GetHostByName(string hostname)

(4) GetHostByAddress

原型:

a)

public static IPHostEntry GetHostByAddress(IPAddress address)

參數(shù):IP地址。

b)

public static IPHostEntry GetHostByAddress(string address)

參數(shù):IP地址格式化字符串。

3.4 端口綁定和監(jiān)聽

  同步套接字服務(wù)器主機的綁定和端口監(jiān)聽,Socket類的Bind(綁定主機),Listen(監(jiān)聽端口),Accept(接收客戶端的連接請求)。

(1) Bind

原型:

public void Bind(EndPoint LocalEP)

參數(shù)為主機對象 IPEndPoint

(2) Listen

原型:

public void Listen(int backlog)

參數(shù)整型數(shù)值,掛起隊列最大值

(3) accept

原型:

public socket accept()

返回為套接字對象

3.5 socket的發(fā)送和接收方法

(1) 發(fā)送數(shù)據(jù)

a)socket類的send方法

原型一:

public int Send(byte[] buffer)

參數(shù):待發(fā)送的字節(jié)數(shù)組;

原型二:

public int Send(byte[],SocketFlags)

SocketFlags成員列表:

DontRoute不使用路由表發(fā)送,

MaxIOVectorLength為發(fā)送和接收數(shù)據(jù)的wsabuf結(jié)構(gòu)數(shù)量提供標準值,

None 不對次調(diào)用使用標志,

OutOfBand消息的部分發(fā)送或接收,

Partial消息的部分發(fā)送或接收,

Peek查看傳入的消息。

原型三:

public int Send(byte[],int,SocketFlags)

參數(shù)二要發(fā)送的字節(jié)數(shù)

原型四:

public int Send(byte[],int,int,SocketFlags)

參數(shù)二為Byte[]中開始發(fā)送的位置

b) NetWordStream類的Write方法

原型:

public override void write(byte[] buffer,int offset,int size)

參數(shù)分別為:字節(jié)數(shù)組,開始字節(jié)位置,總字節(jié)數(shù)。

(2) 接收數(shù)據(jù)

a) Socket類Receive方法

原型一:

public int Receive(byte[] buffer) 原型二:

public int Receive(byte[],SocketFlags)原型三:

public int Receive(byte[],int,SocketFlags)  

原型四:

public int Receive(byte[],int,int,SocketFlags)

Socket類Receive方法的相關(guān)參數(shù)可參看Socket類Send方法中的參數(shù)。

b) NetworkStream類的Read方法

public override int Read(int byte[] buffer,int offset,int size)

參數(shù)可參看NetworkStream類的Write方法。

四、TCP傳輸協(xié)議的同步實現(xiàn)

 4.1 服務(wù)器端編程的步驟:

 (1) 創(chuàng)建套接字;

 (2) 綁定套接字到一個IP地址和一個端口上(bind());

 (3)將套接字設(shè)置為監(jiān)聽模式等待連接請求(listen());

 (4)請求到來后,接受連接請求,返回一個新的對應(yīng)于此次連接的套接字(accept());

 (5)用返回的套接字和客戶端進行通信(send()/recv());

 (6)返回,等待另一連接請求;

 (7)關(guān)閉套接字。

服務(wù)器端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Collections.Generic;using System.Text;namespace net{    class Program    {        static void Main(string[] args)        {            //定義接收數(shù)據(jù)長度變量            int recv;            //定義接收數(shù)據(jù)的緩存            byte[] data = new byte[1024];            //定義偵聽端口            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5566);            //定義套接字類型            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //連接            socket.Bind(ipEnd);            //開始偵聽            socket.Listen(10);            //控制臺輸出偵聽狀態(tài)            Console.Write("Waiting for a client");            //一旦接受連接,創(chuàng)建一個客戶端            Socket client = socket.Accept();            //獲取客戶端的IP和端口            IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;            //輸出客戶端的IP和端口            Console.Write("Connect with {0} at port {1}", ipEndClient.Address, ipEndClient.Port);            //定義待發(fā)送字符            string welcome = "Welcome to my server";            //數(shù)據(jù)類型轉(zhuǎn)換            data = Encoding.ASCII.GetBytes(welcome);            //發(fā)送            client.Send(data, data.Length, SocketFlags.None);            while (true)            {                //對data清零                data = new byte[1024];                //獲取收到的數(shù)據(jù)的長度                recv = client.Receive(data);                //如果收到的數(shù)據(jù)長度為0,則退出                if (recv == 0)                    break;                //輸出接收到的數(shù)據(jù)                Console.Write(Encoding.ASCII.GetString(data, 0, recv));                //將接收到的數(shù)據(jù)再發(fā)送出去                client.Send(data, recv, SocketFlags.None);            }            Console.Write("Disconnect form{0}", ipEndClient.Address);            client.Close();            socket.Close();        }    }}

4.2 客戶端編程的步驟:

(1) 創(chuàng)建套接字;

(2) 向服務(wù)器發(fā)出連接請求(connect());

(3) 和服務(wù)器端進行通信(send()/recv());

(4) 關(guān)閉套接字。

客戶端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Collections.Generic;using System.Text;namespace client{    class Program    {        static void Main(string[] args)        {            //定義發(fā)送數(shù)據(jù)緩存            byte[] data = new byte[1024];            //定義字符串,用于控制臺輸出或輸入            string input, stringData;            //定義主機的IP及端口            IPAddress ip = IPAddress.Parse("127.0.0.1");            IPEndPoint ipEnd = new IPEndPoint(ip, 5566);            //定義套接字類型            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //嘗試連接            try            {                socket.Connect(ipEnd);            }            //異常處理            catch (SocketException e)            {                Console.Write("Fail to connect server");                Console.Write(e.ToString());                return;            }            //定義接收數(shù)據(jù)的長度            int recv = socket.Receive(data);            //將接收的數(shù)據(jù)轉(zhuǎn)換成字符串            stringData = Encoding.ASCII.GetString(data, 0, recv);            //控制臺輸出接收到的數(shù)據(jù)            Console.Write(stringData);            //定義從鍵盤接收到的字符串            input = Console.ReadLine();            //將從鍵盤獲取的字符串轉(zhuǎn)換成整型數(shù)據(jù)并存儲在數(shù)組中                data = Encoding.ASCII.GetBytes(input);            //發(fā)送該數(shù)組            socket.Send(data, data.Length, SocketFlags.None);            while (true)            {                //                //如果字符串是"exit",退出while循環(huán)                if (input == "exit")                {                    break;                }                //對data清零                data = new byte[1024];                //定義接收到的數(shù)據(jù)的長度                recv = socket.Receive(data);                //將接收到的數(shù)據(jù)轉(zhuǎn)換為字符串                stringData = Encoding.ASCII.GetString(data, 0, recv);                //控制臺輸出字符串                Console.Write(stringData);                //發(fā)送收到的數(shù)據(jù)                socket.Send(data, recv, 0);            }            Console.Write("disconnect from server");            socket.Shutdown(SocketShutdown.Both);            socket.Close();        }    }}上述代碼實現(xiàn)了,當連接建立之后,客戶端向服務(wù)器端發(fā)送鍵盤輸入的字符,服務(wù)器端收到字符后,顯示在控制臺并發(fā)送給客戶端,客戶端收到字符后,顯示在控制臺并再次發(fā)送給服務(wù)器端,如此循環(huán)。

五、實驗結(jié)果

  先后運行服務(wù)器端程序和客戶端程序,控制臺界面如下:

圖1 服務(wù)器端控制臺

  當連接建立后,服務(wù)器端控制臺顯示等待客戶端的狀態(tài)"Waiting for a client",并打印出連接信息。

圖2 客戶端控制臺

  當連接建立后,客戶端收到來自服務(wù)器端發(fā)送的字符串"Welcome to my server"。

  之后,客戶端通過鍵盤發(fā)送數(shù)據(jù),二者循環(huán)接收并發(fā)送,控制臺分別如下:

圖3 服務(wù)器控制臺

圖4 客戶端控制臺

六、幾點說明

6.1 傳輸速度

  (1) 增大發(fā)送和接收的數(shù)組可提升傳輸速度,即增加一次實際發(fā)送數(shù)據(jù)的數(shù)量可以提高傳輸速度,但數(shù)組中數(shù)據(jù)的個數(shù)也不能一味的增大。需要說明的,由于地層MIT的限制,底層具體實現(xiàn)的時候每次發(fā)送的數(shù)據(jù)仍是不超過1510個的。

  (2) 將控制臺界面最小化后,速度也會有翻倍的提升。

6.2 MFC的轉(zhuǎn)換

  為了使傳輸協(xié)議更有可觀性和使用性,通常做成MFC的樣式,具體的使用已在基于TCP協(xié)議的網(wǎng)絡(luò)攝像頭的設(shè)計與實現(xiàn)應(yīng)用。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 当涂县| 吉安县| 翁牛特旗| 南平市| 中西区| 宁乡县| 江都市| 习水县| 综艺| 临桂县| 东平县| 丽江市| 胶南市| 芦溪县| 安吉县| 民县| 长阳| 宜君县| 鹤壁市| 松江区| 枣庄市| 吴旗县| 丁青县| 仪征市| 特克斯县| 钦州市| 盐山县| 静海县| 奉贤区| 卢湾区| 阜康市| 历史| 台北市| 延长县| 泰安市| 哈密市| 海林市| 年辖:市辖区| 门头沟区| 南漳县| 剑河县|