当前位置:首页 » 《随便一记》 » 正文

C#基于TCP实现简单游戏客户端_醉意丶千层梦的博客

17 人参与  2022年04月07日 10:18  分类 : 《随便一记》  评论

点击全文阅读


文章目录

  • 一、界面
  • 二、代码
    • 1.播放音频
    • 2.播放图片
    • 3.登录和退出游戏
    • 4.命令交互
    • 5.信息展示
    • 6.最终代码
  • 三、效果
  • 四、总结
  • 五、参考
  • 六、源码

一、界面

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

在这里插入图片描述

二、代码

1.播放音频

需要用到WindowsMediaPlayer组件,在常规组件的选择项里面可以找到。
在这里插入图片描述
实现代码

		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触发一次事件
在这里插入图片描述
事件函数


        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连接,并且禁用登录按钮使能退出按钮

 private void beginGame_Click(object sender, EventArgs e)
        {

            Thread thread = new Thread(new ThreadStart(connection));
            thread.Start();
            beginGame.Enabled = false;
            quitGame.Enabled = true;

        }

退出游戏则端口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#在网络编程上特别的方便。

五、参考

https://blog.csdn.net/qq_43279579/article/details/109693257

六、源码

https://github.com/TangtangSix/GameWindows


点击全文阅读


本文链接:http://zhangshiyu.com/post/37487.html

连接  播放  服务器  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 才下眉头,却上心头后续在线(江蓠祈宸)_才下眉头,却上心头后续在线(江蓠祈宸)
  • 诱她,矜娇太子爷拿命宠!限时免费***章节速览_「顾青柠墨瑾川」爆款小说高能章节试读
  • [绑定好孕系统后,我杀疯了]最新章节在线阅读_「向阳陶倩晶晶」章节免费试读
  • (春到南楼雪尽处全书+后续)(苏枝夏傅庭州)_春到南楼雪尽处全书+后续列表_笔趣阁苏枝夏傅庭州
  • (番外)+(全书)温洛梨霍韫年(何处繁花醒洛梨结局+番外)_温洛梨霍韫年免费列表_笔趣阁(何处繁花醒洛梨结局+番外)
  • 时光不过大梦一场全文在线阅读_[江时宜傅临川]完结版免费在线阅读
  • 「我是男主的白月光」小说章节免费试读_[谢淮舟渺渺景平王]章节彩蛋限时释出‌
  • 我在眷恋里无路可逃+后续+完结(季微澜苏逸尘)全书免费_(季微澜苏逸尘)我在眷恋里无路可逃+后续+完结后续(季微澜苏逸尘)
  • 用我的情感交易我失忆他却疯了+后续+结局(妙妙傅沉玉姜月)列表_用我的情感交易我失忆他却疯了+后续+结局(妙妙傅沉玉姜月)用我的情感交易我失忆他却疯了+后续+结局在线
  • (番外)+(全书)余烬终成灰全书+后续(江晚照傅青辞)完结_(江晚照傅青辞)列表_笔趣阁(余烬终成灰全书+后续)
  • 我在回忆里万劫不复(秦见鹿秦临渊谢梵声)_我在回忆里万劫不复秦见鹿秦临渊谢梵声
  • 陆总跪求夫人复婚结局+番外+完结(许霜陆京墨)全书免费_(许霜陆京墨)陆总跪求夫人复婚结局+番外+完结后续(许霜陆京墨)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1