C#做传奇登陆器问题(贴上源码)大家帮我分析下啊!

zb328933803 2009-09-08 05:36:37
在登录游戏后、出现了一个问题 憋了我一晚上!!没想出来!!希望大家帮我想想啊!谢谢大家拉~

在登录游戏后 出现了服务器名称是乱码!能输入账号和密码 就是不开门!门上石乱码! 但是该下服务器名字

为英文或者数字的时候 又正常显示!不知道为什么 中文就是乱码!下面是我的源码///

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Net.Sockets;
using System.Net;

namespace Legend_of_mir2
{
public partial class Main : Form
{
//服务器名称数组
string[] ServerName = new string[25];
//服务器IP地址数组
string[] ServerIP = new string[25];
//服务器端口数组
string[] ServerPort = new string[25];
//服务器名称用于写入配置文件
string StartGameName = null;
//服务器IP地址用于写入配置文件
string StartGameNameIP = null;
//服务器端口用于写入配置文件
int StartGameNamePort = 7000;
public Main()
{
InitializeComponent();
}
/// <summary>
/// 程序加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Main_Load(object sender, EventArgs e)
{
//判断是否在传奇目录
if (File.Exists(Environment.CurrentDirectory + "\\map\\0.map"))
{

}
else
{
MessageBox.Show("请在传奇目录运行!","提示");
//关闭程序
Application.Exit();
}
}

/// <summary>
/// 点击进入游戏按钮触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
//获取应用程序路径
string path = Environment.CurrentDirectory;
//检测并创建配置文件
FileStream FsFtp = new FileStream(path + "\\ftp.ini", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream FsMir = new FileStream(path + "\\mir.ini", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream FsMst = new FileStream(path + "\\mirsetup.ini", FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
//关闭流
FsFtp.Close();
FsMir.Close();
FsMst.Close();
//写入配置文件
//配置文件ftp.ini
StreamWriter SwFtp = new StreamWriter(path + "\\ftp.ini");
SwFtp.WriteLine("[Server]");
SwFtp.WriteLine("ServerCount=1");
SwFtp.WriteLine("Server1caption=" + StartGameName);
SwFtp.WriteLine("Server1name=" + StartGameName.ToString().Trim());
//配置文件mir.ini
StreamWriter MrFtp = new StreamWriter(path + "\\mir.ini");
MrFtp.WriteLine("[setup]");
MrFtp.WriteLine("ServerAddr=" + StartGameNameIP);
MrFtp.WriteLine("FontName=Fixedsys");
//配置文件mirsetup.ini
StreamWriter MsFtp = new StreamWriter(path + "\\mirsetup.ini");
MsFtp.WriteLine("[setup]");
MsFtp.WriteLine("ServerAddr=" + StartGameNameIP);
MsFtp.WriteLine("FontName=Fixedsys");
//关闭流
MsFtp.Close();
MrFtp.Close();
SwFtp.Close();
try
{
//设置启动进程信息
ProcessStartInfo info = new ProcessStartInfo();
//启动文件
info.FileName = path + "\\Mir.Client.dat";
//禁止使用系统程序外壳程序启动进程
info.UseShellExecute = false;
//启动进程
Process.Start(info);
}
catch (Exception ex)
{
//异常
MessageBox.Show("意外错误!!!"+ex.Message); ;
}


}
/// <summary>
/// 添加新服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddGames_Click(object sender, EventArgs e)
{
//统计服务器数量
int Num = ListBox.Items.Count;

#region 服务器名称
if (tbName.Text != "" || tbName.Text != null)
{
//添加服务器名称进列表
ListBox.Items.Add(tbName.Text.Trim());
//添加服务器名称进入数组
ServerName[Num] = this.tbName.Text.Trim();
}
else
{
//服务器名称为填写
MessageBox.Show("请填写服务器名称!");
}
#endregion

#region IP地址判断
//获取用户输入IP地址
string ip = this.tbIP.Text.Trim();
//正则表达式判断IP地址合法性
if (System.Text.RegularExpressions.Regex.IsMatch(ip, "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}"))
{
string[] ips = ip.Split('.');
if(ips.Length == 4 || ips.Length == 6)
{

if (System.Int32.Parse(ips[0]) < 256 && System.Int32.Parse(ips[1]) < 256 & System.Int32.Parse(ips[2]) < 256 & System.Int32.Parse(ips[3]) < 256)
{
//添加IP地址进入数组
ServerIP[Num] = ip;
}
else
{
//清除列表中 当前用户输入的错误信息
ListBox.Items.Remove(tbName.Text.Trim());
MessageBox.Show("IP地址错误!请从新输入!");

}

}
else
{
//清除列表中 当前用户输入的错误信息
ListBox.Items.Remove(tbName.Text.Trim());
MessageBox.Show("IP地址错误!请从新输入!");

}

}

else
{
//清除列表中 当前用户输入的错误信息
ListBox.Items.Remove(tbName.Text.Trim());
MessageBox.Show("IP地址错误!请从新输入!");

}
#endregion

#region 端口号判断
try
{
//获取用户输入端口号
int Port = int.Parse(this.textBox2.Text.Trim());
//判断端口号是否为整数
int TextNum = Convert.ToInt32(Port);
//添加端口号进入数组
ServerPort[Num] = Port.ToString();
}
catch
{
//清除列表中 当前用户输入的错误信息
ListBox.Items.Remove(tbName.Text.Trim());
MessageBox.Show("对不起,端口号不正确!请重新输入");

}
#endregion


}
/// <summary>
/// 选择服务器时触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBox_MouseDown(object sender, MouseEventArgs e)
{
//获取用户在列表中 选择的项
int Num = ListBox.SelectedIndex;
//如果列表为空
if (Num == -1)
{
MessageBox.Show("还未添加服务器,\r\r\n请添加服务器!","友情提示");
return;
}
//获得用户选择的服务器IP地址
string Serverip = ServerIP[Num];
//获得用户现在的服务器端口
string Serverport = ServerPort[Num];
//状态显示
State.Text = "正在测试.....";
try
{
//测试服务器端口是否开放
TcpClient tp = new TcpClient(Serverip, int.Parse(Serverport));
//结束连接
tp.Close();
//状态显示
State.Text = "该服务器正常运行!";
//设置进程启动参数----IP name port
StartGameName = ServerName[Num].ToString();
StartGameNameIP = ServerIP[Num].Trim();
StartGameNamePort = int.Parse(ServerPort[Num]);
}
catch (Exception)
{
State.Text = "该服务器维护中!";
}


}
/// <summary>
/// 鼠标移动到listBox触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ListBox_MouseEnter(object sender, EventArgs e)
{
//如果listbox还没选择项
if (ListBox.SelectedIndex == -1)
{
//如果列表框项数量>0
if (ListBox.Items.Count > 0)
{
//默认选择第一项
ListBox.SelectedIndex = 0;
}
else
{
//设置为未选择状态
ListBox.SelectedIndex = -1;
}
}
}
}
}
...全文
1199 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mark2007wang 2010-12-01
  • 打赏
  • 举报
回复
历害,这个能直接生成么,先借鉴一下,谢谢!
falcon_fei 2010-08-19
  • 打赏
  • 举报
回复
我用这个源码直接生成了,测试过,确实可以正常进入。但不知道为什么登录后,里面人物,怪升上有点花,像长了两个翅膀样的。黑黑的。
lovelan1748 2009-09-08
  • 打赏
  • 举报
回复
代码不错,帮顶
ncjcz 2009-09-08
  • 打赏
  • 举报
回复
StreamWriter SwFtp = new StreamWriter(path + "\\ftp.ini",Encoding.UTF7);//红色编码部分你换成合适的编码比如UTF8 gb2312等

所有的写入流都换下
starj1 2009-09-08
  • 打赏
  • 举报
回复
没仔细看,猜测是文字的编码问题吧?
jdhlowforever 2009-09-08
  • 打赏
  • 举报
回复
看完了。写的挺好的。厉害!
NewUser2008 2009-09-08
  • 打赏
  • 举报
回复
zb328933803 2009-09-08
  • 打赏
  • 举报
回复
谢谢各位啦! 哈哈 解决了! 把解决部分的源码贴上! 呵呵 一个登陆器完成 了!!

主要是修改 进入游戏 按钮触发事件-----


/// <summary>
/// 点击进入游戏按钮触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
try
{
//获取应用程序路径
string path = Environment.CurrentDirectory;
//检测并创建配置文件
FileStream FsFtp = new FileStream(path + "\\ftp.ini", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream FsMir = new FileStream(path + "\\mir.ini", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
FileStream FsMst = new FileStream(path + "\\mirsetup.ini", FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);

//写入配置文件
//配置文件ftp.ini
StreamWriter SwFtp = new StreamWriter(FsFtp, Encoding.Unicode);
SwFtp.WriteLine("[Server]");
SwFtp.WriteLine("ServerCount=1");
SwFtp.WriteLine("Server1caption=" + StartGameName);
SwFtp.WriteLine("Server1name=" + StartGameName.ToString().Trim());
//配置文件mir.ini
StreamWriter MrFtp = new StreamWriter(FsMir, Encoding.Unicode);
MrFtp.WriteLine("[setup]");
MrFtp.WriteLine("ServerAddr=" + StartGameNameIP);
MrFtp.WriteLine("FontName=宋体");

//配置文件mirsetup.ini
StreamWriter MsFtp = new StreamWriter(FsMst, Encoding.Unicode);
MsFtp.WriteLine("[setup]");
MsFtp.WriteLine("ServerAddr=" + StartGameNameIP);
MsFtp.WriteLine("FontName=宋体");

//关闭流
MsFtp.Close();
MrFtp.Close();
SwFtp.Close();
//关闭流
FsFtp.Close();
FsMir.Close();
FsMst.Close();
//设置启动进程信息
ProcessStartInfo info = new ProcessStartInfo();
//启动文件
info.FileName = path + "\\Mir.Client.dat";
//禁止使用系统程序外壳程序启动进程
info.UseShellExecute = false;
//启动进程
Process.Start(info);

}
catch (Exception ex)
{
//异常
MessageBox.Show("意外错误!!!"+ex.Message); ;
}
}
jy251 2009-09-08
  • 打赏
  • 举报
回复
终于知道传奇的登陆器是怎么回事了,原来就是写个配置文件,让客户端读取这个配置文件啊。

既然中文是乱码,E文和数字都正常,那么肯定是字符编码的问题。
传奇是使用Delphi写的,并且在Delphi中有两种字符串类型:AnsiString和WideString。
AnsiString 是 ANSI码,而 WideString 是unicode码,c#只支持unicode码。

你可以试着在写配置文件的时候使用UTF8格式,因为AnsiString可以支持UTF8。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧