C#基于TCP實(shí)現(xiàn)簡(jiǎn)單游戲客戶端的完整實(shí)例
一、界面
左上方播放音頻按鈕和停止播放下面是圖片展示再下面是進(jìn)入游戲以及退出游戲最后是命令輸入框右邊是消息框
二、代碼
1.播放音頻
需要用到WindowsMediaPlayer組件,在常規(guī)組件的選擇項(xiàng)里面可以找到。
實(shí)現(xiàn)代碼
private void start_Click(object sender, EventArgs e) { //新建線程打開(kāi)音頻文件 new Thread(new ThreadStart(beginPlay)).Start(); } private void stop_Click(object sender, EventArgs e) { //暫定播放 axWindowsMediaPlayer1.Ctlcontrols.pause(); } public void beginPlay() { string s = @"G:\VisualStudioProject\GameWindows\resources\music.mp3"; axWindowsMediaPlayer1.URL = s; }
2.播放圖片
使用定時(shí)器,使能并且設(shè)置每1000ms觸發(fā)一次事件
事件函數(shù)
private String[] pictures={ "\\1.jpg", "\\2.jpg","\\3.jpg","\\4.jpg","5.jpg","6.jpg"}; private int postion = 0; private void timer1_Tick(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("G:\\VisualStudioProject\\GameWindows\\resources\\"+pictures[(++postion)%pictures.Length]); }
3.登錄和退出游戲
采用tcp協(xié)議和服務(wù)器建立連接
public void connection() { try { //向指定的IP地址的服務(wù)器發(fā)出連接請(qǐng)求 tcpClient.Connect("10.1.230.74", 3900); messages.Items.Add("連接成功!"); stream = tcpClient.GetStream(); byte[] data = new byte[1024]; //判斷網(wǎng)絡(luò)流是否可讀 if (stream.CanRead) { int len = stream.Read(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++) { messages.Items.Add(msg1[j]); } } } catch (System.Exception ex) { messages.Items.Add(ex.Message); } }
登錄游戲建立tcp連接,并且禁用登錄按鈕使能退出按鈕退出游戲則端口tcp連接,并且禁用退出按鈕以及使能登錄按鈕
private void quitGame_Click(object sender, EventArgs e) { tcpClient.Close(); beginGame.Enabled = true; quitGame.Enabled = false; }
4.命令交互
通過(guò)tcp向服務(wù)器發(fā)送數(shù)據(jù)
private void sendButton_Click(object sender, EventArgs e) { sendCommand(); } public void sendCommand() { if (tcpClient.Connected) { //向服務(wù)器發(fā)送數(shù)據(jù) string msg = command.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++) { messages.Items.Add(msg2[j]); } } } else { messages.Items.Add("連接已斷開(kāi)"); } }
5.信息展示
通過(guò)listbox展示所有接收到的消息
6.最終代碼
using System; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Windows.Forms; using System.Text; using System.Threading; namespace GameWindows { public partial class Form1 : Form { private NetworkStream stream; private TcpClient tcpClient = new TcpClient(); private String[] pictures={ "\\1.jpg", "\\2.jpg","\\3.jpg","\\4.jpg","5.jpg","6.jpg"}; private int postion = 0; public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; quitGame.Enabled = false; axWindowsMediaPlayer1.Hide(); pictureBox1.Image = Image.FromFile("G:\\VisualStudioProject\\GameWindows\\resources\\"+pictures[postion]); } private void start_Click(object sender, EventArgs e) { //新建線程打開(kāi)音頻文件 new Thread(new ThreadStart(beginPlay)).Start(); } private void stop_Click(object sender, EventArgs e) { //暫定播放 axWindowsMediaPlayer1.Ctlcontrols.pause(); } private void beginGame_Click(object sender, EventArgs e) { Thread thread = new Thread(new ThreadStart(connection)); thread.Start(); beginGame.Enabled = false; quitGame.Enabled = true; } private void quitGame_Click(object sender, EventArgs e) { tcpClient.Close(); beginGame.Enabled = true; quitGame.Enabled = false; } private void timer1_Tick(object sender, EventArgs e) { pictureBox1.Image = Image.FromFile("G:\\VisualStudioProject\\GameWindows\\resources\\"+pictures[(++postion)%pictures.Length]); } private void sendButton_Click(object sender, EventArgs e) { sendCommand(); } public void connection() { try { //向指定的IP地址的服務(wù)器發(fā)出連接請(qǐng)求 tcpClient.Connect("10.1.230.74", 3900); messages.Items.Add("連接成功!"); stream = tcpClient.GetStream(); byte[] data = new byte[1024]; //判斷網(wǎng)絡(luò)流是否可讀 if (stream.CanRead) { int len = stream.Read(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++) { messages.Items.Add(msg1[j]); } } } catch (System.Exception ex) { messages.Items.Add(ex.Message); } } public void beginPlay() { string s = @"G:\VisualStudioProject\GameWindows\resources\music.mp3"; axWindowsMediaPlayer1.URL = s; } public void sendCommand() { if (tcpClient.Connected) { //向服務(wù)器發(fā)送數(shù)據(jù) string msg = command.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++) { messages.Items.Add(msg2[j]); } } } else { messages.Items.Add("連接已斷開(kāi)"); } } } }
三、效果
為了方便展示圖片,播放間隔設(shè)置的1000ms。
四、總結(jié)
C#在網(wǎng)絡(luò)編程上特別的方便。
五、參考
http://www.dbjr.com.cn/article/230569.htm
六、源碼
https://github.com/TangtangSix/GameWindows
到此這篇關(guān)于C#基于TCP實(shí)現(xiàn)簡(jiǎn)單游戲客戶端的文章就介紹到這了,更多相關(guān)C#實(shí)現(xiàn)游戲客戶端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#之圓形無(wú)標(biāo)題欄橢圓窗體的實(shí)現(xiàn)詳解
本篇文章是對(duì)c#中圓形無(wú)標(biāo)題欄橢圓窗體的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06c#學(xué)習(xí)之30分鐘學(xué)會(huì)XAML
一個(gè)界面程序的核心,無(wú)疑就是界面和后臺(tái)代碼,而xaml就是微軟為構(gòu)建應(yīng)用程序界面而創(chuàng)建的一種描述性語(yǔ)言,也就是說(shuō),這東西是搞界面的2016-11-11C#實(shí)現(xiàn)矩陣加法、取負(fù)、數(shù)乘、乘法的方法
這篇文章主要介紹了C#實(shí)現(xiàn)矩陣加法、取負(fù)、數(shù)乘、乘法的方法,涉及C#針對(duì)矩陣的數(shù)學(xué)運(yùn)算相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-08-08C#中把Datatable轉(zhuǎn)換為Json的5個(gè)代碼實(shí)例
這篇文章主要介紹了C#中把Datatable轉(zhuǎn)換為Json的5個(gè)代碼實(shí)例,需要的朋友可以參考下2014-04-04