网游客户端练习

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

准备工作

①新建一个窗体应用
在这里插入图片描述
②添加控件
在这里插入图片描述
右键常规,点击选择项
在这里插入图片描述
添加其余控件
textbox —— 2个(输入框、显示框)
button —— 3个(发送、进入游戏、退出游戏)
picturebox —— 1个(图片显示)
trackbar —— 1个(音量调节)
label —— 1个(音量显示)
groupbox —— 2个(控件容器)
WindowsMediaPlayer —— 1个(媒体播放器)
在这里插入图片描述

连接服务器

双击BUTTON2,进入代码编写,代码如下

private void button2_Click(object sender, EventArgs e)
        {
            /*
        * 连接服务器
        */
            try
            {
                //实例化
                tcpClient = new TcpClient();
                //向指定的IP地址的服务器发出连接请求
                tcpClient.Connect("10.160.52.106", 3900);
                //获取网络传输流
                stream = tcpClient.GetStream();
                //接受数据并转化为字符串
                byte[] data = new byte[1024];
                int receive = stream.Read(data, 0, 1024);
                string msg = Encoding.Default.GetString(data, 0, receive);
                //去除字符串中的终端转义字符
                msg = strDelete(msg);
                //显示出来
                textBox2.AppendText(msg);
            }
            catch
            {
                textBox2.AppendText("服务器未启动" + Environment.NewLine);
            }
        }

        private string strDelete(string str)
        {
            int flag = -1, de = 0;
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == ' ')
                {
                    flag = i;
                }
                if (flag != -1)
                {
                    de++;
                }
                if (str[i] == 'm' && flag != -1)
                {
                    str = str.Remove(flag, de);
                    i = flag - 1;
                    flag = -1;
                    de = 0;
                }
            }
            return str;
        }

运行结果
在这里插入图片描述

传输数据

在界面设计文件中,双击 “ 发送 ” 按钮,转到编辑代码的文件中,在 button1_Click 函数中编写以下的代码。

private void button1_Click(object sender, EventArgs e)
        {
            //获取textBox1内的文本内容
            string msg = textBox1.Text + "\n";
            //将文本内容转化成比特流并发送给服务器
            byte[] data = new byte[1024];
            data = Encoding.Default.GetBytes(msg);
            stream.Write(data, 0, data.Length);
            //接收服务器端传来的数据流并转化为字符串
            byte[] data1 = new byte[1024];
            int receive = stream.Read(data1, 0, 1024);
            msg = Encoding.Default.GetString(data1, 0, receive);
            //去除字符串中的终端转义字符
            msg = strDelete(msg);
            //清除显示框之前的内容
            textBox2.Clear();
            //显示数据
            textBox2.AppendText(msg);
            //刷新输入框
            textBox1.Clear();
            //将光标集中到输入框中
            textBox1.Focus();
        }

代码中,发送数据会加一个 \n ,这是由于命令行输入时,是以换行表示输入结束。

背景音乐

在构造函数中添加以下的代码,在程序运行之后,设置音量调节器的初始值(50),并将 WindownsMediaPlayer 控件隐藏起来。

public Form1()
        {
            InitializeComponent();

            //设置音量调节器的初始位置
            trackBar1.Value = 50;
            label1.Text = "50";
            axWindowsMediaPlayer1.Hide();
        }

在 button1_Click 函数内添加后半部分的代码

private void button2_Click(object sender, EventArgs e)
        {
            /*
        * 连接服务器
        */
            try
            {
                //实例化
                tcpClient = new TcpClient();
                //向指定的IP地址的服务器发出连接请求
                tcpClient.Connect("10.160.52.106", 3900);
                //获取网络传输流
                stream = tcpClient.GetStream();
                //接受数据并转化为字符串
                byte[] data = new byte[1024];
                int receive = stream.Read(data, 0, 1024);
                string msg = Encoding.Default.GetString(data, 0, receive);
                //去除字符串中的终端转义字符
                msg = strDelete(msg);
                //显示出来
                textBox2.AppendText(msg);
            }
            catch
            {
                textBox2.AppendText("服务器未启动" + Environment.NewLine);
            }
            /******************
           * 播放背景音乐
           ******************/
            //设置音量键值
            trackBar1.Value = 50;
            label1.Text = "50";
            //字符串存储音乐路径
            string s = @"C:\Users\ASUS\Music\damian.mp3";
            //设置为循环播放
            axWindowsMediaPlayer1.settings.setMode("loop", true);
            //设置初始音乐的音量大小(范围:0——100)
            axWindowsMediaPlayer1.settings.volume = 50;
            //设置播放歌曲的路径
            axWindowsMediaPlayer1.URL = s;
        }

双击 trackBar1 控件,转到代码编辑区,编写如下的代码

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

运行结果
在这里插入图片描述

背景图片

public Form1()
        {
            InitializeComponent();
            trackBar1.Value = 50;
            label1.Text = "50";
            axWindowsMediaPlayer1.Hide();
            string picturePath = @"D:KuGou\MP3\1.jpg";
            //设置图片填充
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
            pictureBox1.Image = Image.FromFile(picturePath);
            //设置音量调节器的初始位置
         
        }

在这里插入图片描述

总结

本文章的服务器端是建立在学校里的,如果要连上去,需要连上学校的网,才能够登录上去,是内网的 IP ,主要学习是如何通过 C# 的 TcpClient 类建立连接,并使用 NetworkStream 类传输数据,注意,在将字符串编码成比特流时,主要编码方式要与解码方式相同,不然会出现乱码。
参考:(https://blog.youkuaiyun.com/ssj925319/article/details/109746267)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值