delphi编写winsocket的流程
begin
MessageBox(Handle,'不能启动winsock动态链接库!','错误',MB_OK);
Exit;
end;
constructor TlistenThread.CreateIt(port:integer); //创建端口
begin
inherited create(true);
lisport:=port;
FreeOnTerminate:=true;
resume; //******唤醒线程 重(新)开(始),再继续;恢复;收回;【微软】继续执行 挂起的线程重新执行。
begin
if lissocket<>INVALID_SOCKET then
begin
//shutdown(lissocket,SD_BOTH);//中断连接,其实连接还存在。
closesocket(lissocket); //*********CloseSocket() 是用来关闭一个 Socket 的!
DebugMessage('Close Socket');
end;
inherited destroy;
end;
var acceptsocket:Tsocket;
sa:SOCKADDR_IN;
salen:integer;
tempthreadread:ThreadSocketRead;
begin
{ Place thread code here }
Lissocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
{socket()系统调用,带有三个参数:
1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
PF_INET6(IPv6)等
2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
3、参数protocol指定需要使用的协议。虽然可以对同一个协议
家族(protocol family)(或者说通信域(domain))指定不同的协议
参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
两个参数使用默认的协议。}
//******************************************************************************
begin
DebugMessage('Create Socket Error');
exit;
end;
sa.sin_port:=htons(lisport);
sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY); //INADDR_ANY,表示本地计算机的默认IP地址
salen:=sizeof(sa);
//******************************************************************************
{ sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
s_addr按照网络字节顺序存储IP地址
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
}
[参数]
s - 指向用Socket函数生成的Socket Descrīptor
addr - 指向Socket地址的指针
namelen - 该地址的长度.
[返回值]
当函数成功调用时返回0
调用失败时返回 SOCKET_ERROR
if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
begin
closesocket(lissocket);
DebugMessage('无法打开端口:'+inttostr(lisport));
exit;
end;
{socket 套接字,网络编程必用的
listen ()监听从服务器传来的接收数据
listen ()创建一个套接口并监听申请的连接.}
//*******************************************
begin
acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。
DebugMessage('连接成功!');
if acceptsocket=INVALID_SOCKET then
begin
DebugMessage('接受Socket失败!');
continue;
end;
tempthreadread:=ThreadSocketRead.CreateIt(acceptsocket,Datamodule1.ADOConnection1.ConnectionString);
if tempthreadread<>nil then
begin
str:='New thread:'+IntToStr(tempthreadread.threadid);
synchronize(AddMes); //synchronize 时间同步 调用方法本模块的 AddMes方法
end
else
begin
closesocket(acceptsocket);
DebugMessage('创建执行线程失败!'); //调用本单元的 DebugMessage方法
end;
closesocket(lissocket); //一个关闭套接口的方法
end;
constructor ThreadSocketRead.CreateIt(S:TSocket;Con:string);
begin
CoInitialize( nil ); //使用com对象必须要初始化 主要做Com相关资源的释放,清理 工作...
inherited Create(true);//继承tthread线程类的构造方法。
FreeOnTerminate:=True; //用于结束线程,设置FreeOnTerminate为True ,执行完成线程以后,你不想明确摧毁它。当FreeOnTerminate是假的,线程对象必须明确销毁应用程序代码。
peerSocket:=S;
FCon:=con;
debugList:=Tstringlist.create;
end;
begin
if peerSocket<>INVALID_SOCKET then closesocket(peerSocket);
Synchronize(removelist);
BCSample.Free;
if FAdoQuery<>nil then FAdoQuery.Free;
if (Fadoconnection<>nil)then
begin
if Fadoconnection.Connected then Fadoconnection.Close ;
Fadoconnection.Free;
end;
CoUnInitialize; //必须使用 主要做Com相关资源的释放,清理工作...
inherited destroy;
end;
var
btime:string;
size:integer;
timedif,blong1,ErrCode:integer; //timedif 时差 ErrCode 错误编码, blong1 程序执行时间。
label endp;
procedure Writelog;
begin
debugList.SaveToFile(BCSample.DebugFileName);
debugList.clear;
blong1:=Round((now-strtodatetime(btime))*SecsPerDay);
Fadoconnection.BeginTrans;
with Fadoquery do
begin
try
close;
sql.clear;
sql.Add('insert into T_FC_CallbackLog (FC_JCPointNo,FC_CBackTime,FC_CBackState,FC_Duration,FC_DataSize,TimeDiff)');
sql.add('values (:jcno,:btime,:state,:blong,:datasize,:timedif)');
Parameters.ParamByName('btime').Value := btime;
Parameters.ParamByName('state').Value := Errcode;
Parameters.ParamByName('blong').Value := blong1;
Parameters.ParamByName('dataSize').Value := BCSample.DataSize;
Parameters.ParamByName('timedif').Value := timedif;
Fadoconnection.CommitTrans;
Except
on e:Exception do Fadoconnection.RollbackTrans;
end;
end;
end;
procedure WriteSetDeviceIPLog;
begin
blong1:=Round((now-strtodatetime(btime))*SecsPerDay);
with Fadoquery do
begin
try
close;
sql.clear;
sql.Add('insert into T_FC_SetDeviceIPLog (JCPointNO,TesterNO,CallbackTime,CallbackState,Duration)');
sql.add('values (:JCPointNO,:TesterNO,:btime,:state,:blong)');
Parameters.ParamByName('TesterNO').Value := BCSample.DeviceNO;
Parameters.ParamByName('btime').Value := btime;
Parameters.ParamByName('state').Value := Errcode;
Parameters.ParamByName('blong').Value := blong1;
Except
on e:Exception do exit;
end;
end;
end;
begin
//这里面紧接着要写对数据包的处理。
btime:=datetimetostr(now);
size:=SizeOf(SockAddrIn); //初始化。
getpeername(PeerSocket,SockAddrIn,size); //取得对等方的连接。
PeerIP:=inet_ntoa(SockAddrIn.sin_addr); //inet_ntoa()将网络地址转换成'.'点隔的字符串格式。
PeerPort:=ntohs(SockAddrIn.sin_port); //ntohs()将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
DebugMessage('连接的ip:'+PeerIP+':'+'端口号'+inttostr(PeerPort));//把连接的信息打印出来
Synchronize(AddTolist);
try
Fadoconnection:= Tadoconnection.Create(nil); //创建数据库连接控件。
Fadoconnection.ConnectionString:=FCon; //把连接数据库的字符串赋值。
Fadoconnection.LoginPrompt:=false;
Fadoconnection.KeepConnection:=true;
Fadoconnection.Connected:=true;
on e:EOleException do
begin
DebugMessage('数据库的连接出现问题 :'+e.message);
exit;
end;
end;
DebugMessage(PeerIP+'Connected to DB');
FAdoQuery:=TAdoQuery.Create(nil); //创建查询控件。
FAdoQuery.Connection:= Fadoconnection;
BCSample:=TBCSample.Create(Fadoconnection);
BCSample.SetSocket(PeerSocket); //进行套结字赋值。
BCSample.SetDebugList(debugList);
BCSample.CallTime:=FormatDateTime('YYYY-MM-DD hh:mm:ss',StrtoDateTime(btime)+11/24/60);
DebugMessage('################'+BCSample.CallTime);
if not BCSample.SetIdAndVer then goto endp;
DebugMessage('设置设备号成功'); }
if not BCSample.ReadIdAndVer then //如果取得不到机器的设备号,则进行跳转。
if not BCSample.ReadIdAndVer then goto endp;
DebugMessage('接受成功,取得设备号'+BCSample.DeviceNO);
//上面可以接受到数据了
//取得了设备的编号,从数据库进行查询 取得设备的类型,状态,设备的工作站编号,及回传的id,如果为使用,并得到样本人的编号
if not BCSample.GetDeviceInfo then
begin
DebugMessage('ip:'+PeerIP+' port:'+inttostr(PeerPort)+' DeviceNO:'+BCSample.DeviceNO+' 没有该设备号!' );
BCSample.Tranfinish(Err_SetupER); //通讯成功,但连接设备的设置参数有问题。
goto endp;
end;
if BCSample.OnDeviceStateNo='02' then
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' DeviceState: 运行');
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 监测点编号:'+BCSample.PointNo);
Synchronize(UpdateDisply);
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道信息');
ErrCode:=ciClearFMErr; // ciClearFMErr=2; 清除FM调频频点出错。
if not BCSample.clearFMValue then
if not BCSample.clearFMValue then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息清除成功!');
ErrCode:=ciWriteFMValueErr; //ciWriteFMValue=3; //写FM调频频点出错。
if not BCSample.writeFMValue then
if not BCSample.writeFMValue then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息写入成功!');
ErrCode:=ciClearAMErr; //ciClearAMErr=4; //清除AM调频频点出错。
if not BCSample.clearAMValue then
if not BCSample.clearAMValue then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息清除成功!');
ErrCode:=ciWriteAMValueErr; //ciWriteAMValue=5; //写AM调频频点出错。
if not BCSample.writeAMValue then
if not BCSample.writeAMValue then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息写入成功!');
if not BCSample.UpdateChannelLog then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 更新指定频道标记成功!');
else
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道未更改');
end;
ErrCode:= ciReadDeviceTimeErr; //ciReadDeviceTimeErr=12; //读取设备时钟出错
if not BCSample.ReadDeviceTime then
if not BCSample.ReadDeviceTime then goto endp; //取得不了机器时钟,就没有意义,不用再往下进行。
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪时钟成功!');
ErrCode:=ciWriteDeviceTimeErr; //ciWriteDeviceTimeErr=6; //写时钟出错。
if not BCSample.WriteDeviceTime then
if not BCSample.WriteDeviceTime then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 校验指定频道场强仪时钟完成!'); //
ErrCode:=ciGetFlowErr; //ciGetFlowErr=16; //读取溢出标志出错
if not BCSample.recordIsOverFlow then
if not BCSample.recordIsOverFlow then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道溢出标志完成!');
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道或自动侦测监测间隔时长有变化!');
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长!');
ErrCode:=ciwriteWatchValidTimeErr; //ciwriteWatchValidTimeErr=7; //写循环监测时长出错
if not BCSample.writeWatchValidTime then
if not BCSample.writeWatchValidTime then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长完成!');
ErrCode:=ciISEQUAlAllChannelSearchIntervalaErr; //ciISEQUAlAllChannelSearchIntervalaErr:=25
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长!');
ErrCode:=ciwriteAllChannelSearchIntervalaErr; //ciwriteAllChannelSearchIntervalaErr:=18
if not BCSample.writeAllChannelSearchIntervala then
if not BCSample.writeAllChannelSearchIntervala then goto endp; //如果不能设置自动全频道循环监测间隔时长,则跳转
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长成功!');
{
100108_ZZF_现在是监测完成自动回传
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传时间!');
ErrCode:=ciwriteBackTimeErr; //ciwriteBackTimeErr:=8; //写回传时间出错
if not BCSample.writeBackTime then
if not BCSample.writeBackTime then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道指定频道场强仪回传时间成功!');
}
ErrCode:=ciSetDeviceIPErr; // ciSetDeviceIPErr=9; //设置ip地址出错
if not BCSample.SetDeviceIP then
begin
if not BCSample.SetDeviceIP then
begin
WriteSetDeviceIPLog; //写设置设备ip错误的日志信息。
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址失败!');
end
else
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');
end;
end
else
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');
end;
ErrCode:=ciReadWatchFSRecordErr; //ciReadWatchFSRecordErr=13; //读取场强数据出错
if not BCSample.ReadWatchFSRecord then
if not BCSample.ReadWatchFSRecord then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪数据成功!');
ErrCode:=ciClearWatchFSRecordErr; //ciClearWatchFSRecordErr=14; //清除场强仪数据出错
if not BCSample.ClearWatchFSRecord then
if not BCSample.ClearWatchFSRecord then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清除指定频道场强仪数据成功!');
ErrCode:=ciSaveFileErr; //保存文件出错
if not BCSample.SaveTvdata then
if not BCSample.SaveTvdata then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据到文件成功!');
try
if not BCSample.WriteRecordtoDb then
if not BCSample.WriteRecordtoDb then
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库失败!')
else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!')
else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!');
except
on e:Exception do DebugMessage(e.Message);
end;
ErrCode:=ciautoStartAllChannelSearchErr; //ciautoStartAllChannelSearchErr:=17
if BCSample.OnDeviceIsOpen='1' then
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测读场强功能以前已开启');
end
else
begin
if not BCSample.autoStartAllChannelSearch then //如果第一次没有开启,在执行一次
if not BCSample.autoStartAllChannelSearch then goto endp;
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 开启自动侦测读场强功能成功!');
ErrCode:=cireadAllChannelSearchIntervalaErr; //cireadAllChannelSearchIntervalaErr:=19
if not BCSample.readAllChannelSearchIntervala then
if not BCSample.readAllChannelSearchIntervala then goto endp; // 读取自动全频道循环监测间隔时长部成功则调转。 //
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测循环监测间隔时长成功!间隔:'+inttostr(BCSample.AllChanneljgtime));
ErrCode:=cirecordAllChannelIsOverFlowErr; //cirecordAllChannelIsOverFlowErr:=20
if BCSample.recordAllChannelIsOverFlow then
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据溢出!')
else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据没有溢出!');
ErrCode:=ciReadAllChannelWatchFSRecordErr; //ciReadAllChannelWatchFSRecordErr:=21
if not BCSample.ReadAllChannelWatchFSRecord then
if not BCSample.ReadAllChannelWatchFSRecord then goto endp; // 读取侦测自动频点数据部成功 ,调转。
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测频点数据成功!');
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测数据大小: '+inttostr(BCSample.OnAllChannelRevContextSize));
if BCSample.OnAllChannelRevContextSize>0 then //如果全频道扫描的流大于零,接受数据后清空
begin
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据! ');
ErrCode:=ciclearAllChannelSearchRecordErr; //ciclearAllChannelSearchRecordErr:=22
if not BCSample.clearAllChannelSearchRecord then
if not BCSample.clearAllChannelSearchRecord then goto endp; //如果清除不了所有频道监测的的数据,则跳转
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据成功!');
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件!');
ErrCode:=ciSaveAllChannelTvdataErr; //ciSaveAllChannelTvdataErr:=23
if not BCSample.SaveAllChannelTvdata then
if not BCSample.SaveAllChannelTvdata then goto endp; //如果保存不了所有频道监测的的数据到文件,则跳转
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件成功!');
try
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库!');
ErrCode:=ciWriteAllChannelRecordtoDbErr; //ciWriteAllChannelRecordtoDbErr:=24
if not BCSample.WriteAllChannelRecordtoDb then
if not BCSample.WriteAllChannelRecordtoDb then
DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库失败!')
else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!')
else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!');
except
on e:Exception do DebugMessage(e.Message);
end;
end ;
ErrCode:=Err_NONE; // Err_NONE=100 正确
BCSample.Tranfinish(ErrCode);
debugList.Add('Errcode: '+inttostr(Errcode));
debugList.Add('溢出标志: '+BCSample.flag);
debugList.Add('全频道溢出标志: '+BCSample.flag);
Writelog;
//BCSample.destroy;
7、边边角角的信息
procedure ThreadSocketRead.DebugMessage(mes:string);
begin
if gdebug then
begin
inforStr:=mes;
synchronize(AddMes1);
end;
end;
//打印信息到formmain.memo
procedure ThreadSocketRead.AddMes1;
begin
if gdebug then
formmain.Memo.Lines.Add(FormatDatetime('hh:mm:ss',Now)+'-*-'+inforStr);
end;
begin
if not AppExit and (DeviceItem<>nil) then
begin
DeviceItem.Delete;
end;
end;
//
delphi编写winsocket的流程的更多相关文章
- DELPHI编写服务程序总结
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)
DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...
- 转 : 用Delphi编写安装程序
http://www.okbase.net/doc/details/931 还没有亲自验证过,仅收藏 当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步 ...
- scala中如何编写自定义的流程控制结构
scala是一种函数式编程风格的语言,除了常见的if......else ,for ,while等传统的流程控制结构,也可以自定义流程控制的控制结构. 再了解scala如何实现编写新的流程结构,我们 ...
- 用Delphi实现WinSocket高级应用
用Delphi实现WinSocket高级应用 默认分类 2009-12-19 16:48 阅读6 评论0 字号: 大大 中中 小小 Socket通信在Windows 中是排队的形式 ...
- delphi编写dll心得, 谢谢原作者的分享。转
delphi编写dll心得 1.每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll2.exports函数后面必须加'export;'(放在'st ...
- Qt调用Delphi编写的COM组件
这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...
- 利用Delphi编写Socket通信程序
一.Delphi与Socket 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登 ...
- Node.js编写be的流程(express)
Node.js编写be的流程 1.当前项目目录下首先安装express 2.自动生成express插件结构 express -e 3.执行完前两步的效果 4.此时的package.json ...
随机推荐
- Bootstrap--全局css样式之表单
单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control 类的 <input>.<textarea> 和 <select> 元素都将被默认设置 ...
- ASP.NET MVC——Controller的激活
Controller的激活是根据在路由过程得到的Controller名称来创建对应的Controller对象.相关类如图: Controller激活的过程可通过如下序列图表示: 代码示例如下: str ...
- 通过C#去调用C++编写的DLL
这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...
- Spring Boot笔记(一)
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...
- JSONP技术原理及实现
跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONP JSONP在我的理解,它并不是ajax,它是在文档中插入一个script标签,创建_callback方法,通过服务器配合 ...
- 【elasticsearch】(2)centos7 超简单安装elasticsearch 的监控、测试的集群工具elasticsearch head
elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...
- chromium安装flash
sudo apt-get install pepperflashplugin-nonfree sudo update-pepperflashplugin-nonfree --install Flash ...
- ubuntu14.04 开启root登陆
想要在登录界面使用root身份登录,可编辑/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf文件, sudo gedit /usr/share/light ...
- BOM 之 location
BOM 之 location它提供了与当前窗口中加载的文档有关的信息,还提供一些导航功能 .既是 window对象的属性,也是document对象的属性,就是说, window.location 和 ...
- 【随记】还原SQL Server数据库步骤
情景:在一台机器上备份数据库,然后在另一台机器上还原数据库,可能会出现错误提示:System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同. ...