最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# winfroms使用socket客戶端服務(wù)端的示例代碼

 更新時(shí)間:2024年02月25日 09:06:40   作者:xcLeigh  
這篇文章主要為大家詳細(xì)介紹了C# winfroms使用socket客戶端服務(wù)端的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

C# winfroms使用socket客戶端服務(wù)端代碼詳解,聲明Socket 第一個(gè)參數(shù):尋址方式,第二個(gè)參數(shù):傳輸數(shù)據(jù)的方式,第三個(gè)參數(shù):通信協(xié)議Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 開啟偵聽 參數(shù)是指可以連接的客戶端數(shù)量socket.Listen(10);,socket.Accept();這里需要注意,Accept()會(huì)阻塞線程,直到連接上客戶端。如果放在主線程中,會(huì)阻塞前臺(tái)操作。需要?jiǎng)?chuàng)建一個(gè)新的線程。Accept()返回一個(gè)socket,客戶端連接上之后,服務(wù)端自動(dòng)生成一個(gè)socket和連接的客端通信。連接成功后,向客戶端發(fā)送“連接成功!”

1.通信相關(guān)說明

1.1服務(wù)端與客戶端

啟動(dòng)服務(wù)端后,服務(wù)端通過持續(xù)監(jiān)聽客戶端發(fā)來的請(qǐng)求,一旦監(jiān)聽到客戶端傳來的信息(請(qǐng)求),兩端便可以互發(fā)信息了.
服務(wù)端需要綁定一個(gè)IP,用于客戶端在網(wǎng)絡(luò)中尋找并建立連接(支持局域網(wǎng)內(nèi)部客戶端與服務(wù)端之間的互相通信)

1.2 信息發(fā)送原理

將手動(dòng)輸入字符串信息轉(zhuǎn)換成機(jī)器可以識(shí)別的字節(jié)數(shù)組,然后調(diào)用套接字的Send()方法將字節(jié)數(shù)組發(fā)送出去

1.3 信息接收原理

調(diào)用套接字的Receive()方法,獲取對(duì)端傳來的字節(jié)數(shù)組,然后將其轉(zhuǎn)換成人可以讀懂的字符串信息

2.socket代碼

2.1 客戶端代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
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 TcpMsgClient
{
    public partial class FrmClient : Form
    {
        public FrmClient()
        {
            InitializeComponent();
            //關(guān)閉對(duì)文本框的非法線程操作檢查
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }
        //創(chuàng)建 1個(gè)客戶端套接字 和1個(gè)負(fù)責(zé)監(jiān)聽服務(wù)端請(qǐng)求的線程
        Socket socketClient = null;
        Thread threadClient = null;

        /// <summary>
        /// 連接服務(wù)端事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnListenServer_Click(object sender, EventArgs e)
        {
            //定義一個(gè)套字節(jié)監(jiān)聽  包含3個(gè)參數(shù)(IP4尋址協(xié)議,流式連接,TCP協(xié)議)
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //需要獲取文本框中的IP地址
            IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim());
            //將獲取的ip地址和端口號(hào)綁定到網(wǎng)絡(luò)節(jié)點(diǎn)endpoint上
            IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim()));
            //這里客戶端套接字連接到網(wǎng)絡(luò)節(jié)點(diǎn)(服務(wù)端)用的方法是Connect 而不是Bind
            try
            {
                socketClient.Connect(endpoint);
                this.txtMsg.AppendText("客戶端連接服務(wù)端成功!" + "\r\n");
                this.btnListenServer.Enabled = false;
                //創(chuàng)建一個(gè)線程 用于監(jiān)聽服務(wù)端發(fā)來的消息
                threadClient = new Thread(RecMsg);
                //將窗體線程設(shè)置為與后臺(tái)同步
                threadClient.IsBackground = true;
                //啟動(dòng)線程
                threadClient.Start();
            }
            catch (Exception ex) {
                this.txtMsg.AppendText("遠(yuǎn)程服務(wù)端斷開,連接失?。? + "\r\n");
            }
        }

        /// <summary>
        /// 接收服務(wù)端發(fā)來信息的方法
        /// </summary>
        private void RecMsg()
        {
            while (true) //持續(xù)監(jiān)聽服務(wù)端發(fā)來的消息
            {
                try
                {
                    //定義一個(gè)1M的內(nèi)存緩沖區(qū) 用于臨時(shí)性存儲(chǔ)接收到的信息
                    byte[] arrRecMsg = new byte[1024 * 1024];
                    //將客戶端套接字接收到的數(shù)據(jù)存入內(nèi)存緩沖區(qū), 并獲取其長(zhǎng)度
                    int length = socketClient.Receive(arrRecMsg);
                    //將套接字獲取到的字節(jié)數(shù)組轉(zhuǎn)換為人可以看懂的字符串
                    string strRecMsg = Encoding.UTF8.GetString(arrRecMsg, 0, length);
                    //將發(fā)送的信息追加到聊天內(nèi)容文本框中
                    txtMsg.AppendText("服務(wù)端 " + GetCurrentTime() + "\r\n" + strRecMsg + "\r\n");
                }
                catch (Exception ex) {
                    this.txtMsg.AppendText("遠(yuǎn)程服務(wù)器已中斷連接!"+"\r\n");
                    this.btnListenServer.Enabled = true;
                    break;
                }
            }
        }

        /// <summary>
        /// 發(fā)送字符串信息到服務(wù)端的方法
        /// </summary>
        /// <param name="sendMsg">發(fā)送的字符串信息</param>
        private void ClientSendMsg(string sendMsg)
        {
            try {
                 //將輸入的內(nèi)容字符串轉(zhuǎn)換為機(jī)器可以識(shí)別的字節(jié)數(shù)組
                byte[] arrClientSendMsg = Encoding.UTF8.GetBytes(sendMsg);
                //調(diào)用客戶端套接字發(fā)送字節(jié)數(shù)組
                socketClient.Send(arrClientSendMsg);
                //將發(fā)送的信息追加到聊天內(nèi)容文本框中
                txtMsg.AppendText("天涯 " + GetCurrentTime() + "\r\n" + sendMsg + "\r\n");
            }
            catch(Exception ex){
                this.txtMsg.AppendText("遠(yuǎn)程服務(wù)器已中斷連接,無法發(fā)送消息!" + "\r\n");
            }
        }

        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            //調(diào)用ClientSendMsg方法 將文本框中輸入的信息發(fā)送給服務(wù)端
            ClientSendMsg(this.txtClientSendMsg.Text.Trim());
            this.txtClientSendMsg.Clear();
        }

        private void txtClientSendMsg_KeyDown(object sender, KeyEventArgs e)
        {
            //當(dāng)光標(biāo)位于文本框時(shí) 如果用戶按下了鍵盤上的Enter鍵
            if (e.KeyCode == Keys.Enter)
            {
                //則調(diào)用客戶端向服務(wù)端發(fā)送信息的方法
                ClientSendMsg(this.txtClientSendMsg.Text.Trim());
                this.txtClientSendMsg.Clear();
            }
        }

        /// <summary>
        /// 獲取當(dāng)前系統(tǒng)時(shí)間的方法
        /// </summary>
        /// <returns>當(dāng)前時(shí)間</returns>
        private DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }
    }
}

2.2 服務(wù)端代碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
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 TcpMsgServer
{
    public partial class FrmServer : Form
    {
        public FrmServer()
        {
            InitializeComponent();
            //關(guān)閉對(duì)文本框的非法線程操作檢查
            TextBox.CheckForIllegalCrossThreadCalls = false;
        }

        Thread threadWatch = null; //負(fù)責(zé)監(jiān)聽客戶端的線程
        Socket socketWatch = null;  //負(fù)責(zé)監(jiān)聽客戶端的套接字

        /// <summary>
        /// 啟動(dòng)服務(wù)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnServerConn_Click(object sender, EventArgs e)
        {
            try
            {
                //定義一個(gè)套接字用于監(jiān)聽客戶端發(fā)來的信息  包含3個(gè)參數(shù)(IP4尋址協(xié)議,流式連接,TCP協(xié)議)
                socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //服務(wù)端發(fā)送信息 需要1個(gè)IP地址和端口號(hào)
                IPAddress ipaddress = IPAddress.Parse(this.txtIP.Text.Trim()); //獲取文本框輸入的IP地址
                //將IP地址和端口號(hào)綁定到網(wǎng)絡(luò)節(jié)點(diǎn)endpoint上
                IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim())); //獲取文本框上輸入的端口號(hào)
                //監(jiān)聽綁定的網(wǎng)絡(luò)節(jié)點(diǎn)
                socketWatch.Bind(endpoint);
                //將套接字的監(jiān)聽隊(duì)列長(zhǎng)度限制為20
                socketWatch.Listen(20);
                //創(chuàng)建一個(gè)監(jiān)聽線程
                threadWatch = new Thread(WatchConnecting);
                //將窗體線程設(shè)置為與后臺(tái)同步
                threadWatch.IsBackground = true;
                //啟動(dòng)線程
                threadWatch.Start();
                //啟動(dòng)線程后 txtMsg文本框顯示相應(yīng)提示
                txtMsg.AppendText("開始監(jiān)聽客戶端傳來的信息!" + "\r\n");
                this.btnServerConn.Enabled = false;
            }
            catch (Exception ex) {
                txtMsg.AppendText("服務(wù)端啟動(dòng)服務(wù)失敗!" + "\r\n");
                this.btnServerConn.Enabled = true;
            }
        }

        //創(chuàng)建一個(gè)負(fù)責(zé)和客戶端通信的套接字
        Socket socConnection = null;

        /// <summary>
        /// 監(jiān)聽客戶端發(fā)來的請(qǐng)求
        /// </summary>
        private void WatchConnecting()
        {
            while (true)  //持續(xù)不斷監(jiān)聽客戶端發(fā)來的請(qǐng)求
            {
                socConnection = socketWatch.Accept();
                txtMsg.AppendText("客戶端連接成功! " + "\r\n");
                //創(chuàng)建一個(gè)通信線程
                ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRecMsg);
                Thread thr = new Thread(pts);
                thr.IsBackground = true;
                //啟動(dòng)線程
                thr.Start(socConnection);
            }
        }

        /// <summary>
        /// 發(fā)送信息到客戶端的方法
        /// </summary>
        /// <param name="sendMsg">發(fā)送的字符串信息</param>
        private void ServerSendMsg(string sendMsg)
        {
            try
            {
                //將輸入的字符串轉(zhuǎn)換成 機(jī)器可以識(shí)別的字節(jié)數(shù)組
                byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendMsg);
                //向客戶端發(fā)送字節(jié)數(shù)組信息
                socConnection.Send(arrSendMsg);
                //將發(fā)送的字符串信息附加到文本框txtMsg上
                txtMsg.AppendText("服務(wù)器 " + GetCurrentTime() + "\r\n" + sendMsg + "\r\n");
            }
            catch (Exception ex) {
                txtMsg.AppendText("客戶端已斷開連接,無法發(fā)送信息!" + "\r\n");
            }
        }

        /// <summary>
        /// 接收客戶端發(fā)來的信息
        /// </summary>
        /// <param name="socketClientPara">客戶端套接字對(duì)象</param>
        private void ServerRecMsg(object socketClientPara)
        {
            Socket socketServer = socketClientPara as Socket;
            while (true)
            {
                //創(chuàng)建一個(gè)內(nèi)存緩沖區(qū) 其大小為1024*1024字節(jié)  即1M
                byte[] arrServerRecMsg = new byte[1024 * 1024];
                try
                {
                    //將接收到的信息存入到內(nèi)存緩沖區(qū),并返回其字節(jié)數(shù)組的長(zhǎng)度
                    int length = socketServer.Receive(arrServerRecMsg);
                    //將機(jī)器接受到的字節(jié)數(shù)組轉(zhuǎn)換為人可以讀懂的字符串
                    string strSRecMsg = Encoding.UTF8.GetString(arrServerRecMsg, 0, length);
                    //將發(fā)送的字符串信息附加到文本框txtMsg上
                    txtMsg.AppendText("天涯 " + GetCurrentTime() + "\r\n" + strSRecMsg + "\r\n");
                }
                catch (Exception ex) {
                    txtMsg.AppendText("客戶端已斷開連接!" + "\r\n");
                    break;
                }
            }
        }

        /// <summary>
        /// 發(fā)送消息到客戶端
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            //調(diào)用 ServerSendMsg方法  發(fā)送信息到客戶端
            ServerSendMsg(this.txtSendMsg.Text.Trim());
            this.txtSendMsg.Clear();
        }

        /// <summary>
        /// 快捷鍵 Enter 發(fā)送信息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void txtSendMsg_KeyDown(object sender, KeyEventArgs e)
        {
            //如果用戶按下了Enter鍵
            if (e.KeyCode == Keys.Enter)
            {
                //則調(diào)用 服務(wù)器向客戶端發(fā)送信息的方法
                ServerSendMsg(txtSendMsg.Text.Trim());
                this.txtSendMsg.Clear();
            }
        }

        /// <summary>
        /// 獲取當(dāng)前系統(tǒng)時(shí)間的方法
        /// </summary>
        /// <returns>當(dāng)前時(shí)間</returns>
        private DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }

        /// <summary>
        /// 獲取本地IPv4地址
        /// </summary>
        /// <returns></returns>
        public IPAddress GetLocalIPv4Address() {
            IPAddress localIpv4 = null;
            //獲取本機(jī)所有的IP地址列表
            IPAddress[] IpList = Dns.GetHostAddresses(Dns.GetHostName());
            //循環(huán)遍歷所有IP地址
            foreach (IPAddress IP in IpList) {
                //判斷是否是IPv4地址
                if (IP.AddressFamily == AddressFamily.InterNetwork)
                {
                    localIpv4 = IP;
                }
                else {
                    continue;
                }
            }
            return localIpv4;
        }

        /// <summary>
        /// 獲取本地IP事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetLocalIP_Click(object sender, EventArgs e)
        {
            //接收IPv4的地址
            IPAddress localIP = GetLocalIPv4Address();
            //賦值給文本框
            this.txtIP.Text = localIP.ToString();

        }
    }
}

3.定時(shí)任務(wù)處理報(bào)文

Timers定時(shí)任務(wù)

在內(nèi)部多線程情況下,這個(gè)定時(shí)任務(wù),支持,啟動(dòng),設(shè)定條件,滿足后執(zhí)行任務(wù),不滿做執(zhí)行設(shè)定任務(wù),然后自動(dòng)銷毀。

using SimulateMaster.Bean;
using SimulateMaster.page;
using Sunny.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace SimulateMaster.Util
{
    public class MsgReply
    {
        private ServiceMain _serviceMain;
        private readonly System.Timers.Timer _timer;
        public static string clicentInfo_value = ""; //設(shè)備信息【IP:端口】
        public static string mainName_value=""; //窗體名稱
        public static string msgContent= MsgUtils.MSG_QDLL;//報(bào)文內(nèi)容
        public int msgNum=0;//重發(fā)次數(shù) 最多三次
        public MsgReply(string msgValue,string clientInfo,string mainName, ServiceMain serviceMain)
        {
            clicentInfo_value = clientInfo;
            mainName_value = mainName;
            _serviceMain = serviceMain;
            msgContent = msgValue;
            // 設(shè)置定時(shí)器間隔(單位為毫秒)
            _timer = new System.Timers.Timer(5000);
            // 添加 Elapsed 事件處理程序
            _timer.Elapsed += OnTimerElapsed;
            // 開始計(jì)時(shí)器
            _timer.Start();
        }

        protected virtual void OnTimerElapsed(object sender, ElapsedEventArgs e)
        {
            
            FileUtils.WriteFileLog("定時(shí)任務(wù)觸發(fā)沒有接收到回復(fù)報(bào)文!", "報(bào)文接收定時(shí)任務(wù)");
        }
        public void Dispose()
        {
            FileUtils.WriteFileLog(clicentInfo_value + "定時(shí)任務(wù)關(guān)閉!", "報(bào)文接收定時(shí)任務(wù)");
            if (_timer != null && _timer.Enabled)
                _timer.Stop();

            _timer?.Dispose();
        }

    }
}

到此這篇關(guān)于C# winfroms使用socket客戶端服務(wù)端的示例代碼的文章就介紹到這了,更多相關(guān)C# socket客戶端服務(wù)端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#獲取程序文件相關(guān)信息的方法

    C#獲取程序文件相關(guān)信息的方法

    這篇文章主要介紹了C#獲取程序文件相關(guān)信息的方法,可實(shí)現(xiàn)獲取程序版本號(hào)、版權(quán)聲明、程序文本信息等,需要的朋友可以參考下
    2014-09-09
  • C#中正則表達(dá)式的3種匹配模式

    C#中正則表達(dá)式的3種匹配模式

    本文主要介紹在C#中正則匹配的三種模式:?jiǎn)涡心J?Singleline)、多行模式(Multiline)與忽略大小寫(IgnoreCase),希望能幫到大家。
    2016-05-05
  • 輕松學(xué)習(xí)C#的密封類

    輕松學(xué)習(xí)C#的密封類

    輕松學(xué)習(xí)C#的密封類,對(duì)C#的密封類感興趣的朋友可以參考本篇文章,幫助大家更靈活的運(yùn)用C#的密封類
    2015-11-11
  • C#中兩個(gè)byte如何相加

    C#中兩個(gè)byte如何相加

    可能有的看到這個(gè)題目就會(huì)覺得這不簡(jiǎn)單嗎?直接用+號(hào)相加就行了,可是當(dāng)你實(shí)際操作運(yùn)行的時(shí)候就會(huì)發(fā)現(xiàn)有錯(cuò)誤了,那么是什么錯(cuò)誤?那該如何讓C#中兩個(gè)byte相加呢?通過下面這篇文章來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • C#實(shí)現(xiàn)優(yōu)先隊(duì)列和堆排序

    C#實(shí)現(xiàn)優(yōu)先隊(duì)列和堆排序

    本文詳細(xì)講解了C#實(shí)現(xiàn)優(yōu)先隊(duì)列和堆排序的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲

    unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)簡(jiǎn)單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C#實(shí)現(xiàn)多線程編程的簡(jiǎn)單案例

    C#實(shí)現(xiàn)多線程編程的簡(jiǎn)單案例

    這篇文章介紹了C#實(shí)現(xiàn)多線程編程的簡(jiǎn)單案例,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C#高性能串口數(shù)據(jù)接收的解決方案

    C#高性能串口數(shù)據(jù)接收的解決方案

    工業(yè)自動(dòng)化和物聯(lián)網(wǎng)應(yīng)用中,串口通信仍然是不可或缺的數(shù)據(jù)傳輸方式,本文將分享一套完整的 C# 高性能串口數(shù)據(jù)接收解決方案,從底層優(yōu)化到 UI 設(shè)計(jì),幫助構(gòu)建一個(gè)真正適合工業(yè)環(huán)境的串口通信應(yīng)用,需要的朋友可以參考下
    2026-03-03
  • C#防止內(nèi)存泄漏的實(shí)戰(zhàn)指南

    C#防止內(nèi)存泄漏的實(shí)戰(zhàn)指南

    內(nèi)存泄漏在C#中更多是指:應(yīng)用程序無意中持有對(duì)象的引用,導(dǎo)致GC無法回收這些本已不再使用的對(duì)象,從而造成內(nèi)存的持續(xù)增長(zhǎng)??,本文將深入探討C#中常見的內(nèi)存泄漏場(chǎng)景,并提供具體的使用示例和解決方案,需要的朋友可以參考下
    2025-09-09
  • c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-05-05

最新評(píng)論

洞头县| 健康| 昌邑市| 衡阳县| 湖南省| 乌兰察布市| 凉城县| 杭锦旗| 九龙县| 丹江口市| 修文县| 文山县| 新宁县| 诸城市| 霍林郭勒市| 伊金霍洛旗| 新绛县| 牟定县| 溧水县| 泸西县| 婺源县| 菏泽市| 林西县| 武陟县| 和林格尔县| 花莲市| 监利县| 西丰县| 含山县| 宜兰市| 龙胜| 兖州市| 兴义市| 绥阳县| 长治县| 卢氏县| 安西县| 台南县| 涿州市| 尼玛县| 广汉市|