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

C#基于Socket的TCP通信實(shí)現(xiàn)聊天室案例

 更新時(shí)間:2022年02月12日 19:43:07   作者:qq_43552118zx  
這篇文章主要為大家詳細(xì)介紹了C#基于Socket的TCP通信實(shí)現(xiàn)聊天室案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C#基于Socket的TCP通信實(shí)現(xiàn)聊天室的具體代碼,供大家參考,具體內(nèi)容如下

一、Socket(套接字)通信概念

套接字(socket)是通信的基石,用于描述IP地址和端口,是一個(gè)通信鏈的句柄,可以用來(lái)實(shí)現(xiàn)不同虛擬機(jī)或不同計(jì)算機(jī)之間的通信,是支持TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元。它是網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含進(jìn)行網(wǎng)絡(luò)通信必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地進(jìn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。

應(yīng)用層通過傳輸層進(jìn)行數(shù)據(jù)通信時(shí),TCP會(huì)遇到同時(shí)為多個(gè)應(yīng)用程序進(jìn)程提供并發(fā)服務(wù)的問題。多個(gè)TCP連接或多個(gè)應(yīng)用程序進(jìn)程可能需要通過同一個(gè) TCP協(xié)議端口傳輸數(shù)據(jù)。為了區(qū)別不同的應(yīng)用程序進(jìn)程和連接,許多計(jì)算機(jī)操作系統(tǒng)為應(yīng)用程序與TCP/IP協(xié)議交互提供了套接字(Socket)接口。應(yīng) 用層可以和傳輸層通過Socket接口,區(qū)分來(lái)自不同應(yīng)用程序進(jìn)程或網(wǎng)絡(luò)連接的通信,實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)牟l(fā)服務(wù)。

二、建立socket連接

建立Socket連接至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。

套接字之間的連接過程分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。

1、服務(wù)器監(jiān)聽:服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請(qǐng)求 

2、客戶端請(qǐng)求:指客戶端的套接字提出連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號(hào),然后就向服務(wù)器端套接字提出連接請(qǐng)求。

3、連接確認(rèn):當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,建立一個(gè)新的線程,把服務(wù)器端套接字的描述發(fā)給客戶 端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請(qǐng)求。

三、SOCKET連接與TCP連接

創(chuàng)建Socket連接時(shí),可以指定使用的傳輸層協(xié)議,Socket可以支持不同的傳輸層協(xié)議(TCP或UDP),當(dāng)使用TCP協(xié)議進(jìn)行連接時(shí),該Socket連接就是一個(gè)TCP連接。

socket通信:分為同步和異步通信,通信兩端分別為客戶端(Client)和服務(wù)器(Server),,本文簡(jiǎn)單介紹一下同步通信及案例

聊天室案例 服務(wù)端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
?
namespace 服務(wù)器
{
? ? public partial class Form1 : Form
? ? {
? ? ? ? public Form1()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? //在多線程編程中,如果需要使用大到主線程需要進(jìn)行檢查取消
? ? ? ? ? ? CheckForIllegalCrossThreadCalls = false;
? ? ? ? }
? ? ? ? IDictionary<string, Socket> clientList = new Dictionary<string, Socket>();
? ? ? ?
? ? ? ? private void button1_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? Thread th = new Thread(StartSever);
? ? ? ? ? ? th.IsBackground = true;
? ? ? ? ? ? th.Start();
? ? ? ? }
? ? ? ? void StartSever()
? ? ? ? {
? ? ? ? ? ? //1.創(chuàng)建服務(wù)器端電話
? ? ? ? ? ? Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
? ? ? ? ? ? //2.創(chuàng)建手機(jī)卡
? ? ? ? ? ? IPAddress ip = IPAddress.Parse(txtIP.Text);
? ? ? ? ? ? //把ip和端口轉(zhuǎn)化為IPEndPoint實(shí)例
? ? ? ? ? ? IPEndPoint endpoint = new IPEndPoint(ip, int.Parse(txtPort.Text));
? ? ? ? ? ? //3.將電話卡插入到電話中,綁定端口
? ? ? ? ? ? server.Bind(endpoint);
? ? ? ? ? ? //4.開始監(jiān)聽電話
? ? ? ? ? ? server.Listen(20);
? ? ? ? ? ? listMsg.Items.Add("服務(wù)器已成功開啟");
? ? ? ? ? ? //5.等待接電話
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //接收接入的一個(gè)客戶端
? ? ? ? ? ? ? ? Socket connectClient = server.Accept();
? ? ? ? ? ? ? ? if (connectClient != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? string infor = connectClient.RemoteEndPoint.ToString();
? ? ? ? ? ? ? ? ? ? clientList.Add(infor, connectClient);
? ? ? ? ? ? ? ? ? ? listMsg.Items.Add(infor + "加入服務(wù)器");
? ? ? ? ? ? ? ? ? ? string msg =infor+"已成功進(jìn)入聊天室";
? ? ? ? ? ? ? ? ? ? SendMsg(msg);
? ? ? ? ? ? ? ? ? ? Thread thread = new Thread(ReciveMsg);
? ? ? ? ? ? ? ? ? ? thread.IsBackground = true;
? ? ? ? ? ? ? ? ? ? thread.Start(connectClient);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? void ReciveMsg(object o)
? ? ? ? {
? ? ? ? ? ? Socket client = o as Socket;
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? byte[] arrMsg = new byte[1024 * 1024];
? ? ? ? ? ? ? ? ? ? int length = client.Receive(arrMsg);
? ? ? ? ? ? ? ? ? ? if (length > 0)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? string recMsg = Encoding.UTF8.GetString(arrMsg, 0, length);
? ? ? ? ? ? ? ? ? ? ? ? IPEndPoint endpoint = client.RemoteEndPoint as IPEndPoint;
? ? ? ? ? ? ? ? ? ? ? ? listMsg.Items.Add(DateTime.Now + "[" + endpoint.Port.ToString() + "]" + recMsg);
? ? ? ? ? ? ? ? ? ? ? ? SendMsg("[" + endpoint.Port.ToString() + "]" + recMsg);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? client.Close();
? ? ? ? ? ? ? ? ? ? clientList.Remove(client.RemoteEndPoint.ToString());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void label1_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? string ip = IPAddress.Any.ToString();
? ? ? ? ? ? txtIP.Text = ip;
? ? ? ? }
? ? ? ? void SendMsg(string str)
? ? ? ? {
? ? ? ? ? ? foreach (var item in clientList)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? byte[] arrMsg = Encoding.UTF8.GetBytes(str);
? ? ? ? ? ? ? ? item.Value.Send(arrMsg);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void button2_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? if (txtMsg.Text!="")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? SendMsg(txtMsg.Text);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

客戶端 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace 服務(wù)器2._12
{
? ? public partial class Form1 : Form
? ? {
? ? ? ? public Form1()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? CheckForIllegalCrossThreadCalls = false;
? ? ? ? }
? ? ? ? Socket Client;
? ? ? ? private void button1_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? //創(chuàng)建服務(wù)器端電話
? ? ? ? ? ? Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
? ? ? ? ? ? //創(chuàng)建手機(jī)卡
? ? ? ? ? ? IPAddress ip = IPAddress.Parse(txtIP.Text);
? ? ? ? ? ? IPEndPoint endinput = new IPEndPoint(ip, int.Parse(txtport.Text));
? ? ? ? ? ? Client.Connect(endinput);
? ? ? ? ? ? Thread th = new Thread(ReciveMsg);
? ? ? ? ? ? th.IsBackground = true;
? ? ? ? ? ? th.Start(Client);
? ? ? ? }
? ? ? ? void ReciveMsg(object o)
? ? ? ? {
? ? ? ? ? ? Socket client = o as Socket;
? ? ? ? ? ? //5.等待接電話
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? byte[] arrlist = new byte[1024*1024];
? ? ? ? ? ? ? ? int length = client.Receive(arrlist);
? ? ? ? ? ? ? ? string msg = DateTime.Now + Encoding.UTF8.GetString(arrlist,0,length);
? ? ? ? ? ? ? ? listmsg.Items.Add(msg);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void button2_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? if (txtinput.Text!=null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? SendMsg(txtinput.Text);
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? void SendMsg(string msg)
? ? ? ? {
? ? ? ? ? ? byte[] arrMsg = Encoding.UTF8.GetBytes(msg);
? ? ? ? ? ? Client.Send(arrMsg);
? ? ? ? }
? ? }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#?md5?算法實(shí)現(xiàn)代碼

    C#?md5?算法實(shí)現(xiàn)代碼

    相對(duì)C#來(lái)說,md5算法就相對(duì)簡(jiǎn)單很多,因?yàn)?System.Security.Cryptography;?已經(jīng)包含了md5算法。所以我們只需創(chuàng)建MD5類對(duì)象即可實(shí)現(xiàn)md5算法,今天通過本文給大家介紹C#?md5?算法實(shí)現(xiàn),感興趣的朋友一起看看吧
    2022-11-11
  • c# 反射用法及效率對(duì)比

    c# 反射用法及效率對(duì)比

    這篇文章主要介紹了c# 反射用法及效率對(duì)比,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-02-02
  • C#實(shí)現(xiàn)希爾排序算法的實(shí)踐

    C#實(shí)現(xiàn)希爾排序算法的實(shí)踐

    希爾排序算法是基于插入排序改進(jìn)的一種排序方法,通過分組和遞減增量的策略來(lái)提高排序效率,學(xué)習(xí)希爾排序可以幫助理解排序算法原理,拓寬算法思維,并解決實(shí)際問題,感興趣的可以了解一下
    2024-10-10
  • C#面向?qū)ο筇卣鞯木唧w實(shí)現(xiàn)及作用詳解

    C#面向?qū)ο筇卣鞯木唧w實(shí)現(xiàn)及作用詳解

    所有的面相對(duì)象思想,歸根結(jié)底是為了簡(jiǎn)化代碼,減少代碼量,構(gòu)建更符合現(xiàn)實(shí)生活邏輯的程序代碼,從而減輕程序員的負(fù)擔(dān)。不能一味地或者說刻意地去使用面相對(duì)象的思想而忽略了程序所實(shí)現(xiàn)的功能或者框架,要根據(jù)實(shí)際情況
    2013-10-10
  • c#異步發(fā)送郵件的類

    c#異步發(fā)送郵件的類

    這篇文章主要介紹了使用c#異步發(fā)送郵件的類,大家參考使用吧
    2014-01-01
  • WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法

    WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法

    這篇文章主要介紹了WinForm中變Enter鍵為Tab鍵實(shí)現(xiàn)焦點(diǎn)轉(zhuǎn)移的方法,主要通過一個(gè)ControlTools類來(lái)實(shí)現(xiàn)該功能,需要的朋友可以參考下
    2014-08-08
  • 基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲

    基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲

    這篇文章主要為大家詳細(xì)介紹了基于C#的winform實(shí)現(xiàn)數(shù)字華容道游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • c# 線程安全隊(duì)列的用法原理及使用示例

    c# 線程安全隊(duì)列的用法原理及使用示例

    這篇文章主要介紹了c# 線程安全隊(duì)列的用法原理及使用示例,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2020-11-11
  • C#9.0主要特性的一些想法

    C#9.0主要特性的一些想法

    這篇文章主要給大家介紹了關(guān)于C#9.0主要特性的一些想法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C# WinForm制作一個(gè)批量轉(zhuǎn)化文件格式的小工具

    C# WinForm制作一個(gè)批量轉(zhuǎn)化文件格式的小工具

    在生活中有時(shí)候會(huì)遇到批量轉(zhuǎn)換格式的需求,一個(gè)個(gè)點(diǎn)太麻煩了,一個(gè)能夠?qū)崿F(xiàn)批量文件格式轉(zhuǎn)換的工具非常有用,所以本文小編使用C# WinForm制作一個(gè)批量轉(zhuǎn)化文件格式的小工具,文中有具體實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

读书| 乡城县| 邵武市| 当涂县| 寻乌县| 芜湖市| 滨州市| 鹤山市| 吉林省| 都安| 吉水县| 琼中| 雷山县| 惠来县| 甘肃省| 绥宁县| 高平市| 萍乡市| 蒲江县| 隆子县| 周至县| 新巴尔虎左旗| 宜州市| 玛纳斯县| 洪泽县| 海安县| 丰台区| 东丰县| 新丰县| 光泽县| 荆州市| 沛县| 文安县| 静海县| 六枝特区| 新余市| 三都| 宁陵县| 英吉沙县| 化州市| 伊宁市|