C#编写网游客户端连接游戏服务器

文章目录

  • 一、编写内容
  • 二、准备工作
    • 1. 创建项目
    • 2. 界面设计
    • 3. 连接服务器
    • 4. 发送数据
    • 5. 播放背景音乐
    • 6. 变化背景图片
    • 7. 效果演示
  • 三、完整代码
  • 四、参考

编译软件:Visual Studio 2019
编译环境:Windows 10
使用语言:C#

一、编写内容

本文章编写一个网游客户端,游戏服务器的校园内网IP地址为 10.160.230.74,端口为3900,采用TCP连接,主要功能有四个,如下:
①连接成功后,可以将服务器发来的消息不停地显示在 textbox 中;
②客户端要发给服务器的数据,通过 textbox 输入或者点击 button ;
③能够播放背景音乐;
④每隔30秒,变换一次游戏背景图片。
本文章涉及到了各个控件的基本使用、TCP的连接、客户端与服务器端的数据传输等等。

二、准备工作

1. 创建项目

  • 新建窗体应用,下一步,填写项目名和路径即可创建

C#编写网游客户端连接游戏服务器_第1张图片

  • 添加WindowsMediaPlayer 控件后续播放背景音乐需要使用到,点击工具,选择工具箱项,即是下图界面。

C#编写网游客户端连接游戏服务器_第2张图片

  • 选择 “ COM 组件 ” ,勾选上 “ Windows Media Player ” ,再点击 “ 确定 ” 。

2. 界面设计

  • textbox —— 2个(输入框、显示框)
  • button —— 5个(发送、进入游戏、退出游戏、播放、停止)
  • picturebox —— 1个(图片显示)
  • trackbar —— 1个(音量调节)
  • label —— 1个(音量显示)
  • groupbox —— 2个(控件容器)
  • WindowsMediaPlayer —— 1个(媒体播放器)
  • timer —— 1个(图片变化)

C#编写网游客户端连接游戏服务器_第3张图片
axWindowsMediaPlayer
在这里插入图片描述

3. 连接服务器

实现功能:点击连接游戏按钮后,能连接服务器,若连接成功,则将服务器发来的消息不停地显示在 textbox 中;若连接失败,则在 textbox 中显示 “ 服务器未启动 ” 。

  • 双击 “ 连接游戏 ” 按钮,转到代码编辑区。
    在 button2_Click 函数体内,编写连接的代码,
    代码:
private NetworkStream stream;
private TcpClient tcpClient = new TcpClient();
  private void button2_Click(object sender, EventArgs e)
        {
            /*
        * 连接服务器
        */
            try
            {
                //向指定的IP地址的服务器发出连接请求
                tcpClient.Connect("10.1.230.74", 3900);
                textBox2.AppendText("连接成功!");
                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++)
                    {
                        textBox2.AppendText(msg1[j]);
                    }
                }
            }
            catch
            {
                textBox2.AppendText("服务器未启动!");
            }
   }

4. 发送数据

实现功能:客户端要发给服务器的数据,通过 textbox 输入,然后点击 button 发送出去,并将服务器端返回结果显示在 textbox 中。

  • 双击 “ 发送 ” 按钮,转到编辑代码的文件中,在 button1_Click 函数中编写以下的代码。
 private void button1_Click(object sender, EventArgs e)
        {
            //判断连接是否断开
            if (tcpClient.Connected)
            {
                //向服务器发送数据
                string msg = textBox1.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++)
                    {   
                        textBox2.AppendText(msg2[j]);
                    }
                    //刷新输入框
                    textBox1.Clear();
                    //将光标集中到输入框中
                    textBox1.Focus();
                }
            }
            else
            {
                textBox2.AppendText("连接已断开");
            }

        }

5. 播放背景音乐

实现功能:当进入游戏后,开始播放背景音乐,并能调节音量大小。

private string s = @"I:\IOT\CsProject\GameClient\data\mp3\Bloom_of_Youth.mp3";
private void button4_Click(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //用于暂停正在播放的背景音乐
            axWindowsMediaPlayer1.Ctlcontrols.pause();
        }

6. 变化背景图片

实现功能:每隔30秒我这里是3s方便演示,变换一次游戏背景图片。
C#编写网游客户端连接游戏服务器_第4张图片
C#编写网游客户端连接游戏服务器_第5张图片

代码:

 private void timer1_Tick(object sender, EventArgs e)
        {
            flag++;
            string picturePath = @"I:\IOT\CsProject\GameClient\data\pictures\" + flag + ".jpeg";
            //设置图片填充
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox1.Image = Image.FromFile(picturePath);
            if (flag == 4)
            {
                flag = 0;
            }
        }

7. 效果演示

C#编写网游客户端连接游戏服务器_第6张图片

三、完整代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GameClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            trackBar1.Value = 0;
            label1.Text = "0";
    
        }
        //分别创建 TcpClient 和 NetworkStream 的对象
        private NetworkStream stream;
        private TcpClient tcpClient = new TcpClient();
        //定义flag变量
        private int flag = 0;
        //字符串存储音乐路径
        private string s = @"I:\IOT\CsProject\GameClient\data\mp3\Bloom_of_Youth.mp3";
        /*****************
         * 进入游戏
        *****************/
        private void button2_Click(object sender, EventArgs e)
        {
            /*
        * 连接服务器
        */
            try
            {
                //向指定的IP地址的服务器发出连接请求
                tcpClient.Connect("10.1.230.74", 3900);
                textBox2.AppendText("连接成功!");
                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++)
                    {
                        textBox2.AppendText(msg1[j]);
                    }
                }
            }
            catch
            {
                textBox2.AppendText("服务器未启动!");
            }
            /******************
            * 播放背景音乐
            ******************/
            //设置音量键值
            trackBar1.Value = 30;
            label1.Text = "30";
     
            //设置为循环播放
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            //设置初始音乐的音量大小(范围:0——100)
            axWindowsMediaPlayer1.settings.volume = 30;
            //设置播放歌曲的路径
            axWindowsMediaPlayer1.URL = s;


        }
   

        private void axWindowsMediaPlayer1_Enter(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //判断连接是否断开
            if (tcpClient.Connected)
            {
                //向服务器发送数据
                string msg = textBox1.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++)
                    {   
                        textBox2.AppendText(msg2[j]);
                    }
                    //刷新输入框
                    textBox1.Clear();
                    //将光标集中到输入框中
                    textBox1.Focus();
                }
            }
            else
            {
                textBox2.AppendText("连接已断开");
            }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            axWindowsMediaPlayer1.Ctlcontrols.play();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //用于暂停正在播放的背景音乐
            axWindowsMediaPlayer1.Ctlcontrols.pause();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            //控制音量大小
            axWindowsMediaPlayer1.settings.volume = trackBar1.Value;
            //控制音量显示
            label1.Text = trackBar1.Value.ToString();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            flag++;
            string picturePath = @"I:\IOT\CsProject\GameClient\data\pictures\" + flag + ".jpeg";
            //设置图片填充
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox1.Image = Image.FromFile(picturePath);
            if (flag == 4)
            {
                flag = 0;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (stream != null)
            {
                stream.Close();
                tcpClient.Close();
            }
            textBox2.Clear();
            //停止播放背景音乐
            axWindowsMediaPlayer1.Ctlcontrols.stop();
        }
       
    }
}

四、参考

AxWindowsMediaPlayer的详细用法

你可能感兴趣的:(#,网络通信,c#,网络通信,visualstudio)