我目前正在玩java为桌面应用程序创建一个身份验证服务器,到目前为止,我已经能够让客户端和服务器像聊天服务器/客户端一样进行通信.
我确实知道我只有一小部分工作,有许多事情需要学习,但现在在这个阶段,我想知道如何进行身份验证.
例如,这是服务器代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class LoginServer
{
public static void main(String[] args) throws Exception {
int port = 7000;
int id = 1;
ServerSocket loginserver = null;
try
{
loginserver = new ServerSocket(port);
System.out.println("LoginServer started...");
}
catch (IOException e) {
System.out.println("Could not listen on port: " + port);
System.exit(-1);
}
while (true)
{
Socket clientSocket = loginserver.accept();
ClientServiceThread cliThread = new ClientServiceThread(clientSocket, id++);
cliThread.start();
}
} …Run Code Online (Sandbox Code Playgroud) 我有一个 Helper 类:
class Helper : Settings
{
[Setting, DefaultValue(false)]
public bool DeclineData { get; set; }
// ....
[Setting, DefaultValue(new List<string>())]
public List<string> AcceptList { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但是我的DefaultValueforList<string>导致错误:
属性参数必须是属性参数类型的常量表达式、typeof 表达式或数组创建表达式
我也试过typeof(List<string>)哪个也失败了。
Setting实际上System.Attribute是Settings从它继承的,这不是我的电话,因为它不是我的代码或对更改开放。
我的问题是,如何DefaultValue为我的财产设置 a AcceptList?
虽然 Selman22 答案不会产生直接错误来设置默认值,但它不会让它序列化或反序列化数据,并且由于我对这个混淆 API 的信息非常有限,所以我遵循了不同的路线。
这不是一个直接的解决方案,而是一种解决方法,直到我找出有关此 API 的更多信息,通过将 my 设置DefaultValue("")为空并使用我的属性作为带有分隔符的字符串在私有属性中从字符串来回转换为列表我能够保存我需要的数据。
我有一个插件系统,我用它MarshalByRefObject来创建每个插件的隔离域,因此用户可以重新加载他们认为合适的新版本,而无需关闭主应用程序.
现在我需要允许插件查看当前正在运行的插件,并且可能启动/停止特定的插件.
我知道如何从包装器发出命令,例如在下面的代码中:
using System;
using System.Linq;
using System.Reflection;
using System.Security.Permissions;
namespace Wrapper
{
public class RemoteLoader : MarshalByRefObject
{
private Assembly _pluginAassembly;
private object _instance;
private string _name;
public RemoteLoader(string assemblyName)
{
_name = assemblyName;
if (_pluginAassembly == null)
{
_pluginAassembly = AppDomain.CurrentDomain.Load(assemblyName);
}
// Required to identify the types when obfuscated
Type[] types;
try
{
types = _pluginAassembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types = e.Types.Where(t => t != null).ToArray();
}
var type = types.FirstOrDefault(type => …Run Code Online (Sandbox Code Playgroud) 这是一个非常有趣的事情,不知道为什么会发生,但当我这样做:
(item.Count / query.Count) * 100
Run Code Online (Sandbox Code Playgroud)
它不会给我任何错误只是回复0和当我这样做:
(item.Count * 100) / query.Count
Run Code Online (Sandbox Code Playgroud)
它运作得很好,我在这里缺少什么?
我遇到的另一个问题是将其输出格式化为字符串:
double perc = (item.Count * 100) / query.Count;
MessageBox.Show(perc.ToString("P5"));
Run Code Online (Sandbox Code Playgroud)
不工作给了我一个巨大的总和,33,333.33或者33,000.00,我希望它看起来像这样33.33%,我尝试了几个变化,但由于某种原因它不会让我得到.33如果我设置括号加倍它得到我.00,如果我不这样做不给我.33
我目前有一个函数,它将根据数据量创建函数的X任务,我想更新一个int变量,每个线程执行多少数据来显示progressBar.
目前我的所有UI都是从计时器更新的,所以不是从线程委托更新UI(我认为在这种情况下会更麻烦)我会更新一个变量,计数稍后会被计时器选中并更新UI.
我想知道的是,锁定是更新变量的好方法还是有更好的方法?
计时器是否能够在非常频繁地使用它时读取该变量,或者即使在更新时它仍然能够读取它?
这是一个大致的例子:
private static readonly object counterLock = new object();
int myCounter = 0;
private void FunctionExecutedByAllRunnningThreads()
{
int executed = 0;
foreach (some data)
{
//do something with this data
executed++;
}
lock (counterLock)
myCounter += executed;
}
Run Code Online (Sandbox Code Playgroud) 我有一个命令处理程序,基本上这样工作:
ControlList.Handlers[CommandType.MyCommandComesHere].Handle(data);
Run Code Online (Sandbox Code Playgroud)
Handlers是一个Dictionary<CommandType, ICommandHandler>并且CommandType是一个枚举.
Handle 轮流将导致它:
using System;
using log4net;
namespace My_Application
{
public class MyCommand : ICommandHandler
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(MyCommand));
public void Handle(Events data)
{
Console.WriteLine("I can load cs files on the fly yay!!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何才能使我的应用程序编译并让我在运行时使用该cs文件?
任何简单的例子都会非常受欢迎,但不是必需的,只要我能得到一些关于我需要寻找什么的指示,因为我甚至不确定我需要做些什么来实现这一点.
为了简单起见,我目前正在尝试理解如何将cs文件加载到已经编译并且当前正在运行的应用程序中.
myThread是一个每秒执行一次的函数,基本上它会读取一些必须被解析和执行的数据.函数增长了很多,超过1500行代码,如下面的示例,有很多[if else if else]阻止大量重复,如sleep或SendToChat向控制台发送命令,并且很难维护对它做出改变等.
我想要一些建议(如果可能,有代码示例,这将有助于我理解布局)我如何重写它,我不是很有经验,所以我不太确定将这些代码变成更好的代码的可能性可维护性和可读性?
也可以随意评论任何功能或其他任何功能,因为它可以帮助我改进其他错误的东西.
这只是代码的一些示例,而不是整个代码,如果您觉得您需要代码中的任何其他信息,请随时提出,我会尽可能地发布.
PS:这不是一件事.
private void myThread()
{
while(isRunning)
{
// SOME PARSED DATA HERE
// if (parsedData matchs) do the below stuff
Messages received = new Messages
{
Sent = Convert.ToDateTime(match.Groups[1].Value),
Username = match.Groups[3].Value,
MessageType = (match.Groups[2].Length > 0) ? MsgType.System : MsgType.Chat,
Message = match.Groups[4].Value.Trim(),
CommandArgs = match.Groups[4].Value.ToLower().Trim().Split(' ')
};
// Get the user that issued the command
User user = usersList.Find(x => x.Name == recebe.received.ToLower());
if (user != null)
{
// different greetings …Run Code Online (Sandbox Code Playgroud) 当我尝试将下面插入我的MySQL时
INSERT INTO `rooms` (`id`, `ip`) VALUES ('131213', '-259857341');
Run Code Online (Sandbox Code Playgroud)
我失败了以下错误:
Warning: #1264 Out of range value for column 'ip' at row 1
Run Code Online (Sandbox Code Playgroud)
我环顾四周,但还没有找到如何解决或解决它...
我的字段是unsigned int,它应该适用于该条目.
有什么问题,如何解决?
我使用unsigned int因为我想使用inet_ntoa/aton存储ips.
编辑:
我在MySQL网站上使用unsigned INT作为推荐:
要存储由INET_ATON()生成的值,请使用INT UNSIGNED列而不是INT(已签名).如果使用带符号列,则无法正确存储与第一个八位字节大于127的IP地址对应的值.请参见第10.6节"超出范围和溢出处理".
http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html
我有以下示例:
public class Commands
{
public int ID { get; set; }
public List<string> Alias { get; set; }
}
public class UserAccess
{
public int AccessID { get; set; }
// other stuff not needed for the question
public List<Commands> AllowedCommands { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在我想在UserAccess上实现一种返回命令ID的方法,如果列表中没有找到别名,则返回NULL,请参阅下面我说的一个脏例子 HasCommand:
public class UserAccess
{
public ID { get; set; }
// other stuff not needed for the question
public List<Commands> AllowedCommands { get; set; }
public Commands HasCommand(string cmd)
{ …Run Code Online (Sandbox Code Playgroud) 在C++中,最简单的方法是创建一个临时容器来存储字符串和int,就像C#字典一样,我可以轻松地将字符串键与另一个字符串匹配,并增加或减少条目值int?
容器的内容来自一个字符串,其中每个用空格分隔的单词是一个键入口,每个键的所有值都以0开头.
Dictionary<string, int> Options = new Dictionary<string, int>();
Options.Add("xyz", 0);
Options.Add("abc", 0);
Options.Add("dfg", 0);
Run Code Online (Sandbox Code Playgroud)
然后我必须将它与用户选项进行比较,例如:
if (Options.ContainsKey(user_opt))
Options[user_opt]++;
Run Code Online (Sandbox Code Playgroud)
我最初尝试使用向量,但由于我对C++的了解仅为0,因此我大部分时间都处于困境.
有了矢量,这就是我得到的:
vector<string> Options;
boost::split(Options, m_StartMode, boost::is_any_of(" "));
Run Code Online (Sandbox Code Playgroud) c# ×7
.net-4.0 ×3
.net ×2
int ×2
winforms ×2
.net-3.5 ×1
c++ ×1
class ×1
client ×1
compare ×1
containers ×1
ignore-case ×1
java ×1
list ×1
locking ×1
mysql ×1
percentage ×1
readability ×1
string ×1
task ×1