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

C#編寫一個(gè)網(wǎng)游客戶端的完整步驟

 更新時(shí)間:2021年11月28日 16:00:15   作者:HarrietLH  
這篇文章主要給大家介紹了關(guān)于C#編寫一個(gè)網(wǎng)游客戶端的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

本過(guò)程是使用Virtual Studio 2019實(shí)現(xiàn)的,利用老師給出的框架進(jìn)行的修改。

一、認(rèn)識(shí)NetworkStream(網(wǎng)絡(luò)流)

1、NetworkStream的相關(guān)知識(shí)點(diǎn)

①NetworkStream只能使用于具有TCP/IP協(xié)議之中,用于UDP中雖然不會(huì)報(bào)錯(cuò),但是會(huì)出現(xiàn)異常。

②NetworkStream是面向連接的。

③NetworkStream是利用流的形式進(jìn)行傳輸信息。

2、NetworkStream常用的屬性和方法

屬性或方法 解釋
CanRead 流是否支持讀取,可以從流中讀取數(shù)據(jù),返回為true
DataAvailable 看讀取的流上是否有可用的數(shù)據(jù),常用來(lái)判斷流是否還有數(shù)據(jù)
Read(byte[] buffer,int offset,int size) 將數(shù)據(jù)讀入到buffer中,并返回成功讀取的字節(jié)數(shù)
Write(byte[] buffer,int offset,int size) 將buffer中的數(shù)據(jù)內(nèi)容發(fā)送到網(wǎng)絡(luò)

了解NetworkStream,有助于幫助后面采用TcpClient進(jìn)行數(shù)據(jù)收發(fā),有興趣也可以了解一下StreamReader,StreamWriter。

二、連接服務(wù)器

代碼:

private NetworkStream stream;
private TcpClient tcpClient = new TcpClient();
public Form1()
{
      InitializeComponent();
      try
            {
                //向指定的IP地址的服務(wù)器發(fā)出連接請(qǐng)求
                tcpClient.Connect("10.160.52.106", 3900);
                listBox1.Items.Add("連接成功!");
                stream = tcpClient.GetStream();
                byte[] data = new byte[1024];
                //判斷網(wǎng)絡(luò)流是否可讀            
                if (stream.CanRead)
                {
                    int len = stream.Read(data, 0, data.Length);
                    //Encoding ToEncoding = Encoding.GetEncoding("UTF-8");
                    //Encoding FromEncoding = Encoding.GetEncoding("GB2312");
                    //data=Encoding.Convert(FromEncoding, ToEncoding, data);
                    //string msg = Encoding.UTF8.GetString(data, 0, data.Length);
                    string msg = Encoding.Default.GetString(data, 0, data.Length);
                    string str = "\r\n";
                    char[] str1 = str.ToCharArray();
                    string[] msg1=msg.Split(str1);
                    for(int j = 0; j < msg1.Length; j++)
                    {
                        listBox1.Items.Add(msg1[j]);
                    }
                }
            }
            catch
            {
                listBox1.Items.Add("服務(wù)器未啟動(dòng)!");
            }
}

分析:

本過(guò)程是先為界面創(chuàng)建一個(gè)TCPClient對(duì)象屬性,在窗體初始化的時(shí)候,就連接服務(wù)器,并把服務(wù)器返回的數(shù)據(jù)在ListBox中顯示出來(lái)。由于一些轉(zhuǎn)義控制字符無(wú)法進(jìn)行解析,返回的數(shù)據(jù)會(huì)出現(xiàn)一些特殊字符。

運(yùn)行效果:

在顯示返回的數(shù)據(jù)時(shí),最開始采用UTF-8編碼的時(shí)候,顯示回的數(shù)據(jù)是亂碼的情況。
解決方式:
①采用Default的方式
string msg = Encoding.Default.GetString(data, 0, data.Length);
②進(jìn)行編碼轉(zhuǎn)換(GB轉(zhuǎn)換為UTF-8)
Encoding ToEncoding = Encoding.GetEncoding(“UTF-8”);
Encoding FromEncoding = Encoding.GetEncoding(“GB2312”);
data=Encoding.Convert(FromEncoding, ToEncoding, data);
string msg = Encoding.UTF8.GetString(data, 0, data.Length);
獲得的數(shù)據(jù)直接采用listBox的Add方法添加,顯示只會(huì)顯示一行數(shù)據(jù),不會(huì)進(jìn)行換行
解決方式(對(duì)字符串以\r\n為分隔符進(jìn)行分割,循環(huán)顯示)
string str = “\r\n”;
char[] str1 = str.ToCharArray();
string[] msg1=msg.Split(str1);
for(int j = 0; j < msg1.Length; j++)
{
listBox1.Items.Add(msg1[j]);
}

三、客戶端向服務(wù)器發(fā)送數(shù)據(jù)

代碼:

private void button12_Click(object sender, EventArgs e)
{
     //判斷連接是否斷開
     if (tcpClient.Connected)
     {
     	//向服務(wù)器發(fā)送數(shù)據(jù)
      	string msg = textBox1.Text;
        Byte[] outbytes = System.Text.Encoding.Default.GetBytes(msg+"\n");
        stream.Write(outbytes, 0, outbytes.Length);
        byte[] data = new byte[1024];
        //接收服務(wù)器回復(fù)數(shù)據(jù)
        if (stream.CanRead)
         {
         	int len = stream.Read(data, 0, data.Length);
            string msg1 = Encoding.Default.GetString(data, 0, data.Length);
            string str = "\r\n";
            char[] str1 = str.ToCharArray();
            string[] msg2 = msg1.Split(str1);
            for (int j = 0; j < msg2.Length; j++)
            {
            	listBox1.Items.Add(msg2[j]);
            }
         }
      }
      else
      {
       	listBox1.Items.Add("連接已斷開");
      }
}

分析:

將輸入到textBox中的信息發(fā)送給服務(wù)器,再將服務(wù)器發(fā)送回來(lái)的數(shù)據(jù)給添加到ListBox中顯示出來(lái)。

運(yùn)行效果:

最開始發(fā)送數(shù)據(jù)的時(shí)候,服務(wù)器不返回任何數(shù)據(jù)
解決方式:
在發(fā)送的數(shù)據(jù)內(nèi)容后面加上回車(\n),需要回車的原因是來(lái)表示客服端向服務(wù)器發(fā)送某個(gè)消息的結(jié)束標(biāo)識(shí)。(僅是筆者的看法,并不準(zhǔn)確)
每次在textBox輸入信息,都有先刪除上一次的內(nèi)容,比較麻煩
解決方式:
在按鈕事件中添加textBox1.Clear()語(yǔ)句

四、實(shí)現(xiàn)播放背景音樂(lè)

添加WindowsMediaPlayer控件

沒(méi)有的情況下,添加控件的方法

選擇常規(guī)后,右鍵,再選擇選擇項(xiàng),就會(huì)彈出一個(gè)新界面,在新界面上選擇COM組件。接下來(lái)就是找到所需要的控件,將其勾選上。

代碼:

private void button13_Click(object sender, EventArgs e)
{
      string s = @"D:\game1\game1\bin\Debug\Wav\mp3\Kapuskasing.mp3";
      axWindowsMediaPlayer1.URL = s;
}
private void button14_Click(object sender, EventArgs e)
{
       //用于暫停正在播放的背景音樂(lè)
       axWindowsMediaPlayer1.Ctlcontrols.pause();
}

分析:

播放和停止播放是通過(guò)兩個(gè)按鈕的點(diǎn)擊來(lái)實(shí)現(xiàn)的。當(dāng)點(diǎn)擊播放按鈕后,就會(huì)播放背景音樂(lè),需要暫停播放,就點(diǎn)擊停止按鈕就可以實(shí)現(xiàn)停止。

運(yùn)行效果:


實(shí)際上,點(diǎn)擊播放按鈕后,存在背景音樂(lè)在播放。點(diǎn)擊停止時(shí),就沒(méi)有了。

五、實(shí)現(xiàn)游戲背景圖片變換

代碼:

int flag = 0;
private void timer1_Tick(object sender, EventArgs e)
{
      flag++;
      string picturePath = @"D:\game1\game1\bin\Debug\imag\"+flag+".jpg";
      pictureBox1.Image = Image.FromFile(picturePath);
      if (flag == 5)
      {
           flag = 0;
      }
}

分析:

該過(guò)程是利用Timer控件的tick事件來(lái)實(shí)現(xiàn)的,此處是利用Timer每隔3s會(huì)重新執(zhí)行一次,然后pictureBox控件的圖片路徑就被修改。從而,實(shí)現(xiàn)圖片的變換。

運(yùn)行效果:

timer的時(shí)間間隔的設(shè)置方式
在界面設(shè)計(jì)下,選中timer控件,接著在右邊的屬性區(qū)域中,找到Interval后,設(shè)置它的值,默認(rèn)值為100(0.1s)。還需要將Enable的值修改為true。

六、小結(jié)

本過(guò)程主要是實(shí)現(xiàn)一個(gè)簡(jiǎn)單網(wǎng)游客戶端的部分功能實(shí)現(xiàn)。背景音樂(lè)與背景圖片的變換兩種功能。這個(gè)功能的實(shí)現(xiàn)方式并不是只有我展示,還有其他的方式。整個(gè)過(guò)程還是花了比較久的時(shí)間,主要是對(duì)于一些控件使用不是很熟悉。界面的設(shè)計(jì)部分是使用的老師發(fā)的框架代碼,有些控件的時(shí)間功能還沒(méi)有實(shí)現(xiàn)。最開始在服務(wù)器的連接上,并沒(méi)有成功,應(yīng)該是對(duì)應(yīng)的服務(wù)器端有問(wèn)題。在連接服務(wù)器成功后,就數(shù)據(jù)的收發(fā)問(wèn)題上,還是花了比較多的時(shí)間。起初,接受的的數(shù)據(jù)存在一些亂碼的情況,就一直不明白是怎么回事。最后,才知道是編碼上的問(wèn)題和一些轉(zhuǎn)義控制字符沒(méi)有辦法轉(zhuǎn)義得到正確的顯示。采用循環(huán)的時(shí)候,沒(méi)有報(bào)錯(cuò)之類的問(wèn)題出現(xiàn),可點(diǎn)擊運(yùn)行,就是沒(méi)有界面彈出,去掉循環(huán)部分,卻又有界面出現(xiàn),就不知道是什么情況。在網(wǎng)上查看資料,也沒(méi)有發(fā)現(xiàn)是什么問(wèn)題。最后,不知道怎么回事,運(yùn)行又可以了。

七、參考資料

總結(jié)

到此這篇關(guān)于C#編寫一個(gè)網(wǎng)游客戶端的文章就介紹到這了,更多相關(guān)C#編寫網(wǎng)游客戶端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#中的out參數(shù)、ref參數(shù)和params可變參數(shù)用法介紹

    C#中的out參數(shù)、ref參數(shù)和params可變參數(shù)用法介紹

    這篇文章介紹了C#中的out參數(shù)、ref參數(shù)和params可變參數(shù)用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 淺談C#多線程下的調(diào)優(yōu)

    淺談C#多線程下的調(diào)優(yōu)

    本文主要介紹了C#多線程下的調(diào)優(yōu),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則

    C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則

    這篇文章介紹了C#面向?qū)ο笤O(shè)計(jì)原則之組合/聚合復(fù)用原則,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C#使用TimeSpan時(shí)間計(jì)算的簡(jiǎn)單實(shí)現(xiàn)

    C#使用TimeSpan時(shí)間計(jì)算的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于C#使用TimeSpan時(shí)間計(jì)算的相關(guān)資料,以及通過(guò)一個(gè)實(shí)例代碼給大家介紹了C#使用timespan和timer完成一個(gè)簡(jiǎn)單的倒計(jì)時(shí)器的方法,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類實(shí)例

    C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類實(shí)例

    這篇文章主要介紹了C#實(shí)現(xiàn)抓取和分析網(wǎng)頁(yè)類,實(shí)例分析了C#抓取及分析網(wǎng)頁(yè)中文本及連接的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • C# TabControl控件中TabPage選項(xiàng)卡切換時(shí)的觸發(fā)事件問(wèn)題

    C# TabControl控件中TabPage選項(xiàng)卡切換時(shí)的觸發(fā)事件問(wèn)題

    這篇文章主要介紹了C# TabControl控件中TabPage選項(xiàng)卡切換時(shí)的觸發(fā)事件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法

    C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法

    本文主要介紹了C# 讀寫自定義的Config文件的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Unity Shader實(shí)現(xiàn)徑向模糊效果

    Unity Shader實(shí)現(xiàn)徑向模糊效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)徑向模糊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼

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

    c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考一下
    2013-05-05
  • 詳解Unity日志打印工具功能

    詳解Unity日志打印工具功能

    Unity是一個(gè)非常火的游戲引擎,我們?cè)匍_發(fā)的時(shí)候有的時(shí)候要進(jìn)行程序的調(diào)試,下面給大家介紹下Unity日志打印工具功能,感興趣的朋友一起看看吧
    2022-01-01

最新評(píng)論

陇川县| 焦作市| 天气| 南漳县| 柞水县| 久治县| 新绛县| 崇信县| 太康县| 凌海市| 大关县| 五大连池市| 禄丰县| 湖南省| 巢湖市| 奉化市| 化州市| 西藏| 永嘉县| 鄄城县| 边坝县| 文登市| 大关县| 望城县| 峡江县| 云安县| 榆中县| 英山县| 葵青区| 长子县| 佛山市| 施秉县| 乾安县| 南雄市| 开鲁县| 临沧市| 邢台市| 东丽区| 藁城市| 昭觉县| 新津县|