用C++写了一个内存修改器

读写进程从64K到2G这个过程为什么这么慢?
尝试使用过多线程 感觉比前面慢很多

2个回答

http://blog.csdn.net/siren0203/article/details/5786276

参考这个。。找到需要修改的地址才是关键

大部分地址都是无效的,你是穷尽搜索?那当然慢

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
用C++写了一个内存修改器
读写进程从64K到2G这个过程为什么这么慢? 尝试使用过多线程 感觉比前面慢很多
C++中常量在内存中的分布,以及用const_cast修改不同常量的问题
1. char* p = "abcde"; const char s[10] = “abcde”; const int x[2] = {1, 2}; const int i = 10; 四者分别放在哪里 // 比如是不是 p指向的"abcde"在文字常量区(.text????) s[10]被放在.rodata中? 那x[2]和i被放在哪里呢 2. 和上一个问题相关 为什么s[2]可以通过const_cast修改值 //x[1] x[0]也可以 用const_cast修改p[2]值程序会崩溃 好像i被载入了编译器的符号表,所以修改i对应的内存,输出i还是不变的? 为什么x[0] x[1] 不被载入符号表呢? 也就是为什么用const_cast修改他们会有不同的表现呢,起码有三种吧,麻烦分别解释下 参考,编译器的符号表:https://blog.csdn.net/heyabo/article/details/8745942 话说运行时为什么还有编译器的事?
嵌入式多线程开发,多线程共享数据什么时候需要使用volatile?
一般我们在多线程开发过程中,多个线程共享的全局变量或数据的时候都需要加互斥锁或者用信号量同步。 但是有的时候编译器还会优化的,例如写一个变量的时候,可能没有写到内存中,只是写在了本地的寄存器中, 这样多线程的时候一个线程修改了一个变量,另一个线程可能是不知道的,所以我认为多线程共享的全局变量应该使用volatile声明才安全。 但是在实际开发当中,很少看到多线程全局共享变量加volatile。不知道这样可以保证系统安全吗?
初学者求教 关于数组过大的问题
如果定义的数组过大,编译器不通过,以前知道动态分配内存,或者修改内存模式解决 今天突然看到一个程序,直接把数组定义成全局数组,便ok了 why? #include<stdio.h> int c[1001][1001]; int main(){ int n,m,i,j; char a[1001],b[1001]; scanf("%d %d",&n,&m); scanf("%s",a); scanf("%s",b); for(i=1;i<=m;i++) c[i][0]=0; for(i=0;i<=n;i++) c[0][i]=0; for(i=0;i<n;i++) for(j=0;j<m;j++){ if(a[i]==b[j]) c[i+1][j+1]=c[i][j]+1; else if(c[i][j+1]>=c[i+1][j]) c[i+1][j+1]=c[i][j+1]; else c[i+1][j+1]=c[i+1][j]; } printf("%d",c[n][m]); return 0; }
qt 运行出来的框图有残缺
# cpp文件 ``` #include "vsbak.h" #include "ui_vsbak.h" #include <QSettings> #include <QFileDialog> #include<QTime> #include<QtDebug> #include <QMessageBox> #define CONFIG_FILE "config.ini" const QString EXCLUDE_FILE = "/home/hu/project2";// 這個文件沒啥用 Vsbak::Vsbak(QWidget *parent) : QWidget(parent) , ui(new Ui::Vsbak) { ui->setupUi(this); QSettings *configIniRead = new QSettings(CONFIG_FILE, QSettings::IniFormat); dir_src = configIniRead->value("/main/bak_src").toString(); dir_dest = configIniRead->value("/main/bak_dest").toString(); // 配置文件里面有目标地址 gpg_key = configIniRead->value("/main/gpg_key").toString(); exclude_from = configIniRead->value("exclude/exclude").toString(); delete configIniRead; // init bash terminal //QProcess可以用于启动外部程序 cmd = new QProcess(this);// 因为与父类直接释放内存 // Sets the working directory to dir. QProcess will start the process in this directory. //The default behavior is to start the process in the working directory of the calling process. cmd->setWorkingDirectory(dir_src); //This signal is emitted when the process has made new data available //through its standard output channel (stdout). It is emitted regardless of the current read channel. connect(cmd, &QProcess::readyReadStandardOutput, this, &Vsbak::on_readyReadStandardOutput); connect(cmd, &QProcess::readyReadStandardError, this, &Vsbak::on_readyReadStandardError); ui->lineEdit->setText(dir_src); ui->lineEdit_2->setText(dir_dest); // 在ui里直接设置这个地址 // init comboBox init_comboBox(); // init radiobutton: choice full ui->radioButton->setChecked(true); ui->checkBox->setChecked(false); ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } /* * 设置最大可见数目为5,是不是不合理? */ void Vsbak::init_comboBox() // 找压缩好的文件 Combobox 下拉菜单 { /* * 1. 用一个对象进入dir-dest目录下 * 2. 过滤掉包含后追的文件 * 3. 获取被过滤的文件理解 */ // find all backup.tar.gz files //The QDir class provides access to directory structures and their contents. 不仅能看到结构,还可以看到目录 QDir *curDir = new QDir(dir_dest); //The QStringList class provides a list of strings. //可以让你提取一个新的列表只包含这些字符串包含一个特定的字符串(或匹配特定正则表达式) QStringList filter; // 过渡成一个目录 filter << "*.tar.gz" << "*.tar.gz.gpg"; curDir->setNameFilters(filter); // 过滤掉特定的目录下的文件 //Returns a list of QFileInfo objects for all the files and directories in the directory //QDir::entryInfoList()会获取该目录下所有目录和文件的QFileInfo对象的列表 QList<QFileInfo> *tarFileInfo = new QList<QFileInfo>(curDir->entryInfoList(filter)); /* * dir_dest 里面存放的其实都是被压缩的文件,所以用上面的后缀直接进行过滤 * 1. 设置最大的可见数目为5 * 2. 看目录里面有多少,然后放入这个comboBox * 3. 获取被过滤的文件 * 4. 按照顺序放入到combobox中 */ ui->comboBox->clear(); ui->comboBox->setMaxVisibleItems(5); // 最大可见数目 5 //The string will be inserted as the first item in the combobox. ui->comboBox->setInsertPolicy(QComboBox::InsertAtTop); for (int i=0; i< tarFileInfo->count(); i++)// count()只是计算里面的数量,tarFileinfo实际上是一个文件列表 ui->comboBox->addItem(tarFileInfo->at(i).fileName()); } Vsbak::~Vsbak() { delete ui; // 有何作用 if(cmd->state() == QProcess::Running){ cmd->terminate(); cmd->waitForFinished(); } } void Vsbak::on_readyReadStandardOutput() { // QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); // ui->label_4->setText(out); } void Vsbak::on_readyReadStandardError() { QMessageBox::information(0, "Error", cmd->readAllStandardError()); } // change dir_src void Vsbak::on_toolButton_clicked() { /* * 1. 或许dir_src的文件目录名称 * 2. 将dir_src的文件目录名写到lineEdit上面 * 3. 更新配置文件里面的信息 * 4. 设置工作目录 * */ QString dirname; dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_src, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_src = dirname; ui->lineEdit->setText(dir_src); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_src", dir_src); delete configIniWrite; cmd->setWorkingDirectory(dir_src); ui->label_4->setText("change source dir sucess!"); } } // change dir_dest void Vsbak::on_toolButton_2_clicked() { QString dirname; // getExistingDirectory 只获取文件夹 dirname = QFileDialog::getExistingDirectory(this, tr("Open Directory"), dir_dest, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(dirname.isEmpty()) return; else { dir_dest = dirname; ui->lineEdit_2->setText(dir_dest); QSettings *configIniWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); configIniWrite->setValue("/main/bak_dest", dir_dest); delete configIniWrite; ui->label_4->setText("change dest dir sucess!"); } } int Vsbak::get_min(QDateTime curTime) { QSettings *configIniReadWrite = new QSettings(CONFIG_FILE, QSettings::IniFormat); int lastTime = configIniReadWrite->value("/main/last_time").toInt();// 将值转化成整形 configIniReadWrite->setValue("/main/last_time", curTime.toTime_t()); delete configIniReadWrite; int minDiff = (curTime.toTime_t()-lastTime) / 60 + 1; return minDiff; } void Vsbak::on_checkBox_clicked() { if(ui->checkBox->isChecked()){ ui->checkBox_2->setEnabled(true); ui->checkBox_3->setEnabled(true); } else{ ui->checkBox_2->setEnabled(false); ui->checkBox_3->setEnabled(false); } } /* * 3 个 String类型 * targz:time + full.tar.gz * cmd_find:find ./ -type f | grep -v \'Permission denied\' > TEPLIST * cmd_tar *目录列表 * * * */ void Vsbak::on_pushButton_clicked(){ // The QDateTime class provides date and time functions. // 调用QDatetime里面的一个函数,赋给另一个QDatetime的类型 QDateTime current_date_time = QDateTime::currentDateTime(); // 初始化三个String类型 QString targz, cmd_find, cmd_tar; //RadioButton presents an option button that can be toggled on (checked) or off (unchecked). //Radio buttons are typically used to select one option from a set of options. //Use isChecked() to see if a particular button is selected. if(ui->radioButton->isChecked()){ // 如果radiobutton 被选择了,那么就进行备份,如果没有就只输出时间 // Linux find命令用来在指定目录下查找文件。 // 将目前目录其其下子目录中所有一般文件列出 # find . -type f // Linux grep 命令用于查找文件里符合条件的字符串。 // -v 或 --revert-match : 显示不包含匹配文本的所有行。 // 反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。 // ./ 表示当前目录的全路径 当前目录的全路径 没有这个 \'Permission denied\'???? //linux的命令,查找文件然后设置权限 // 这个是不管修改不修改,全部列出来 cmd_find = "find ./ -type f | grep -v \'Permission denied\' > TEPLIST";// 这个功能是什么呢 targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".full.tar.gz"; }else{ // 会替换掉前面的百分之1,替换规则是从小到大 //get_min是一个函数,看它具体怎么实现的,应该是循环遍历了current_date_time,找到最小???? int minDiff = get_min(current_date_time); // 获得是最小的查值 // 完成命令,把距离最新一次全部修改的文件单独列出来 cmd_find = QString("find ./ -mmin -%1 -type f | grep -v \'Permission denied\' > TEPLIST").arg(minDiff); targz = current_date_time.toString("yyyy-MM-dd_hh.mm.ss") + ".inc.tar.gz"; } // exclude from 是一个配置目录 // tar命令 //-v或--verbose 显示指令执行过程 // --totals 备份文件建立后,列出文件大小 //cmd_tar这是压缩tar的linux命令,将exclude里面的文件全部列出来,进行压缩 cmd_tar = QString("tar --verbose --totals --exclude-vcs %1 --files-from=TEPLIST -czf %2/%3").arg(exclude_from).arg(dir_dest).arg(targz);//?5 // 向调试器输出命令的执行结果,方便调试排错 qDebug()<< cmd_find << endl << cmd_tar<< endl; // 下面整个过程就是执行这个命令 QStringList cmd_pipe;// 初始化了一个String目录 cmd_pipe << "-c" << cmd_find; // 说明这个cmd-pipe已经变成了一个linux的cmd命令了 cmd->start("/bin/bash",cmd_pipe); // 开始一个程序 cmd->waitForFinished(); cmd->close(); cmd->start(cmd_tar);// cmd_tar 也变成了一个程序 cmd->waitForFinished(); cmd->close(); cmd->start("rm -f TEPLIST");// 强制删除teplist, teplist 就是临时文件 cmd->waitForFinished(); /*********** Encrypting*************/ // gpg-k 增加公共钥匙 if(ui->checkBox->isChecked()){ QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput());// 这个输出就不是很理解为什么 if(out.isEmpty()) // -o, --output FILE write output to FILE // c 说是使用对称加密,看起来很奇怪 cmd_enc = QString("gpg -c -o %1/%2.gpg %1/%2").arg(dir_dest).arg(targz); else // e 是加密数据 , 针对 用户 id 进行加密 cmd_enc = QString("gpg -e -r %1 -o %2/%3.gpg %2/%3").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); if(false == ui->checkBox_2->isChecked()){ QString cmd_rm = QString("rm %1/%2.gpg").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } if(false == ui->checkBox_3->isChecked()){ QString cmd_rm = QString("rm %1/%2").arg(dir_dest).arg(targz); cmd->start(cmd_rm); cmd->waitForFinished(); } /* * /home/hu/桌面/vsbak/backup/2019-11-13_19.38.57.full.tar.gz * */ // ui->comboBox->addItem(targz); init_comboBox(); } } void Vsbak::on_pushButton_2_clicked(){ QString targz = ui->comboBox->currentText(); if (targz.endsWith(".tar.gz.gpg")){ targz = targz.remove(".gpg"); QString cmd_enc; QString cmd_isKey = "gpg -k " + gpg_key; cmd->start(cmd_isKey); cmd->waitForFinished(); QString out = QString::fromLocal8Bit(cmd->readAllStandardOutput()); if(out.isEmpty()) cmd_enc = QString("gpg -d -o %1/%2 %1/%2.gpg").arg(dir_dest).arg(targz); else cmd_enc = QString("gpg -d -r %1 -o %2/%3 %2/%3.gpg").arg(gpg_key).arg(dir_dest).arg(targz); cmd->start(cmd_enc); cmd->waitForFinished(); } QString cmd_str = QString("tar -xvf %1/%2").arg(dir_dest).arg(targz); qDebug() << cmd_str; cmd->start(cmd_str); cmd->waitForFinished(); } ``` 上面是cpp文件 下面是 # h文件 #ifndef VSBAK_H #define VSBAK_H #include <QWidget> #include<QProcess> QT_BEGIN_NAMESPACE namespace Ui { class Vsbak; } QT_END_NAMESPACE class Vsbak : public QWidget { Q_OBJECT public: Vsbak(QWidget *parent = nullptr); ~Vsbak(); private slots: void on_readyReadStandardOutput(); void on_readyReadStandardError(); void on_toolButton_clicked(); void on_toolButton_2_clicked(); void on_pushButton_clicked(); void on_pushButton_2_clicked(); void on_checkBox_clicked(); private: Ui::Vsbak *ui; QProcess *cmd; QString dir_dest; QString dir_src; QString gpg_key; QString exclude_from; void init_comboBox(); int get_min(QDateTime curTime);// 获得整形 }; #endif // VSBAK_H 我运行之后出来的qt界面,原本是可以下拉选择的,但是都没有反映,这是为啥
请问下面的题答案是?以及为什么?
1)下面哪种方式可以让爬虫合理、合法地抓取当日尽可能多的数据? A. 通过漏洞进入他人计算机系统,把数据库dump出来。 B. 用大量低频关键词在目标站点上搜索,获得当日更全数据。 C. 找到热门的hub页,热门的话题,热门的账号,获取当日更全数据。 D. 用热门关键词在百度等搜索引擎上,用site:www.website.com + 关键词 查询,从而发现新数据 2)以下所列出的方法中,浏览器web数据抓取效率最高的方法是? A. selenium + phantomjs B. 使用chrome或者chrome内核抓取 C. 模拟web协议直接用wget或curl抓取 3)下面哪项是手机端抓取app数据相比web端的优势(多选): A. 手机端协议简单容易分析 B. 手机端可以使用模拟点击 C. 手机端就算出新版了旧版还是可以继续使用,不会立即停掉 D. 通常来说,手机端抓取同样信息量的数据,下载量更低 4)下面哪些代理支持rawsocket连接(多选)? A. HTTP代理 B. HTTPS代理 C. SOCKS4代理 D. SOCKS5代理 5)下面代码请求实际访问地址url是什么? url = "https://test.cn/test" params = { "xxxx":"1234" } headers = { "Host": "www.test.cn", "Accept-Encoding": "gzip,deflate", "Connection": "Keep-Alive" } requests.get(url, params, headers =headers, allow_redirects = False, verify = False) 假设http://test.cn/test?xxxx=1234返回的状态码302且response header里有Location:http://www.test.cn/dpool/ttt/domain.php?d=test&xxxx=1234 A. https://test.cn/test B. https://test.cn/test?xxxx=1234 C. https://www.test.cn/test?xxxx=1234 D.http://www.test.cn/dpool/ttt/domain.php?d=test&xxxx=1234 6)假如你要爬大量youtube视频的二进制内容,存储在本地,最佳的办法是? A. Mysql数据库存储 B. Redis存储 C. Mongodb存储 D. 文件系统 7)如果想爬自己手机应用上的HTTPS的数据,获得明文,下面哪个说法是正确的? A. 自己搭建一个HTTPS代理,让手机设置为这个代理,即可获得明文 B. 任何HTTPS明文都是可以获取的 C. 在PC上建立一个无线热点,让手机连这个热点,并使用Wireshare软件分析出HTTPS的明文数据 D. 通过让手机系统信任根证书,使用Man-in-the-middle中间人攻击技术,就可以获取任何HTTPS明文 8)以下哪个功能chromedriver协议不支持? A. 注入js文件 B. 模拟鼠标滑动 C. 网络请求的响应式处理 D. 同个实例可以同时操作多个页面 9)爬取数据过程中,哪个情况是最不可容忍的? A. 爬取的数据不完整,有部分数据遗失 B. 爬取程序非法关闭,内存泄露 C. 爬取的数据部分出错,手动修改 D. 不同版本的数据合并在一起 10)爬虫开发不会涉及到的技术或者知识有? A. tcp,udp传输协议 B. 反汇编技术 C. 数据库存储 D. 音视频流解析 E. 网络路由协议 F. 以上都会涉及
调用CefSharp.Cef.Shutdown,再次调用CefSharp.Cef.Initialize出现异常【红包感谢】
没有分因此不能悬赏,能帮忙解决问题红包感谢!! 今日在做一个小程序,需要嵌入浏览器,但自带的webbroswer实在太高(la)端(ji),因此使用CefSharp。 程序中需不断修改UserAgent,但是CefSharp是在开始时就将配置信息都写入CefSettings,再通过CefSharp.Cef.Initialize方法进行初始化。 后面就没有找到什么地方能够修改UserAgent。 初始化的代码为: ``` CefSharp.CefSettings setting = new CefSharp.CefSettings(); setting.Locale = "zh-CN"; setting.CachePath = "CHBrowser/BrowserCache3";//缓存路径 setting.AcceptLanguageList = "zh-CN,zh;q=0.8";//浏览器引擎的语言 setting.LocalesDirPath = "CHBrowser/localeDir3";//日志 setting.LogFile = "CHBrowser/LogData";//日志文件 setting.PersistSessionCookies = true;// setting.UserAgent = "";//浏览器内核 setting.UserDataPath = "CHBrowser/userData3";//个人数据 CefSharp.Cef.Initialize(setting); CefSharp.WinForms.ChromiumWebBrowser WebBrowser = new CefSharp.WinForms.ChromiumWebBrowser("http://www.baidu.com"); //初始页面 WebBrowser.Dock = DockStyle.Fill;//设置停靠方式 this.Controls.Add(WebBrowser);//加入窗体 ``` 自己的思路:想要修改UserAgent,就需要释放CefSharp.Cef,通过代码: ``` CefSharp.Cef.Shutdown(); ``` 进行释放。 之后再修改setting的信息,再调用 ``` CefSharp.Cef.Initialize(setting); ``` 调用以上代码的时候,程序不抛出异常,直接闪退了,输出记录提示:退出。返回值:0x80000003 求大神指导应如何处理!!! 经多方查询资料,初步判断问题为:在C++回调C#函数的时候,C#里的内存回收机制,会影响C++动态库的稳定性。C++回调C#里面的函数,C++里面用的是函数指针,但C#里面只能用委托了。造成错误。 参考:http://www.debugease.com/csharp/3532235.html 该文章提出解决方案: 在声明委托前要加上这句: [UnmanagedFunctionPointer(CallingConvention.Cdecl)] 包含在: using System.Runtime.InteropServices; 但是我的程序是直接引用的CefSharp,并未声明委托,我应该如何添加? 求大神指导: 1、是否可以另有办法修改UserAgent 或: 2、如何处理上述错误
重复调用jQuery ajax刷新Chart数据内存泄露问题,急~~~
在网页中使用<canvas>标签定义了图表,在js用setInterval定时使用ajax获取数据后刷新图表数据。发现浏览器内存一直在涨,浏览器使用的是FireFox。 js代码如下: ``` function FlowPageReday(){ var RefreshTimeOut = 10*1000; RefreshFlow(); /*每隔一定的时间刷新页面*/ setInterval("RefreshFlow()", RefreshTimeOut); } function RefreshFlow() { //var TestData = GetTestFlow(180); //console.info(TestData); var AjaxRequest = $.ajax({ url: "/dashboard/realtime_order/", data: "text",//数据类型text xml json script jsonp "success": function(traffic_data){ //console.info(traffic_data); RefreshOrderStart(traffic_data); traffic_data = null; }, "error": function(xhr,textStatus){ console.info("error"); console.info(xhr); } }); AjaxRequest = null; } function getRow() { var minutes_num = 3*60; var hour = 0; var minutes = 0; /* var time = GetTimeFunc(0,0); console.info(time[0]+":"+time[1]+":"+time[2]); */ var row = new Array(); for(var i=0; i<minutes_num; i++){ var tmp = GetTimeFunc(0,i-minutes_num); //console.info(tmp[0]+":"+tmp[1]+":"+tmp[2]); if(0 == tmp[1]){ row[i] = tmp[0]+":00"; } else if(30 == tmp[1]){ row[i] = tmp[0]+":"+tmp[1]; } else{ row[i] = ""; } } return row; } function RefreshOrderStart(order_data){ var row = getRow(); RefreshTotalFlow(row, order_data[0]); row = null; order_data = null; } function RefreshTotalFlow(row, inFlow){ var doc = $("#ucarfirstorder_total").get(0); var salesChartCanvas = doc.getContext("2d"); var salesChart = new Chart(salesChartCanvas); var salesChartData = { labels: row, datasets: [ { label: "订单总数", fillColor: "#D2B48C", strokeColor: "#D2B48C", pointColor: "#D2B48C", pointStrokeColor: "#c1c7d1", pointHighlightFill: "#fff", pointHighlightStroke: "#D2B48C", //data: [40, 59, 80, 81, 87, 85, 89,94, 98, 99, 81, 76, 55,40, 32, 15, 10, 8, 6,12,24, 31,55,46, 39] data : inFlow } ] }; var LineChart = salesChart.Line(salesChartData, salesChartOptions); salesChartData = null; salesChart = null; salesChartCanvas = null; doc = null; inFlow = null; } ``` 有没有大神帮忙看下是因为什么内存泄露了,如何修改? (已经快两天了,怎么都解决不了。。。。。)
C# Winfrom项目,运行程序一段时间后提示“存储空间不足,无法处理此命令”的报错信息。
在C# Winfrom项目,有一个timer计时器控件(设置每隔6分钟调用其它六个监控视频图像放到对应的Panel控件) 目前遇到的问题是,监控点的视频图像有的由于网络好点显示加载视频图像快点,有的由于网络不是太好加载显示视频图像慢点。 在form窗体运行一段时间后,提示“存储空间不足,无法处理此命令”的报错信息。 发现在这个时间段内,电脑内存的使用率为40%至50%左右。 请问如何修改下面的代码可以解决此问题?谢谢! 附创建显示监控视频图像的代码: void PlayMon(string name, int width, int height, Panel pl, string[] monitorarray) //创建播放监控视频的组件 { foreach(Control ctl in pl.Controls) { ctl.dispose() //内存释放,不过貌似释放不了内存。这个地方还有其它方法可以释放内存? } pl.Controls.Clear(); PlayerMon.PlayerMon ocm = new PlayerMon.PlayerMon(); ocm.Name = name.ToString(); ocm.Width = width; ocm.Height = height; ocm.Top = (pl.Height - ocx.Height) / 2; ocm.Left = ((pl.Width - ocx.Width) / 2)-1; ocm.Play(monitorarray[0], monitorarray[1], monitorarray[2], monitorarray[3], monitorarray[5], monitorarray[6], monitorarray[4], monitorarray[7], "rtsp", monitorarray[10], monitorarray[11], monitorarray[0], monitorarray[1], "HIK-DS8000HC", monitorarray[5], monitorarray[5], monitorarray[2], monitorarray[3], "av_stream", monitorarray[8], monitorarray[12], monitorarray[14]); pl.Controls.Add(ocx); }
做了一个小时的面试题(没有过 希望大家帮忙答下 虽然很幼稚 毕竟每个人都是这么过来的吗 感激了!)
XX软件工程师笔试试题 注:1、请参考人员将答案写在答题纸上,勿将答案写在此卷上。 2、请参考人员将编号与姓名填写在答题纸上。 1、 以下数据结构中不属于线性数据结构的是()。 A、队列 B、线性表 C、二叉树 D、栈 我的答案:C 2、 在结构化方法中,用数据流程图(DFD)作为描述工具的软件开发阶段是()。 A、 可行性分析 B、需求分析 C、详细设计 D、程序编码 我的答案:B 3、 结构化程序设计主要强调的是()。 A、 程序的规模 B、程序的易读性 C、程序的执行效率 D、程序的可移植性 我的答案:C 4、 在软件生命周期中,能准确地确定软件系统必须做什么和必须具备哪些功能的阶段()。 A、 概要设计 B、详细设计 C、可行性分析 D、需求分析 我的答案:B 5、 下列关于栈的叙述中正确的是()。 A、 在栈中只能插入数据 B、在栈中只能删除数据 B、 栈是先进先出的线性表 D、栈是先进后出的线性表 我的答案:D 6、 下面不属于软件设计原则的是()。 A、 抽象 B、模块化 C、自底向上 D、信息隐蔽 我的答案:C 7、 对长度为N的线性表进行顺序查找,在最坏情况下所需要的比较次数为()。 A、 N+1 B、N C、(N+1)/2 D、N/2 我的答案:C 8、 视图设计一般有3种设计次序,下列不属于视图设计的是()。 A、 自顶向下 B、由外向内 C、由内向外 D、自底向上 我的答案:C 9、下列有关数据库的描述,正确的是()。 A、数据库是一个DBF文件 B、数据库是一个关系 C、数据库是一个结构化的数据集合 D、数据库是一组文件 我的答案:C 10、下列说法中,不属于数据模型所描述的内容的是()。 A、数据结构 B、数据操作 C、数据查询 D、数据约束 我的答案:A 11、若按功能划分,软件测试的方法通常分为白盒测试方法和(黑盒测试方法)。 12、数据库系统的三级模式分别为(级联)模式、内部级模式与外部级模式。 13、在最坏情况下,冒泡排序的时间复杂度为(N+1/2)。 14、在面向对象方法中,信息隐蔽是通过对象的(封装)性来实现的。 15、关系模型的数据操纵既是建立在关系上的数据操纵,一般有(插入)、增加、删除、和修改四种操作。 16、TIME()的返回值的数据类型是(String)类型。 17、编写SQL语句 1)、创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 我的答案: create table student( studentCardNo number(2) primary key, name char(10), age number(2), sex char(2) check(sex in (‘男’,’女’)), address varchar2(100), tel number(2) ) 2)、修改学生表的结构,添加一列信息,学历 我的答案: alter table student add(xueli varchar2(20)); 3)、修改学生表的结构,删除一列信息,家庭住址 我的答案: alter table student drop column address; 4)、向学生表添加如下信息: 学号 姓名 年龄 性别 联系电话 学历 1 A 22 男 123456 小学 2 B 21 男 119 中学 3 C 23 男 110 高中 4 D 18 女 114 大学 我的答案: insert into student values(‘&1’,’&2’,’&3’); 一次一次添加 5)修改学生表的数据,将电话号码以11开头的学员的学历改为“大专” 我的答案: update student set xueli=”大专” where tel like 11%; 6)删除学生表的数据,姓名以C开头,性别为‘男’的记录删除 我的答案: delete student where name like C% or sex=”男”; 7)查询学生表的数据,将所有年龄小于22岁的,学历为“大专”的,学生的姓名和学号显示出来 我的答案: select name,studentCardNo from student where age<22 and xueli=”大专”; 8)查询学生表的数据,查询所有信息,列出前25%的记录 我的答案: select top*0.25 from student; 9)查询出所有学生的姓名,性别,年龄降序排列 我的答案: select name,sex,age from student where age desc; 10)按照性别分组查询所有的平均年龄 我的答案: select avg(age) from student group by sex; 18、什么是存储过程?为什么存储过程要比单纯的SQL语句执行起来要快? 我的答案: 存储过程算是一种优化查询需要比单存SQL语句执行的要快 19、两张关联表,删除主表中已经在副表中没有的信息 我的答案 delete from fubiao a where a.fid not in(select id from zhubiao) 20、程序题: 用1、2、2、3、4、5这六个数字,用java或你熟悉的语言,打印出所有不同的排列,如:512234、412345等,要求:“4”不能再第三位,“3”与“5”不能相连。并将这些数据按从小到大输出。 我的答案 我的写的不好 没贴下 笔试的时候没写全 21、String 和 StringBuffer的区别 我的答案 String定长 StringBuffer 变长 22、&和&&的区别 我的答案 &短路与 &&逻辑与 网上答案: & 是位运算符,表示按位与运算, && 是逻辑运算符,表示逻辑与(and)。 23、final,finally,finalize的区别 我的答案 Final静变量关键字,finally异常关键字,finalize 网上答案 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法, 可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 24、数组有没有length()这个方法?String有没有length()这个方法? 我的答案: 数组没有length()这个方法,有length的属性。 String有length()这个方法。 25、是否可以继承String类? 我的答案: 不可以 解释的很乱 26、说出数据连接池的工作机制是什么? 我的答案: 反正解释的很乱我感觉 27、垃圾回收的优点和原理。并考虑2种回收机制。 我的答案: 动态回收 解释的很乱 网上答案: Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解, 它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念, 只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。 垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有 使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。 回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。 28、你所知道的集合类都有哪些?区别?主要方法? 我的答案: Arraylist 非线性的、Vertor线性的 29、JSP的内置对象及方法。 我的答案: Page,exception,out,page content,application,request,reponse,session,config 30、页面间对象传递的方法。 我的答案: 那几个方法都写错了 31、你知道Request对象的主要方法有哪些? 32、J2EE是技术还是平台还是框架? 我的答案: J2EE是技术也是平台 网上答案: J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。 J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。 33、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种(例如GBK编码类型)编码的字符串? Request encording(“GBK”) 34、j2ee常用的设计模式?说明工厂模式。 Gof23种设计模式 工厂模式:Factory 网上答案: Java中的23种设计模式: Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式), Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式), Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式), Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式), Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式), Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式), Observer(观察者模式), State(状态模式), Strategy(策略模式), Template Method(模板方法模式), Chain Of Responsibleity(责任链模式) 工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例, 通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。 首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。 然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。 当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。 35、JSP四种会话跟踪技术 我的答案: Application cookie session 36、排序都有哪几种方法?请举例 冒泡 选择 快序 二分查找 网上答案: 排序的方法有:插入排序(直接插入排序、希尔排序), 交换排序(冒泡排序、快速排序), 选择排序(直接选择排序、堆排序), 归并排序,分配排序(箱排序、基数排序) 快速排序的伪代码。 //使用快速排序方法对a[ 0 :n- 1 ]排序 从a[ 0 :n- 1 ]中选择一个元素作为m i d d l e,该元素为支点 把余下的元素分割为两段left 和r i g h t,使得l e f t中的元素都小于等于支点,而right 中的元素都大于等于支点 递归地使用快速排序方法对left 进行排序 递归地使用快速排序方法对right 进行排序 所得结果为l e f t + m i d d l e + r i g h t 37、关于模块间的设计原则? 规范要一样 38、项目过程一般是怎样的?你参加过几个项目开发?参加过的项目流程是怎样的?自己负责与人合作工作内容及自我评价? 从需求调研——设计开发——实施 参加过网站的实施 模板的制作 39、tomcat自动关闭常见原因? 我的答案: 现在没遇到过 40、如何设置TOMCAT内存和连接数? 我的答案: Tomcat群集 41、你如何理解Tomcat是什么? 我的答案: Tomcat是JSP Servlet 容器恰当的说 42、静态变量和实例变量的区别? 我的答案: 静态变量域用final修饰,每次都被调用 实例变量则不会 43、IE、FF下面CSS的解释区别 我的答案: 自己编的 44、web前端技术你了解哪些技术? 我的答案: JAVAScript,CSS,DIV,Ajax,Ajax框架,DWR,dojo,jguery 45、什么是报表?什么是报表控件,作用是什么?你了解哪些报表工具? 我的答案: 解释的很乱 46、你了解的那些统计图表类型? 我的答案: 自己编的 47、Flex与数据库连接的三种方式? 我的答案: 自己编的 ------------------------------------------------------- 我答错的、 错在哪里? 没答上的帮忙解答下? 感激了 !
C++ 虚函数表指针vptr什么情况下被改变?
我们知道虚函数表在编译时期被确定,虚表指针vptr在程序run time时在类对象构造函数执行期间被初始化,那它可能在什么情况下会被修改呢? 我现在知道在派生类对象构造时其会被修改;那除了这种情况之外还有什么场景可能会导致vptr被改变吗? DLL导出场景下,比如这种: Test.dll Test.dll中宏定义了 TEST_EXPORTS #ifdef TEST_EXPORTS #define TEST_API __declspec(dllexport) #else #define TEST_API __declspec(dllimport) #endif class TEST_API CBase { public: CBase(); virtual void A4 (); virtual void A5 (); virtual void A6 (); }; CBase::CBase() { cout<<"Test Conc"<<endl; } void CBase::A4() { cout<<"Test A4"<<endl; } void CBase::A5() { cout<<"Test A5"<<endl; } void CBase::A6() { cout<<"Test A6"<<endl; } Main.exe Main.exe中未宏定义TESTTWO_EXPORTS #ifdef TESTTWO_EXPORTS #define TESTTWO_API __declspec(dllexport) #else #define TESTTWO_API __declspec(dllimport) #endif class TESTTWO_API CBase { public: CBase(); virtual void A1 (); virtual void A2 (); virtual void A3 (); }; CBase::CBase() { cout<<"Main Conc"<<endl; } void CBase::A1() { cout<<"Main A1"<<endl; } void CBase::A2() { cout<<"Main A2"<<endl; } void CBase::A3() { cout<<"Main A3"<<endl; } int _tmain(int argc, _TCHAR* argv[]) { CBase *baseObj = new CBase; baseObj->A1(); return 0; } 最终我的输出结果是: Main Conc Test A4 而不是 Main Conc Main A1 呢? 这点我很不能理解,讲道理说,虽然我MAIN.EXE中的CBase被我声明成了导入的,但是,baseObj调用的构造函数实实在在MAIN.EXE中的CBase的构造函数,那为啥vptr所指向虚表却是Test.DLL中的呢?通过调试模块查看各模块的虚拟内存地址也可以发现baseObj中的虚表地址所在的模块是Test.DLL中。vptr确实指向Test.dll中的虚表的话,那baseObj->A1()输出Test A4确实是正确,可为什么vptr会指向Test.dll中的虚表?tell me why?!难道仅仅是因为Main.exe中CBase被定义成导入的,所以编译器优先从外部符号中寻找吗?!这是什么道理?讲道理啊! 小弟第一次发帖,很多地方不懂,请各位帮忙看看,谢谢。
怎么能观察出JVM的Old区中存储的都是那些对象
操作系统:Solaris10 JDK:SUN JDK1.5.0_17 [b]问题补充:[/b] jmap这个命令我用了,但我发现只是显示出了实例的数量。看不出来哪些对象是在Old区的。你说用Heap工具分析,是什么Heap工具呢?我用了Optimizeit,也是只能看出实例的数量和引用关系,看不出哪些对象是在Old区的。 [b]问题补充:[/b] 我现在的GC策略是这样的,堆最大,最小都是1024m,young区是512m,对象在from和to之间拷贝5次然后扔到old区。回收算法用的是cms。我们的应用对吞吐量的要求比较高,绝大多数都是短生命周期的对象。我在windows下用optimizeit检查了,不存在内存泄漏,但发现在并发量比较大的时候,有几个对象的实例数量是一直在增长的。但当客户端的程序停止的时候,这些对象又是可以被回收的。我们的程序是运行在solaris上的,由于我没下载到optimizeit的solaris安装文件,或者是类似工具的solaris安装文件,因此不确定,olc区中的那些对象是否就是那几个不断增长的对象。我用jvmstat看了,old区涨的很快。而且程序运行大概20分钟左右就core dump了。有的时候会直接把服务器整死。因此我想看看有没有什么手段来看看old区的对象存储的都是什么来帮我肯定一下,就是那几个对象再搞鬼。 [b]问题补充:[/b] 其实这个问题,在昨天临下班之前的10几分钟突然有了进展。终于排查出,我们的程序是没有内存泄漏的。而是由于传输层的拥挤造成的。设置了socket的readReceiveBuffer和sendBuffer之后这个问题得到了缓解。但是为什么会因为传输层的拥挤导致我们old区的对象很多,这点需要再好好研究一下mina框架。 [b]问题补充:[/b] [quote]根据你的说法, 我觉得你的,配置有问题的, 为什么设计-Xmn512m, 这个是很关键的, 如果你要求很低的world stop. 那么把-Xmn设置到128 或者256m, core dump 的原因可能是因为你CMS机制不起作用, 导致并行收集过多产生的。 另外,也跟你的JAVA的版本有关系。 CMS最好使用JAVA6的版本, 在JAVA5上, 这个技术并不是非常成熟。如果是JAVA5, CMS的启动策略是有BUG的, 这个你可以参考我的BLOG : http://sdh5724.iteye.com/admin/blogs/283977 [/quote] young区默认的大小是堆的1/4,但是对于吞吐量优先的程序,可以设置为堆的1/2。因为对象的生命周期短,应该尽可能的让对象在young区就被回收掉,免得被拷贝到old区,再进行回收时,暂停时间会相对较长。网上有些资料显示了,对于吞吐量优先的程序,应该设置一个较大的young区的说法,Sun的网站上也有,将堆设置为3G,young区设置为2G的例子。你说的CMS最好在JAVA6下用,这个我真的不知道。听说JAVA6的GC机制要比JAVA5好。这个我回去试试。 [quote]readReceiveBuffer和sendBuffer 是操作系统参数, 如果你的OS内存很紧张, 也可能导致系统资源不够。 这个参数应该调整成你业务需要的发送接收的大小, 不可以盲目扩大, 每个TCP连接都会占用这个BUFF的大小。 我建议你一般设置成8K。[/quote] 你说的这个我很关系,对这两个参数我也不太了解,但的确是缓解了问题,而且很明显。目前我们只使用了一个TCP连接。对于你说的“这个参数应该调整成你业务需要的发送接收的大小”,我不太明白是什么意思。主要是我不清楚我们需要的大小是多少啊,呵呵。你说的8K,这个是默认配置。但我们使用这个配置时,程序最多只能跑20分钟,程序就死掉了。这涉及到tcp的传输,因为跟我们对接的另一端,他们是C语言写的,目前他们没有设置缓冲区大小,应该用的也是默认的,但C程序我不太了解,不知道是多少。我把这个缓冲区设置为Integer的最大值了,好像是2G(我也觉得有点儿夸张),程序大概跑了四十分钟,服务器宕机了。 [quote]我觉得, 你是不是因为TCP的连接断开后, 没有释放TCP连接? socket.close(). 会导致大量的time_wait的连接, 你要仔细看下。 OS会在比较长的时间回收[/quote] 我们现在就一个TCP链接,出现问题时,链接没断过。我们应该是没有内存泄漏的,我用Optimizeit检查了好多次了。 很高兴与你讨论这个问题,我感觉现在问题出现在TCP的缓冲区上,应该让C那边也设置一个较大的缓冲区,然后再看看问题能不能得到解决。 [b]问题补充:[/b] 经过几天的测试,总结如下: 1.机器宕机居然是机器的问题,那个机器,不管上面运行的是我们的应用程序还是模拟器,都会宕机。换了其他的几台服务器,都没出现宕机的问题。 2.buffer的设置:我们一个消息的长度是20个字节。每秒钟2000条消息,就是40000个字节,因次buffer设置为40000。但最后还是没有设置这个值采用默认的。因为问题可能不在这里。 3.目前的问题,使用mina的client接收消息时,每秒钟2000条,大概运行一段时间之后,就会mina就会接收到一个很大的包(100K以上)。这导致我们应用层解析这个消息的时候调用层次过多,抛出stackOverFlow的异常,并且主动把连接关闭了。其实,我们可以修改一下我们的代码,避免抛出这个异常。但这不是问题的根源,因为mina传了一个这么大的数据包给应用层就是不正常的。于是我看了一下mina的代码,在read的时候,会根据接收到的消息的长度,来调整allocate的长度。这个上限是receiveByteBuffer的2倍。我尝试修改了mina的代码,让他每次固定allocate 1024个字节。但是问题依然存在,目前没找到解决方法。为了规避这个问题,只是让服务端不给我们发送这个应答,这在业务上是允许的。但没找到问题的根源总是感觉心里堵的荒,打算试试grizzly。
win10任务管理器,隐藏指定服务?
在win7下,通过hook advapi.dll的EnumServicesStatusEx API,在返回链表中,将指定服务脱链。 即可实现服务隐藏。但在win10中,taskmgr.exe不再通过advapi.dll操作服务。 导致此方式无效,不能实现隐藏。 至于读取services.exe的进程内存,并修改。在win10上更加不可用(系统对此进行了防护)。况且taskmgr不操作ReadProcessMemory API。。。 各位大佬,有研究过win10隐藏服务的不? 给点建设性的意见。(API Monitor分析了一周,实在无头绪)
关于STM32的IAP升级中TIM意外被关闭
我在使用STM32的IAP升级,一开始用官方的demo修改之后可以正常的使用串口进行升级,但是公司的产品中必须要加一个外设,SP706TEN当没有及时输入电平反转(1.6S内)到WDI引脚,外设将产生低电平给STM的NRST,产生复位。 问题就出现在这里。 ![图片说明](https://img-ask.csdn.net/upload/201611/11/1478840979_905563.png) 如图,SP706TEN的结构如上,我在原有代码的基础上增加了一个定时器TIM3,在TIM3中每0.5秒使WDI电平反转来给(SP706TEN)喂狗。 程序一开始运行都是OK的,当进入了下载界面,程序就跑飞到HardFault_Handler故障中去了,我猜想的原因是因为TIM3没有及时喂狗导致产生了复位,内存溢出或访问越界吧。但是不清楚为什么。 下载的代码跟官方demo一样,如下 ``` /******************************************************************************* * @函数名称 SerialKeyPressed * @函数说明 测试超级终端是否有按键按下 * @输入参数 key:按键 * @输出参数 无 * @返回参数 1:正确 0:错误 *******************************************************************************/ uint32_t SerialKeyPressed(uint8_t *key) { if ( USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET) { *key = (uint8_t)USART2->DR; return 1; } else { return 0; } } /******************************************************************************* * @函数名称 Receive_Byte * @函数说明 从发送端接收一个字节 * @输入参数 c: 接收字符 timeout: 超时时间 * @输出参数 无 * @返回参数 接收的结果 0:成功接收 1:时间超时 *******************************************************************************/ static int32_t Receive_Byte (uint8_t *c, uint32_t timeout) { while (timeout-- > 0) { if (SerialKeyPressed(c) == 1) { return 0; } } return -1; } ``` 接收文件是用while(1)不停检测usart标志位来接收数据,并不会干扰TIM3的中断发生,但是为什么程序一进行到下载界面就崩掉了???? 注: 1.当进入下载界面选择的时候输入过1,2,几个单独的按键,也通过上面的代码接收,TIM3都没有死掉,但是下载接收(连续)就死掉了 2.如外设的原理图,JUMP2不插跳线帽的时候是不会产生硬件中断的,因此我一开始没加TIM3的程序所有功能都是OK的。但是公司要求升级的时候不能拆盖(也就是说跳线帽是插上的),因此1.6S内不使WDI电平反转(达到喂狗效果),就会产生复位,也就是加定时器的时候出的错。 自己找了好久都没有思路与方法,还请大家帮忙分析一下,是什么原因,如何有效的去解决。谢谢!
C#关于sqlite数据库问题,大神来看看
``` namespace QQLite.GuessFeng { /// <summary> /// 说明:这是一个针对System.Data.SQLite的数据库常规操作封装的通用类。 /// 更新时间:2014-10-31 /// </summary> public class SQLiteDBHelper//SQLiteDBHelper { public static string DataSource = string.Format("Data Source={0};Pooling=true;FailIfMissing=false", Path.Combine(D:\\, "GuessFeng.db")); public static string dbpath = D:\\ + "GuessFeng.db"; private string connectionString = string.Empty; #region 数据库连接必要条件参数 private SQLiteConnection dbConnection = null; /// <summary> /// 数据库连接 /// </summary> public SQLiteConnection DbConnection { get { if (this.dbConnection == null) { // 若没打开,就变成自动打开关闭的 this.Open(); this.AutoOpenClose = true; } return this.dbConnection; } set { this.dbConnection = value; } } private SQLiteCommand dbCommand = null; /// <summary> /// 命令 /// </summary> public SQLiteCommand DbCommand { get { return this.dbCommand; } set { this.dbCommand = value; } } private SQLiteDataAdapter dbDataAdapter = null; /// <summary> /// 数据库适配器 /// </summary> public SQLiteDataAdapter DbDataAdapter { get { return this.dbDataAdapter; } set { this.dbDataAdapter = value; } } /// <summary> /// 数据库连接 /// </summary> public string ConnectionString { get { return this.connectionString; } set { this.connectionString = value; } } private SQLiteTransaction dbTransaction = null; private bool inTransaction = false; /// <summary> /// 是否已采用事务 /// </summary> public bool InTransaction { get { return this.inTransaction; } set { this.inTransaction = value; } } private bool autoOpenClose = false; /// <summary> /// 默认打开关闭数据库选项(默认为否) /// </summary> public bool AutoOpenClose { get { return autoOpenClose; } set { autoOpenClose = value; } } #endregion /// <summary> /// 构造函数 /// </summary> /// <param name="dbPath">SQLite数据库文件路径</param> public SQLiteDBHelper() { // string dbPath = Client.BasePath + @"QQ\" + Client.QQ + @"\DataBase\QQLite.Plugin.VipwarrantPlugin.db"; this.connectionString = DataSource; } /// <summary> /// 这时主要的获取数据库连接的方法 /// </summary> /// <returns>数据库连接</returns> public IDbConnection Open() { this.Open(this.ConnectionString); return this.dbConnection; } /// <summary> /// 获得新的数据库连接 /// </summary> /// <param name="connectionString">数据库连接字符串</param> /// <returns>数据库连接</returns> public IDbConnection Open(string connectionString) { // 若是空的话才打开 if (this.dbConnection == null || this.dbConnection.State == ConnectionState.Closed) { this.ConnectionString = connectionString; this.dbConnection = new SQLiteConnection(this.ConnectionString); this.dbConnection.Open(); } this.AutoOpenClose = false; return this.dbConnection; } #region 建立本地数据库 /// <summary> /// 创建SQLite数据库文件 /// </summary> /// <param name="dbPath">要创建的SQLite数据库文件路径</param> public void CreateDB() { if (!File.Exists(dbpath)) { // 自动打开 if (this.DbConnection == null) { this.AutoOpenClose = true; this.Open(); } else if (this.DbConnection.State == ConnectionState.Closed) { this.Open(); } this.dbCommand = this.DbConnection.CreateCommand(); this.dbCommand.CommandText = "CREATE TABLE [DBVersion] ([Version] NVARCHAR(50) NULL);INSERT INTO [DBVersion] (Version) values('4.0.0.0');CREATE TABLE [RanNum] ([Id] INTEGER PRIMARY KEY NOT NULL,[ExternalId] INTEGER NOT NULL,[Num] INTEGER NOT NULL,[LastQQ]INTEGER NULL);CREATE TABLE [Config] ([Id] INTEGER PRIMARY KEY NOT NULL,[Fix] TEXT NULL,[Open] INTEGER NOT NULL,[Deduct] INTEGER NOT NULL,[Award] INTEGER NOT NULL);INSERT INTO [Config] (Fix,Open,Deduct,Award) values('#',10,5,100);CREATE TABLE [Lock] ([Id] INTEGER PRIMARY KEY NOT NULL,[value] TEXT NULL);"; this.dbCommand.ExecuteNonQuery(); //this.dbCommand.CommandText = "DROP TABLE Demo"; //this.dbCommand.ExecuteNonQuery(); } } #endregion /// <summary> /// 对SQLite数据库执行增删改操作,返回受影响的行数。 /// </summary> /// <param name="commandText">要执行的增删改的SQL语句</param> /// <param name="parameters">执行增删改语句所需要的参数,参数必须以它们在SQL语句中的顺序为准</param> /// <returns></returns> public int ExecuteNonQuery(string commandText, SQLiteParameter[] parameters) { // 自动打开 if (this.DbConnection == null) { this.AutoOpenClose = true; this.Open(); } else if (this.DbConnection.State == ConnectionState.Closed) { this.Open(); } this.dbCommand = this.DbConnection.CreateCommand(); this.dbCommand.CommandText = commandText; if (this.dbTransaction != null) { this.dbCommand.Transaction = this.dbTransaction; } if (parameters != null) { this.dbCommand.Parameters.Clear(); for (int i = 0; i < parameters.Length; i++) { this.dbCommand.Parameters.Add(parameters[i]); } } int returnValue = this.dbCommand.ExecuteNonQuery(); // 自动关闭 this.dbCommand.Parameters.Clear(); // 自动关闭 //if (this.AutoOpenClose) //{ // this.Close(); //} return returnValue; } #endregion #region public void Close() 关闭数据库连接 /// <summary> /// 关闭数据库连接 /// </summary> public void Close() { if (this.dbConnection != null) { this.dbConnection.Close(); this.dbConnection.Dispose(); } this.Dispose(); } #endregion #region public void Dispose() 内存回收 /// <summary> /// 内存回收 /// </summary> public void Dispose() { if (this.dbCommand != null) { this.dbCommand.Dispose(); } if (this.dbDataAdapter != null) { this.dbDataAdapter.Dispose(); } this.dbConnection = null; } #endregion } } ``` ``` private void button1_Click(object sender, EventArgs e) { SQLiteDBHelper vdb = new SQLiteDBHelper();//初始化SQLite数据库 string sql = "UPDATE Config SET Fix=@Fix,Open=@Open,Deduct=@Deduct,Award=@Award WHERE (Id=1)";//修改语句 SQLiteParameter[] Config = new SQLiteParameter[]{ new SQLiteParameter("@Fix",text_Fix.Text ), new SQLiteParameter ("@Open",text_Open.Text ), new SQLiteParameter("@Deduct",text_Deduct.Text ), new SQLiteParameter("@Award",text_Award.Text ) }; //MessageBox.Show("保存成功!"); if (vdb.ExecuteNonQuery(sql, Config) > 0) { MessageBox.Show("保存成功!"); } } ``` 为什么点击按钮保存,一点就卡死
oracle10G 提示找不到SID
# tnsnames.ora Network Configuration File: F:\soft\oracle\network\admin\tnsnames.ora # Generated by Oracle configuration tools. TEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test.com.cn) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) 上面是文件里的内容 下面是我的代码,我是才开始学习ORACLE看视频和网上搜。身边没有能直接请教的人。所以请知道的朋友一定告知一下。 listener ,serviceTEST 这两个都已启动。 package com.test.jdbc; import java.sql.Connection; import java.sql.DriverManager; public class Jdbc { Connection conn=null; public Connection conn(){ try { try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:test", "system", "y"); System.out.println("fasd"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return conn; } public static void main(String[] args) { Jdbc j=new Jdbc(); j.conn(); } } 报错: java.sql.SQLException: Listener refused the connection with the following error: ORA-12505, TNS:listener does not currently know of SID given in connect descriptor The Connection descriptor used by the client was: localhost:1521:test at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:124) at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:279) at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:318) at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:343) at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:147) at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:31) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:545) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at com.test.jdbc.Jdbc.conn(Jdbc.java:16) at com.test.jdbc.Jdbc.main(Jdbc.java:26) 另外。在安装的过程中:CSSERVICE 是失败的。现在CS 也没有启动。 也出现过OCR无法初始化 我是XP系统。不愿换。 我只有:30分。 全放上来。 [b]问题补充:[/b] 把localhost改成本地IP,再看看test.com.cn对不对。 因为我的安装不熟练。 至此只能用system登陆。 然后。test.com.cn test 我都换过了。没效果。提示都是一样的。 [b]问题补充:[/b] 系统能登陆, SQL 语句都能使用。 这几天在学PROCEDURE TRRIGER 都用得蛮好。 只是现在不知为啥 突然一下子,SQLPLUS在运行窗口又用不成了。 提示找不到文件。 但是从程序里运行SQLPLUS可以。只是那样没有缓存区。有些要重复写的东西很是麻烦。 [b]问题补充:[/b] 你的 SERVICE_NAME应该写为test,这个才是数据库的服务名称 前面的TEST 只是在pl/sql连接时,本地显示的名称而已,不一定是数据库的SID的 这个是我当初时。学着视频里写的。。。。写的名称就是test.com.cn 然后。当时安装界面上就显示 SID是test 可是在JDBC里搞不定— [b]问题补充:[/b] 把localhost改成本地IP,再看看test.com.cn对不对。 本地IP不知道怎么设———— 不过。我上百度搜一哈。 先试试看 [b]问题补充:[/b] tnsnames.ora listener.ora 这两块儿。 基本上和帖图的那个朋友是一样。 应该没什么问题。 到是有关test.com.cn这样设名字。好不好确实值得研究。 可那视频就是这么教的。 我现在都不知道该怎么改。 有点不敢重装。 因为重装要删除的东西还蛮多的……………………………… [b]问题补充:[/b] Io 异常: The Network Adapter could not establish the connection 因为我的CMD命令用不了。 所以没法用IPCONFIG这些方式看IP。 用 改成HOST=您的IP(比如192.168.1.102) 另外WINDOWS/system32\drivers\etc\下的hosts文件可以参考一下.. 这里显示的是 127.0.0.1 localhost 但是里面又说:# for example: # # 102.54.94.97 rhino.acme.com # source server # 38.25.63.10 x.acme.com # x client host # 以下都是在2006-2007年恶意修改IE属性,或者传播病毒或者木马的网站 127.0.0.1 localhost 127.0.0.1 858656.com 127.0.0.1 my123.com 127.0.0.1 8749.com 127.0.0.1 4199.com 127.0.0.1 7379.com 127.0.0.1 7255.com 127.0.0.1 3448.com 127.0.0.1 7939.com 127.0.0.1 8009.com 127.0.0.1 piaoxue.com 127.0.0.1 kzdh.com 127.0.0.1 about.blank.la 127.0.0.1 6781.com 127.0.0.1 7322.com 127.0.0.1 9991.com 所以———好像用:hosts文件里的内容没用啊。 我填了127.0.0.1 替代localhost 就提示io异常。 另外。我的oracle已经重做了。 数据库全名是 # tnsnames.ora Network Configuration File: C:\oracle\product\10.1.0\Db_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. TEST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.1.0.5)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) # listener.ora Network Configuration File: C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = C:\oracle\product\10.1.0\Db_1) (PROGRAM = extproc) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.1.0.5)(PORT = 1521)) ) ) ) [b]问题补充:[/b] 以前我的服务里有LISTEN 的。 刚才我开SERVICES。MSC里面居然没有了。 难道是我删除了path,里面两条关于jre1.4的信息引起的? 我有备份可以还原。打算还原试试看。 [b]问题补充:[/b] 我痛下决心:已将系统完全重装, 在重装的过程中。先装ORACLE 10G, 再装JDK, 再装tomcat+eclipse +myeclipse 再装iis 再装sql server2005 再装瑞星并升级。 这次oracle任何错误也不报了。浏览器模式也能用了。 格老子的。所有的启动都正常了。 可是tomcat报靠说8080被占用。 于是改了connctor 为8010 然后发现 eclipse执行不了main命令。 又是新的轮回啊——————从七点开始,晚饭都没吃。靠— [b]问题补充:[/b] eclipse 是因为被oracle的jre1.4误导了。 其实我在path已经删除了他。 可是他还是在eclipse干扰到我了。 不管怎么样。eclipse现在正常。 十分钟时间 如果oracle ,sql server2005,mysql5.1 连接jdbc正常的话。 我就算大功告成了(虽然又出现了新BUG,oracle 在sqlplus里正常登陆,在网页登陆去说我用户名和密错误……) 肚子好饿— [b]问题补充:[/b] 这个— 反正至此。 所以连接全部OK。 曾经不能使用的debug也能正常使用了。 JDBC连接三个数据库也都正常了。 数据库自已运行速度也非常了得! 只是开机40个线程看着有点儿头疼。不过,不怕我3G内存 1.8双核顶得住。 非常感谢这几天关注本案的朋友。 特别是最后一直有关第的ROWEN 只是这分不知道该派给谁好。 分拿出来总得花吧。不花对不起大家———— ROWEN您就受累接着吧。 再次感谢关注和帮助我的朋友。感谢!
spring mvc+shiro+cas 实现cas client功能 跳转回来404
http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404
3年swing,1年JavaEE,1年java socket转android什么待遇
3年swing,技能除了跟做游戏的比足够了。做过IM 3款,手术X光机客户端1款,线程是我的强项,过度Android有绝对的自信。 <br />1年JavaEE,spring struts都摸过,腻外了 <br />1年java服务器开发,做过的项目包括网关、邮件服务器、金融信息发布、用过纯socket,MIMA框架,设计过协议,也熟悉一些协议比如sip、xmpp、activesync、webdav等等,http更不用说。写过点C代码,不多,JNI调用。 <br />在外企干过2年,目前做手机服务器端。 <br /> <br />如果转Android,能给什么价格。听说android动辄就10k?有那么值钱么 <br />主要和市场升温有关吧,android诞生2007年底,企业用人都是1年android开发经验。 <br />android人才紧缺是不是?<br/><strong>问题补充</strong><br/><div class="quote_title">proper 写道</div><div class="quote_div">Android没那么值钱的... <br /> <br />show一下你的app,然后再讨论工资... <br /> <br /></div> <br /> <br />package com.xxx.framework.components.transport.socket.codec; <br /> <br />import java.nio.ByteOrder; <br />import org.apache.mina.common.ByteBuffer; <br />import org.apache.mina.common.IoSession; <br />import org.apache.mina.filter.codec.CumulativeProtocolDecoder; <br />import org.apache.mina.filter.codec.ProtocolDecoderOutput; <br /> <br />/** <br /> * 新华社系统Socket通信协议解码器。具体协议信息参见《xxx》。 <br /> * 解码器的解码时机由MINA框架决定,一般地:客户端发来的二进制消息先是经过协议解码器处理,即doDecode方法; <br /> * 解码器处理、过滤、封装后抛给下一层解码器(如果存在);最后由最终的解码器抛给应用层的Handler处理具体业务逻辑。 <br /> * 总之,解码器的责任是将网络直接发送来的原始的二进制数据封装成应用层能识别的特定类对象,并上抛给应用层。 <br /> * 上抛的过程由解码器方法参数ProtocolDecoderOutput的write方法完成。 <br /> * 注意:为配合与多种异构客户端的通信,规定:协议解码的字节序是从最低有效位到最高有效位。 <br /> * <br /> * @author xxx <br /> */ <br />final class UploadDecoder extends CumulativeProtocolDecoder { <br /> <br />&nbsp;&nbsp;&nbsp; /** <br />&nbsp;&nbsp;&nbsp;&nbsp; * 覆盖超类的回调方法完成自定义协议解码,该方法由MINA框架负责调用 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param session IoSession对象,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param ioBuffer 存储原始二进制数据的缓冲区,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @param out ProtocolDecoderOutput对象,由框架创建 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @return 返回true,当且仅当缓冲区内有可以解析的数据而你需要再次调用doDecode时;返回false,如果缓冲区内其余的数据不足以进行解析, <br />&nbsp;&nbsp;&nbsp;&nbsp; * 然后当有更多的数据积累到缓冲区时doDecode方法会再次被通知。 <br />&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception <br />&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp; @Override <br />&nbsp;&nbsp;&nbsp; protected boolean doDecode(IoSession session, ByteBuffer ioBuffer, ProtocolDecoderOutput out) throws Exception { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.order(ByteOrder.LITTLE_ENDIAN); // 修改缓冲区的字节顺序为little-endian,按照此顺序,多字节值的字节顺序是从最低有效位到最高有效位的。 <br /> <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 根据新华社系统Socket通信协议规范,协议由两部分构成:消息头与消息体。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 其中消息头长度恒定为17字节;消息体长度不定,由消息头前4个字节给出。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因此解析一条由客户端上传的消息需要2个步骤:获取并解析消息头;获取并解析消息体。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Upload request = (Upload) session.getAttribute("xhs-upload"); // 从session对象中获取“xhs-upload”属性值 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (request == null) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果request对象是null,则表示是解析消息头的阶段。如果是消息刚刚接收到即解析的是新消息,request对象一定是在session中不存在的。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ioBuffer.remaining() &gt;= 17) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 检查缓冲区可用字节个数是否大于等于17。因为根据协议规定,消息头的长度恒定为17, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 分别是消息长度4字节、客户端标识11字节、命令标识1字节、zip压缩标识1字节。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果大于等于17,就表明有足够的数据来解析消息头了。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int totalLength = ioBuffer.getInt(); // 读取缓冲区前4个字节合并为一个整型,该值受字节序的影响,但是规定字节序是从最低有效位到最高有效位 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] clientIdentify = new byte[11]; // 创建11字节容量的数组容纳客户端标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.get(clientIdentify); // 从缓冲区读取11个字节的数据填充进数组 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte command = ioBuffer.get(); // 从冲缓冲区读取1字节作为命令标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte zip = ioBuffer.get(); // 从冲缓冲区读取1字节作为zip压缩标识 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request = UploadFactory.createUpload(command); // 根据命令的类型创建适当的请求 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.messageTotalSize = totalLength; // 设置请求的消息长度 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.clientIdentify = new String(clientIdentify); // 设置请求的客户端标识属性 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.zip = (zip != (byte) 0); // 设置请求的zip压缩标识属性,当且仅当数值 0 代表非压缩 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 向session添加标识键为“xhs-upload”的属性,将请求对象作为属性值传入。这有两个作用: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 1、将xhs-upload键设置成有值状态,代表消息头已经解析完成。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 2、将之前解析出来的消息长度、客户端标识、命令标识、zip压缩标识等信息封装进请求对象暂时存储到session对象中,以便下次调用doDecode方法时利用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 注意:这时消息应该缺少消息体部分。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("xhs-upload", request); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因为当消息头解析完成后,这时缓冲区内可能还有足够的积累数据可以继续解析消息体甚至下一条消息(也可能没有),返回true使框架再次调用doDecode方法。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 即使缓冲区内没有足够的数据了,也应该留给下次调用doDecode方法时去判断。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果缓冲区可用字节个数不足15个,直接返回false告诉框架不要再回调doDecode方法,直到网络获取到数据压进缓冲区时再调用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果request对象不是null,则表示是消息头已经解析完成并存储,目前是解析消息体阶段。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bodyLength = request.messageTotalSize - 17; // 取得消息体的长度,即消息的总长度 - 消息头的长度(17) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (ioBuffer.remaining() &gt;= bodyLength) { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 检查缓冲区的可用字节数是否大于等于消息体长度,即是否读取到消息体了。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] messageBody = new byte[bodyLength]; // 创建定长的数组存放消息体 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioBuffer.get(messageBody); // 从缓冲区中读取bodyLength字节的数据填充进数组 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.messageBody = messageBody; // 设置请求的消息体 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 将session对象的“xhs-upload”键及其对应的属性值移除从而: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 1、将xhs-upload键设置成无值状态,代表消息体已经解析完成。再次进入等待解析消息头阶段 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 2、释放存储“xhs-upload”键的属性值占用的内存。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.removeAttribute("xhs-upload"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 将解码后生成的请求对象对象抛给位于应用层的Handler处理,或者抛给下一层解码器(如果存在)。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(request); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 因为当一条完整消息解析完成后,这时缓冲区内可能还有足够的积累数据可以继续解析下一条消息(也可能没有),返回true使框架再次调用doDecode方法。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 即使缓冲区内没有足够的数据了,也应该留给下次调用doDecode方法时去判断。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果缓冲区内可用字节个数不足以构成完整的消息体,直接返回false告诉框架不要再回调doDecode方法,直到网络获取到数据压进缓冲区时再调用。 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */ <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />&nbsp;&nbsp;&nbsp; } <br />} <br /> <br />新闻发布程序的MINA解码器,别被注释吓死 <br /><br/><strong>问题补充</strong><br/><div class="quote_title">javagui 写道</div><div class="quote_div"> <br /> <br />应该是MINA把。 <br /></div> <br /> <br />拼错了,是Apache MINA,本来是想用xsocket来着,但是xsocket人气没MINA高 <br />
Linux学习资料
<p>     我在一个教育机构看到以下表格,也想学下关于Linux的知识,不知道大家看了以下表格有什么好的资料推荐看下,大家交流下啊。</p> <p> </p> <p><strong style="padding: 0px; margin: 0px;">课程内容 </strong><br style="padding: 0px; margin: 0px;"></p> <p><span style="color: #333333; line-height: 25px;"> <table style="padding: 0px; margin: 0px;" border="1" cellspacing="2" cellpadding="2"><tbody style="padding: 0px; margin: 0px;"> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">课程安排</strong></p> </td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">课程内容</strong></p> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" colspan="2" width="570" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">第一天</strong></p> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top">理论课3学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">嵌入式平台、体系结构、芯片介绍</strong><br style="padding: 0px; margin: 0px;">1 嵌入式综述<br style="padding: 0px; margin: 0px;">◆嵌入式开发的硬件平台:ARM、PPC、MIPS、X86 体系结构<br style="padding: 0px; margin: 0px;">◆嵌入式的典型应用及分类 <br style="padding: 0px; margin: 0px;">◆嵌入式的软件系统<br style="padding: 0px; margin: 0px;">◆嵌入式的操作系统linux、 uClinux、uC/os<br style="padding: 0px; margin: 0px;">2 嵌入式CPU体系结构<br style="padding: 0px; margin: 0px;">◆指令集,寄存器<br style="padding: 0px; margin: 0px;">◆物理地址空间分布 <br style="padding: 0px; margin: 0px;">◆嵌入式处理器中断机制<br style="padding: 0px; margin: 0px;">3 嵌入式平台外围接口芯片<br style="padding: 0px; margin: 0px;">◆UART接口芯片<br style="padding: 0px; margin: 0px;">◆GPIO<br style="padding: 0px; margin: 0px;">◆Nor/Nand flash<br style="padding: 0px; margin: 0px;">◆LCD控制器 <br style="padding: 0px; margin: 0px;">◆触摸屏控制器<br style="padding: 0px; margin: 0px;">4 各种嵌入式开发工具<br style="padding: 0px; margin: 0px;">◆开发IDE,编译器<br style="padding: 0px; margin: 0px;">◆烧录器<br style="padding: 0px; margin: 0px;">◆jtag调试代理<br style="padding: 0px; margin: 0px;"> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top">实验课5学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">实验一:嵌入式裸机程序</strong><br style="padding: 0px; margin: 0px;">实验目的:掌握嵌入式编程的常用工具和方法;掌握在嵌入式原始环境(没有操作系统)下编程的技巧和方法交叉编译环境的建立; <br style="padding: 0px; margin: 0px;"><br style="padding: 0px; margin: 0px;">实验要求:要求完成裸机程序编译,上载,运行,直到裸机程序运行成功,可以控制gpio led灯。 <br style="padding: 0px; margin: 0px;"><br style="padding: 0px; margin: 0px;">实验内容:在S3C2440开发板上运行裸机程序。</td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" colspan="2" width="570" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">第二天</strong></p> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top">实验课3学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">交叉编译工具介绍与Bootloader启动代码分析</strong><br style="padding: 0px; margin: 0px;">1 嵌入式Linux综述<br style="padding: 0px; margin: 0px;">◆Linux的由来及现状、嵌入式操作系统分类<br style="padding: 0px; margin: 0px;">◆嵌入式linux的典型应用及分类<br style="padding: 0px; margin: 0px;">◆RTLinux、ARMlinux、 uClinux<br style="padding: 0px; margin: 0px;">◆嵌入式开发的硬件平台:ARM、PPC、MIPS、X86 体系结构<br style="padding: 0px; margin: 0px;">2 嵌入式Linux开发基本概念<br style="padding: 0px; margin: 0px;">◆启动代码、 内核代码、根文件系统<br style="padding: 0px; margin: 0px;">◆驱动程序、 设备文件、文件系统<br style="padding: 0px; margin: 0px;">3 嵌入式Linux开发工具介绍<br style="padding: 0px; margin: 0px;">◆嵌入式Linux开发环境搭建<br style="padding: 0px; margin: 0px;">◆交叉编译器的使用和安装<br style="padding: 0px; margin: 0px;">◆嵌入式Linux开发中的常用工具<br style="padding: 0px; margin: 0px;">◆嵌入式开发的调试环境:Jtag、KGDB、SkyEye模拟器等<br style="padding: 0px; margin: 0px;">4 分析各种典型的bootloader(uboot、armboot、redboot)<br style="padding: 0px; margin: 0px;">◆常用的几种bootloader介绍(uboot、armboot、redboot)<br style="padding: 0px; margin: 0px;">◆Bootloader的基本启动流程和架构开发注意事项<br style="padding: 0px; margin: 0px;">◆嵌入式Linux系统的内存地址分配和内核加载<br style="padding: 0px; margin: 0px;">◆开发实例分析 u-Boot 的架构、命令用法及其扩展<strong style="padding: 0px; margin: 0px;"></strong> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top"> <br style="padding: 0px; margin: 0px;">实验课<br style="padding: 0px; margin: 0px;">5学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">实验二:嵌入式linux开发环境建立</strong><br style="padding: 0px; margin: 0px;">实验目的:掌握交叉编译环境的建立;掌握内核的交叉编译;掌握u-boot<br style="padding: 0px; margin: 0px;">的操作<br style="padding: 0px; margin: 0px;">实验要求:要求完成内核编译,上载,运行,直到linux系统在目标 <br style="padding: 0px; margin: 0px;">板上运行成功<br style="padding: 0px; margin: 0px;">实验内容:在S3C2440开发板上运行Linux。</td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" colspan="2" width="570" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">第三天</strong></p> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top">理论课3学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">嵌入式Linux移植与根文件系统</strong><br style="padding: 0px; margin: 0px;">1 Linux的目录结构<br style="padding: 0px; margin: 0px;">◆Linux的目录分布<br style="padding: 0px; margin: 0px;">◆移植Linux需要做的修改<br style="padding: 0px; margin: 0px;">2 内核编译和配置<br style="padding: 0px; margin: 0px;">◆内核菜单选项<br style="padding: 0px; margin: 0px;">◆内核编译选项<br style="padding: 0px; margin: 0px;">◆内核的裁减 <br style="padding: 0px; margin: 0px;">◆内核的编译<br style="padding: 0px; margin: 0px;">3 构建根文件系统<br style="padding: 0px; margin: 0px;">◆Busybox编译 <br style="padding: 0px; margin: 0px;">◆c libaray编译<br style="padding: 0px; margin: 0px;">◆最小文件系统搭建<br style="padding: 0px; margin: 0px;">◆常用的几种文件系统格式<br style="padding: 0px; margin: 0px;">◆根文件系统常用文件分析<br style="padding: 0px; margin: 0px;">◆Linux的启动文件<br style="padding: 0px; margin: 0px;">◆Linux的分区加载<br style="padding: 0px; margin: 0px;">◆构建动态库的文件系统</td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top">实验课5学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">实验三:根文件系统的建立 </strong><br style="padding: 0px; margin: 0px;">实验目的:掌握根文件系统的建立。内核编译。<br style="padding: 0px; margin: 0px;">实验要求:要求独立完成根文件系统的建立,编写一个hello world程序在 <br style="padding: 0px; margin: 0px;">S3C2440根文件系统上运行, 根文件系统使用NFS方式和flash<br style="padding: 0px; margin: 0px;">烧录方式。 <br style="padding: 0px; margin: 0px;">实验内容:在S3C2440上运行hello world程序。</td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" colspan="2" width="570" valign="top"> <p style="text-indent: 24px; padding: 10px; margin: 0px;" align="center"><strong style="padding: 0px; margin: 0px;">第四天</strong></p> </td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top"> <br style="padding: 0px; margin: 0px;">理论课3学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">嵌入式图形系统的构架与开发</strong><br style="padding: 0px; margin: 0px;">1 嵌入式图形概况<br style="padding: 0px; margin: 0px;">2 QT的配置和安装<br style="padding: 0px; margin: 0px;">3 QT的编程</td> </tr> <tr style="padding: 0px; margin: 0px;"> <td style="padding: 0px; margin: 0px;" width="141" valign="top"> <br style="padding: 0px; margin: 0px;">实验课5学时</td> <td style="padding: 0px; margin: 0px;" width="429" valign="top"> <strong style="padding: 0px; margin: 0px;">实验四:基于S3C2440的QT实验</strong><br style="padding: 0px; margin: 0px;">实验目的:掌握QT应用程序的编译和运行,理解QT在开发板上的移植<br style="padding: 0px; margin: 0px;">实验要求:要求独立编译QT库、资源和应用程序,并通过根文件系统的方式<br style="padding: 0px; margin: 0px;">在目标板上成功运行hello world程序或其他实例程序<br style="padding: 0px; margin: 0px;">实验内容:在S3C2440开发板上运行QT应用程序</td> </tr> </tbody></table> <br style="padding: 0px; margin: 0px;">PS:以上知识点是否适合初学者学习,我搞JAVA软件开发的初学者也想学点Linux的知识,大家有什么好的建议或者资料推荐看下的!!</span></p><br/><strong>问题补充</strong><br/><div class="quote_title">shiren1118 写道</div><div class="quote_div">javaeye变味了,唉</div> <br />变什么味了?<br/><strong>问题补充</strong><br/><div class="quote_title">Norad 写道</div><div class="quote_div">学习LINUX应该从《UNIX环境高级编程》、《UNIX网络编程》开始啊。当然,C语言的基础也是必要的。。</div> <br />就是 学linux必须先学《UNIX环境高级编程》、《UNIX网络编程》和良好的C语言
相见恨晚的超实用网站
搞学习 知乎:www.zhihu.com 简答题:http://www.jiandati.com/ 网易公开课:https://open.163.com/ted/ 网易云课堂:https://study.163.com/ 中国大学MOOC:www.icourse163.org 网易云课堂:study.163.com 哔哩哔哩弹幕网:www.bilibili.com 我要自学网:www.51zxw
花了20分钟,给女朋友们写了一个web版群聊程序
参考博客 [1]https://www.byteslounge.com/tutorials/java-ee-html5-websocket-example
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载    点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量 path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。
字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历。 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时
开源一个功能完整的SpringBoot项目框架
福利来了,给大家带来一个福利。 最近想了解一下有关Spring Boot的开源项目,看了很多开源的框架,大多是一些demo或者是一个未成形的项目,基本功能都不完整,尤其是用户权限和菜单方面几乎没有完整的。 想到我之前做的框架,里面通用模块有:用户模块,权限模块,菜单模块,功能模块也齐全了,每一个功能都是完整的。 打算把这个框架分享出来,供大家使用和学习。 为什么用框架? 框架可以学习整体
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成喔~) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch
深深的码丨Java HashMap 透析
HashMap 相关概念 HashTab、HashMap、TreeMap 均以键值对像是存储或操作数据元素。HashTab继承自Dictionary,HashMap、TreeMap继承自AbstractMap,三者均实现Map接口 **HashTab:**同步哈希表,不支持null键或值,因为同步导致性能影响,很少被使用 **HashMap:**应用较多的非同步哈希表,支持null键或值,是键值对...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 顺便拉下票,我在参加csdn博客之星竞选,欢迎投票支持,每个QQ或者微信每天都可以投5票,扫二维码即可,http://m234140.nofollow.ax.
Python 基础(一):入门必备知识
目录1 标识符2 关键字3 引号4 编码5 输入输出6 缩进7 多行8 注释9 数据类型10 运算符10.1 常用运算符10.2 运算符优先级 1 标识符 标识符是编程时使用的名字,用于给变量、函数、语句块等命名,Python 中标识符由字母、数字、下划线组成,不能以数字开头,区分大小写。 以下划线开头的标识符有特殊含义,单下划线开头的标识符,如:_xxx ,表示不能直接访问的类属性,需通过类提供
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 欢迎 改进 留言。 演示地点跳到演示地点 html代码如下`&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;music&lt;/title&gt; &lt;meta charset="utf-8"&gt
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。 1. for - else 什么?不是 if 和 else 才
数据库优化 - SQL优化
前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优。但是一些“不好”的SQL也会导致数据库查询变慢,影响业务流程。本文从SQL角度进行数据库优化,提升SQL运行效率。 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7
通俗易懂地给女朋友讲:线程池的内部原理
餐厅的约会 餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”我楞了一下,心里想女朋友今天是怎么了,怎么突然问出这么专业的问题,但做为一个专业人士在女朋友面前也不能露怯啊,想了一下便说:“我先给你讲讲我前同事老王的故事吧!” 大龄程序员老王 老王是一个已经北漂十多年的程序员,岁数大了,加班加不动了,升迁也无望,于是拿着手里
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹
面试官:你连RESTful都不知道我怎么敢要你?
面试官:了解RESTful吗? 我:听说过。 面试官:那什么是RESTful? 我:就是用起来很规范,挺好的 面试官:是RESTful挺好的,还是自我感觉挺好的 我:都挺好的。 面试官:… 把门关上。 我:… 要干嘛?先关上再说。 面试官:我说出去把门关上。 我:what ?,夺门而去 文章目录01 前言02 RESTful的来源03 RESTful6大原则1. C-S架构2. 无状态3.统一的接
JDK12 Collectors.teeing 你真的需要了解一下
前言 在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老规矩,我们先来看个图(这真是一个不和谐的图????): 管道改造经常会用这个小东西,通常我们叫它「三通」,它的主要作用就是将 downstream1 和 downstre...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
相关热词 如何提升c#开发能力 矩阵乘法c# c#调用谷歌浏览器 c# 去空格去转义符 c#用户登录窗体代码 c# 流 c# linux 可视化 c# mvc 返回图片 c# 像素空间 c# 日期 最后一天
立即提问