本文章编写一个网游客户端,游戏服务器的校园内网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)