服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#基于TCP实现简单游戏客户端的完整实例

C#基于TCP实现简单游戏客户端的完整实例

2022-12-12 11:32醉意丶千层梦 C#

这篇文章主要给大家介绍了关于C#基于TCP实现简单游戏客户端的相关资料,通过本文介绍的方法可以直接实现游戏客户端,是个非常适合学习的实例需要的朋友可以参考下

一、界面

左上方播放音频按钮和停止播放下面是图片展示再下面是进入游戏以及退出游戏最后是命令输入框右边是消息框

C#基于TCP实现简单游戏客户端的完整实例

 

二、代码

1.播放音频

需要用到WindowsMediaPlayer组件,在常规组件的选择项里面可以找到。

C#基于TCP实现简单游戏客户端的完整实例

实现代码

		private void start_Click(object sender, EventArgs e)
      {
          //新建线程打开音频文件
          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.播放图片

使用定时器,使能并且设置每1000ms触发一次事件

C#基于TCP实现简单游戏客户端的完整实例

事件函数

      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协议和服务器建立连接

public void connection()
      {
          try
          {
              //向指定的IP地址的服务器发出连接请求

              tcpClient.Connect("10.1.230.74", 3900);
              messages.Items.Add("连接成功!");
              stream = tcpClient.GetStream();
              byte[] data = new byte[1024];
              //判断网络流是否可读            
              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.命令交互

通过tcp向服务器发送数据

      private void sendButton_Click(object sender, EventArgs e)
      {
          sendCommand();
      }
		public void sendCommand()
      {
          if (tcpClient.Connected)
          {
              //向服务器发送数据
              string msg = command.Text;
              Byte[] outbytes = System.Text.Encoding.Default.GetBytes(msg + "\n");
              stream.Write(outbytes, 0, outbytes.Length);
              byte[] data = new byte[1024];
              //接收服务器回复数据
              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("连接已断开");
          }

      }

5.信息展示

通过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)
      {
          //新建线程打开音频文件
          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地址的服务器发出连接请求

              tcpClient.Connect("10.1.230.74", 3900);
              messages.Items.Add("连接成功!");
              stream = tcpClient.GetStream();
              byte[] data = new byte[1024];
              //判断网络流是否可读            
              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)
          {
              //向服务器发送数据
              string msg = command.Text;
              Byte[] outbytes = System.Text.Encoding.Default.GetBytes(msg + "\n");
              stream.Write(outbytes, 0, outbytes.Length);
              byte[] data = new byte[1024];
              //接收服务器回复数据
              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("连接已断开");
          }

      }
  }
}

 

三、效果

为了方便展示图片,播放间隔设置的1000ms。

C#基于TCP实现简单游戏客户端的完整实例

 

四、总结

C#在网络编程上特别的方便。

 

五、参考

http://www.tuohang.net/article/258549.html

六、源码

https://github.com/TangtangSix/GameWindows

到此这篇关于C#基于TCP实现简单游戏客户端的文章就介绍到这了,更多相关C#实现游戏客户端内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_47281915/article/details/121561464

延伸 · 阅读

精彩推荐
  • C#C#中comboBox实现三级联动

    C#中comboBox实现三级联动

    给大家分享了C#中comboBox实现三级联动的全部代码,代码经过测试,有兴趣的朋友跟着做一下。...

    彬菌4012022-02-22
  • C#使用接口实现多继承的方法

    使用接口实现多继承的方法

    下面小编就为大家分享一篇c#使用接口实现多继承的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    杨明波(Leo Yang)8282022-02-17
  • C#C# Socket通信的实现(同时监听多客户端)

    C# Socket通信的实现(同时监听多客户端)

    这篇文章主要介绍了C# Socket通信的实现(同时监听多客户端),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    WizradMyL5052022-11-14
  • C#Path类 操作文件类的实例

    Path类 操作文件类的实例

    下面小编就为大家分享一篇Path类 操作文件类的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    happy多乐11472022-02-12
  • C#Unity3D实现NavMesh导航网格寻路

    Unity3D实现NavMesh导航网格寻路

    这篇文章主要为大家详细介绍了Unity3D实现NavMesh导航网格寻路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Gary_Leong10702022-09-07
  • C#c# 如何用组合替代继承

    c# 如何用组合替代继承

    这篇文章主要介绍了c# 如何用组合替代继承,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下...

    丹枫无迹3832022-11-01
  • C#C#禁止textbox复制、粘贴、剪切及鼠标右键的方法

    C#禁止textbox复制、粘贴、剪切及鼠标右键的方法

    这篇文章主要介绍了C#禁止textbox复制、粘贴、剪切及鼠标右键的方法,涉及C#针对窗口消息的处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    我心依旧12002021-10-25
  • C#C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字

    C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字

    这篇文章主要介绍了C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字,需要的朋友可以参考下...

    Dandelion_drq7002022-02-22