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

C#實(shí)現(xiàn)簡(jiǎn)易多人聊天室

 更新時(shí)間:2022年02月11日 09:00:33   作者:docyard  
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)簡(jiǎn)易多人聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C#實(shí)現(xiàn)簡(jiǎn)易多人聊天室的具體代碼,供大家參考,具體內(nèi)容如下

只有一個(gè)群聊的功能

服務(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 FinalChatRoomClient
{
? ? public partial class Client : Form
? ? {
? ? ? ? //客戶端負(fù)責(zé)接收服務(wù)端發(fā)來的數(shù)據(jù)消息的線程
? ? ? ? Thread threadClient = null;
? ? ? ? //創(chuàng)建客戶端套接字,負(fù)責(zé)連接服務(wù)器
? ? ? ? Socket socketClient = null;

? ? ? ? public Client()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? //關(guān)閉對(duì)文本框跨線程操作的檢查
? ? ? ? ? ? TextBox.CheckForIllegalCrossThreadCalls = false;
? ? ? ? }

? ? ? ? private void start_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? //獲得文本框中的IP地址對(duì)象
? ? ? ? ? ? IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
? ? ? ? ? ? //創(chuàng)建包含IP和端口的網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)象
? ? ? ? ? ? IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
? ? ? ? ? ? //創(chuàng)建客戶端套接字,負(fù)責(zé)連接服務(wù)器
? ? ? ? ? ? socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //客戶端連接到服務(wù)器
? ? ? ? ? ? ? ? socketClient.Connect(endPoint);
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器成功");
? ? ? ? ? ? }
? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }

? ? ? ? ? ? threadClient = new Thread(ReceiveMsg);
? ? ? ? ? ? threadClient.IsBackground = true;
? ? ? ? ? ? threadClient.Start();
? ? ? ? }

? ? ? ? private void btnSend_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? string strMsg = txtMsg.Text.Trim();
? ? ? ? ? ? //將字符串轉(zhuǎn)成方便網(wǎng)絡(luò)傳送的二進(jìn)制數(shù)組
? ? ? ? ? ? byte[] arrMsg = Encoding.UTF8.GetBytes(strMsg);
? ? ? ? ? ? byte[] arrMsgSend = new byte[arrMsg.Length + 1];
? ? ? ? ? ? arrMsgSend[0] = 0;//設(shè)置標(biāo)識(shí)位,0代表發(fā)送的是文字
? ? ? ? ? ? Buffer.BlockCopy(arrMsg, 0, arrMsgSend, 1, arrMsg.Length);
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? socketClient.Send(arrMsgSend);

? ? ? ? ? ? ? ? //清空發(fā)送消息文本框中的消息
? ? ? ? ? ? ? ? this.txtMsg.Text = "";
? ? ? ? ? ? }
? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端發(fā)送消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端發(fā)送消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? private void ShowMsg(string msg)
? ? ? ? {
? ? ? ? ? ? txtRecord.AppendText(msg + "\r\n");
? ? ? ? }

? ? ? ? private void ReceiveMsg()
? ? ? ? {
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //定義一個(gè)接收消息用的字節(jié)數(shù)組緩沖區(qū)(2M大?。?
? ? ? ? ? ? ? ? byte[] arrMsgRev = new byte[1024 * 1024 * 2];
? ? ? ? ? ? ? ? //將接收到的數(shù)據(jù)存入arrMsgRev,并返回真正接收到數(shù)據(jù)的長(zhǎng)度
? ? ? ? ? ? ? ? int length = -1;
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? length = socketClient.Receive(arrMsgRev);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ShowMsg("客戶端接收消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("客戶端接收消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //此時(shí)是將數(shù)組的所有元素(每個(gè)字節(jié))都轉(zhuǎn)成字符串,而真正接收到只有服務(wù)端發(fā)來的幾個(gè)字符
? ? ? ? ? ? ? ? string strMsgReceive = Encoding.UTF8.GetString(arrMsgRev, 0, length);
? ? ? ? ? ? ? ? Console.WriteLine(strMsgReceive);
? ? ? ? ? ? ? ? ShowMsg(strMsgReceive);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

客戶端

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 FinalChatRoomClient
{
? ? public partial class Client : Form
? ? {
? ? ? ? //客戶端負(fù)責(zé)接收服務(wù)端發(fā)來的數(shù)據(jù)消息的線程
? ? ? ? Thread threadClient = null;
? ? ? ? //創(chuàng)建客戶端套接字,負(fù)責(zé)連接服務(wù)器
? ? ? ? Socket socketClient = null;

? ? ? ? public Client()
? ? ? ? {
? ? ? ? ? ? InitializeComponent();
? ? ? ? ? ? //關(guān)閉對(duì)文本框跨線程操作的檢查
? ? ? ? ? ? TextBox.CheckForIllegalCrossThreadCalls = false;
? ? ? ? }

? ? ? ? private void start_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? //獲得文本框中的IP地址對(duì)象
? ? ? ? ? ? IPAddress address = IPAddress.Parse(txtIp.Text.Trim());
? ? ? ? ? ? //創(chuàng)建包含IP和端口的網(wǎng)絡(luò)節(jié)點(diǎn)對(duì)象
? ? ? ? ? ? IPEndPoint endPoint = new IPEndPoint(address, int.Parse(txtPort.Text.Trim()));
? ? ? ? ? ? //創(chuàng)建客戶端套接字,負(fù)責(zé)連接服務(wù)器
? ? ? ? ? ? socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //客戶端連接到服務(wù)器
? ? ? ? ? ? ? ? socketClient.Connect(endPoint);
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器成功");
? ? ? ? ? ? }
? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端連接服務(wù)器發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }

? ? ? ? ? ? threadClient = new Thread(ReceiveMsg);
? ? ? ? ? ? threadClient.IsBackground = true;
? ? ? ? ? ? threadClient.Start();
? ? ? ? }

? ? ? ? private void btnSend_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? string strMsg = txtMsg.Text.Trim();
? ? ? ? ? ? //將字符串轉(zhuǎn)成方便網(wǎng)絡(luò)傳送的二進(jìn)制數(shù)組
? ? ? ? ? ? byte[] arrMsg = Encoding.UTF8.GetBytes(strMsg);
? ? ? ? ? ? byte[] arrMsgSend = new byte[arrMsg.Length + 1];
? ? ? ? ? ? arrMsgSend[0] = 0;//設(shè)置標(biāo)識(shí)位,0代表發(fā)送的是文字
? ? ? ? ? ? Buffer.BlockCopy(arrMsg, 0, arrMsgSend, 1, arrMsg.Length);
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? socketClient.Send(arrMsgSend);

? ? ? ? ? ? ? ? //清空發(fā)送消息文本框中的消息
? ? ? ? ? ? ? ? this.txtMsg.Text = "";
? ? ? ? ? ? }
? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端發(fā)送消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ShowMsg("客戶端發(fā)送消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? }
? ? ? ? }

? ? ? ? private void ShowMsg(string msg)
? ? ? ? {
? ? ? ? ? ? txtRecord.AppendText(msg + "\r\n");
? ? ? ? }

? ? ? ? private void ReceiveMsg()
? ? ? ? {
? ? ? ? ? ? while (true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //定義一個(gè)接收消息用的字節(jié)數(shù)組緩沖區(qū)(2M大小)
? ? ? ? ? ? ? ? byte[] arrMsgRev = new byte[1024 * 1024 * 2];
? ? ? ? ? ? ? ? //將接收到的數(shù)據(jù)存入arrMsgRev,并返回真正接收到數(shù)據(jù)的長(zhǎng)度
? ? ? ? ? ? ? ? int length = -1;
? ? ? ? ? ? ? ? try
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? length = socketClient.Receive(arrMsgRev);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (SocketException ex)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ShowMsg("客戶端接收消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? catch (Exception ex)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("客戶端接收消息時(shí)發(fā)生異常:" + ex.Message);
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //此時(shí)是將數(shù)組的所有元素(每個(gè)字節(jié))都轉(zhuǎn)成字符串,而真正接收到只有服務(wù)端發(fā)來的幾個(gè)字符
? ? ? ? ? ? ? ? string strMsgReceive = Encoding.UTF8.GetString(arrMsgRev, 0, length);
? ? ? ? ? ? ? ? Console.WriteLine(strMsgReceive);
? ? ? ? ? ? ? ? ShowMsg(strMsgReceive);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

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

相關(guān)文章

  • C#中的IDisposable模式用法詳解

    C#中的IDisposable模式用法詳解

    這篇文章主要介紹了C#中的IDisposable模式用法,講述了垃圾資源回收機(jī)制的實(shí)現(xiàn),并對(duì)比分析了Dispose()方法、~DisposableClass()析構(gòu)函數(shù)、虛方法Dispose(bool disposing)的原理,需要的朋友可以參考下
    2014-09-09
  • C#連接Oracle數(shù)據(jù)庫(kù)的實(shí)例方法

    C#連接Oracle數(shù)據(jù)庫(kù)的實(shí)例方法

    C#連接Oracle數(shù)據(jù)庫(kù)的實(shí)例方法,需要的朋友可以參考一下
    2013-04-04
  • WinForm項(xiàng)目開發(fā)中Excel用法實(shí)例解析

    WinForm項(xiàng)目開發(fā)中Excel用法實(shí)例解析

    這篇文章主要介紹了WinForm項(xiàng)目開發(fā)中Excel用法,非常實(shí)用,需要的朋友可以參考下
    2014-08-08
  • C#自定義控件添加右鍵菜單的方法

    C#自定義控件添加右鍵菜單的方法

    這篇文章主要介紹了C#自定義控件添加右鍵菜單的方法,本文用到control控件,專門自定義右鍵菜單,下面小編給大家整理下,有需要的小伙伴可以來參考下
    2015-08-08
  • Entity?Framework配置關(guān)系

    Entity?Framework配置關(guān)系

    這篇文章介紹了Entity?Framework配置關(guān)系的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#中使用ADOMD.NET查詢多維數(shù)據(jù)集的實(shí)現(xiàn)方法

    C#中使用ADOMD.NET查詢多維數(shù)據(jù)集的實(shí)現(xiàn)方法

    這篇文章主要介紹了C#中使用ADOMD.NET查詢多維數(shù)據(jù)集的實(shí)現(xiàn)方法,詳細(xì)講述了C#中使用ADOMD.NET查詢多維數(shù)據(jù)集的原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)軟件防破解和防調(diào)試的幾種有效措施

    C#實(shí)現(xiàn)軟件防破解和防調(diào)試的幾種有效措施

    軟件保護(hù)在現(xiàn)代應(yīng)用程序開發(fā)中變得越來越重要,尤其是在面對(duì)軟件盜版、調(diào)試和破解等問題時(shí),在C#開發(fā)中,雖然沒有完全防止破解的辦法,但通過采取一些有效的防護(hù)措施,可以顯著增加破解的難度并保護(hù)軟件的知識(shí)產(chǎn)權(quán),本篇文章將探討在C#中實(shí)現(xiàn)軟件防破解和防調(diào)試的幾種常見技術(shù)
    2025-03-03
  • C#的WebBrowser操作frame實(shí)例解析

    C#的WebBrowser操作frame實(shí)例解析

    這篇文章主要介紹了C#的WebBrowser操作frame實(shí)例解析,很適合C#初學(xué)者參考借鑒,需要的朋友可以參考下
    2014-08-08
  • Unity 從UI中拖拽對(duì)象放置并拖動(dòng)效果 附demo

    Unity 從UI中拖拽對(duì)象放置并拖動(dòng)效果 附demo

    最近新接了個(gè)需求,要求模擬場(chǎng)景并生成3D對(duì)象,對(duì)象可以跟隨鼠標(biāo)移動(dòng)效果,今天小編把我實(shí)現(xiàn)的demo分享到腳本之家平臺(tái),對(duì)Unity UI拖拽相關(guān)知識(shí)感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2021-05-05
  • C#?使用SpecFlow創(chuàng)建BDD測(cè)試用例的示例代碼

    C#?使用SpecFlow創(chuàng)建BDD測(cè)試用例的示例代碼

    這篇文章主要介紹了C#?使用SpecFlow創(chuàng)建BDD測(cè)試用例,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

洞头县| 岫岩| 宝山区| 深州市| 黄陵县| 仪陇县| 霍林郭勒市| 赤水市| 鞍山市| 钟祥市| 洛宁县| 麟游县| 岑溪市| 台山市| 克拉玛依市| 健康| 茌平县| 华容县| 黄浦区| 沅陵县| 荆州市| 新竹市| 积石山| 鄂伦春自治旗| 新营市| 新乡市| 镶黄旗| 正阳县| 长乐市| 射阳县| 孙吴县| 民权县| 丹寨县| 平定县| 勐海县| 肃宁县| 常州市| 吉木萨尔县| 饶阳县| 醴陵市| 通渭县|