自己开发源码
A. 采购外包软件源码自己开发要注意什么
1、软件外包公司的选择,选择专业的软件外包公司合作,建议大家可以通过网络渠道查找挑选软件外包公司,从软件公司的注册年限、公司整体人员规模、公司过往开发案例、相关资质证书、企业口碑等方面综合评判软件公司的专业性。
2、不要拆分外包,软件项目外包分为整体外包和拆分外包,整体外包是指将整个软件项目外包给同一家公司,软件的UI及功能编写由同一家公司完成。
3、建立高效的项目沟通机制,软件需求采集阶段则需要明确开发需求,根据需求设计产品原型,并与客户确认原型是否满足客户的真实需求,项目研发的每一个阶段都需要双方配合,建立良好的沟通机制,才能保障开发出来的软件是客户真正需要的。
4、合同签订,与外包公司签署软件定制开发合同时需要甲乙双方协商相关条例,合同内容越细致越好,需要有详细的功能描述、交付时间、付款方式等,避免后期发生纠纷。
5、确定版权归属方,双方需要明确软件源码所属权和知识产权。
6、违约责任,合同中的违约责任是对双方行为的约束。
7、售后服务。
B. 自己如何做网站,我就是什么都不会
第一种,自己手工源码搭建:
1、买域名,必须实名认证,如果国内的服务器必须ICP备案
2、租服务器,一般的普通展示类网站1G内存1MB宽带,40GB硬盘就够了,如果流量特别大,选择更高的配置,一般Cenos Linux系统比较多,win系统的比较少;Nginx和Apache的个人建议Nginx,一般企业类,商城类网站源码php的占大多数,建议php5.4以上,之前的有些老了
3、添加站点设置域名:你的买域名 2设置根目录 3设置ftp 4数据库
4、制作源代码,几乎没有从零开始的,除非你这边有大量牛人。找些免费开源的改动内容,功能不同选择不同的系统一般通用系统:PageAdmin 论坛系统:discuz 购物系统:ecshop博客系统:wp,需要授权的系统需要注意授权问题,内容修改一般用deamviewer修改比较方便,如果改动很少,那就用notepad++,注:不要用windows的记事本修改,会出错,数据库文件指向一定要设置好。
5、下载xshell,安装,填写服务器ip,密码,链接,上传源码到服务器的根目录
6、设置域名解析,打开买的域名的管理后台,添加记录,填写记录类型选择A型,主机记录写www,解析线路选择默认,记录值输入服务器的ip,TTL默认10分钟
在浏览器打开域名,浏览网站。
第二种,自己手工一键搭建:
第一步:网络搜索菲尔莱斯科技,打开菲尔莱斯科技官网,免费注册您的账号,注:(生成的网站二级域名会是:账号.flspt.com,不想使用二级域名可绑定自己的顶级域名)。
第一种相对繁琐一些,好处是代码自己掌握
第二种代码自己不掌握,但是建站很快,不需要什么技术操作。
感觉第二种更适合你
C. 自己开发的源代码遭遇侵权,我该怎么办
这也是很多软件开发者最头疼的问题,一旦你把源码给出去之后就免不了这样的情况发生,而且即使你有证据证明代码是你的,维权也十分艰难,起诉更是不靠谱。
一种办法是你不给源码,只卖软件和售后服务,软件卖出去之后,如果需要修改功能可以以合适的价钱给他们修改软件,还是不给源码
如果你的软件经济效益比较好,你也可以考虑申请个软件着作权,虽然软件写完你就拥有着作权,但是有一个证书的话,维权起来会方便一些,而且也不贵
D. 如何开发自己的HttpServer-NanoHttpd源码解读
现在作为一个开发人员,http server相关的内容已经是无论如何都要了解的知识了。用curl发一个请求,配置一下apache,部署一个web server对我们来说都不是很难,但要想搞清楚这些背后都发生了什么技术细节还真不是很简单的。所以新的系列将是分享我学习Http Server的过程。
NanoHttpd是Github上的一个开源项目,号称只用一个java文件就能创建一个http server,我将通过分析NanoHttpd的源码解析如何开发自己的HttpServer。Github 地址:https://github.com/NanoHttpd/nanohttpd
在开始前首先简单说明HttpServer的基本要素:
1.能接受HttpRequest并返回HttpResponse
2.满足一个Server的基本特征,能够长时间运行
关于Http协议一般HttpServer都会声明支持Http协议的哪些特性,nanohttpd作为一个轻量级的httpserver只实现了最简单、最常用的功能,不过我们依然可以从中学习很多。
首先看下NanoHttpd类的start函数
[java]view plain
publicvoidstart()throwsIOException{
myServerSocket=newServerSocket();
myServerSocket.bind((hostname!=null)?newInetSocketAddress(hostname,myPort):newInetSocketAddress(myPort));
myThread=newThread(newRunnable(){
@Override
publicvoidrun(){
do{
try{
finalSocketfinalAccept=myServerSocket.accept();
registerConnection(finalAccept);
finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);
finalInputStreaminputStream=finalAccept.getInputStream();
asyncRunner.exec(newRunnable(){
@Override
publicvoidrun(){
OutputStreamoutputStream=null;
try{
outputStream=finalAccept.getOutputStream();
=tempFileManagerFactory.create();
HTTPSessionsession=newHTTPSession(tempFileManager,inputStream,outputStream,finalAccept.getInetAddress());
while(!finalAccept.isClosed()){
session.execute();
}
}catch(Exceptione){
//,wethrowourownSocketException
//tobreakthe"keepalive"loopabove.
if(!(einstanceofSocketException&&"NanoHttpdShutdown".equals(e.getMessage()))){
e.printStackTrace();
}
}finally{
safeClose(outputStream);
safeClose(inputStream);
safeClose(finalAccept);
unRegisterConnection(finalAccept);
}
}
});
}catch(IOExceptione){
}
}while(!myServerSocket.isClosed());
}
});
myThread.setDaemon(true);
myThread.setName("NanoHttpdMainListener");
myThread.start();
}
1.创建ServerSocket,bind制定端口
2.创建主线程,主线程负责和client建立连接
3.建立连接后会生成一个runnable对象放入asyncRunner中,asyncRunner.exec会创建一个线程来处理新生成的连接。
4.新线程首先创建了一个HttpSession,然后while(true)的执行httpSession.exec。
这里介绍下HttpSession的概念,HttpSession是java里Session概念的实现,简单来说一个Session就是一次httpClient->httpServer的连接,当连接close后session就结束了,如果没结束则session会一直存在。这点从这里的代码也能看到:如果socket不close或者exec没有抛出异常(异常有可能是client段断开连接)session会一直执行exec方法。
一个HttpSession中存储了一次网络连接中server应该保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。
5.这里accept一个client的socket就创建一个独立线程的server模型是ThreadServer模型,特点是一个connection就会创建一个thread,是比较简单、常见的socket server实现。缺点是在同时处理大量连接时线程切换需要消耗大量的资源,如果有兴趣可以了解更加高效的NIO实现方式。
当获得client的socket后自然要开始处理client发送的httprequest。
Http Request Header的parse:
[plain]view plain
//Readthefirst8192bytes.
//Thefullheadershouldfitinhere.
//Apache'sdefaultheaderlimitis8KB.
//!
byte[]buf=newbyte[BUFSIZE];
splitbyte=0;
rlen=0;
{
intread=-1;
try{
read=inputStream.read(buf,0,BUFSIZE);
}catch(Exceptione){
safeClose(inputStream);
safeClose(outputStream);
thrownewSocketException("NanoHttpdShutdown");
}
if(read==-1){
//socketwasbeenclosed
safeClose(inputStream);
safeClose(outputStream);
thrownewSocketException("NanoHttpdShutdown");
}
while(read>0){
rlen+=read;
splitbyte=findHeaderEnd(buf,rlen);
if(splitbyte>0)
break;
read=inputStream.read(buf,rlen,BUFSIZE-rlen);
}
}
1.读取socket数据流的前8192个字节,因为http协议中头部最长为8192
2.通过findHeaderEnd函数找到header数据的截止位置,并把位置保存到splitbyte内。
[java]view plain
if(splitbyte<rlen){
inputStream.unread(buf,splitbyte,rlen-splitbyte);
}
parms=newHashMap<String,String>();
if(null==headers){
headers=newHashMap<String,String>();
}
//.
BufferedReaderhin=newBufferedReader(newInputStreamReader(newByteArrayInputStream(buf,0,rlen)));
//
Map<String,String>pre=newHashMap<String,String>();
decodeHeader(hin,pre,parms,headers);
1.使用unread函数将之前读出来的body pushback回去,这里使用了pushbackstream,用法比较巧妙,因为一旦读到了header的尾部就需要进入下面的逻辑来判断是否需要再读下去了,而不应该一直读,读到没有数据为止
2.decodeHeader,将byte的header转换为java对象
1.Http协议第一行是Method URI HTTP_VERSION
2.后面每行都是KEY:VALUE格式的header
3.uri需要经过URIDecode处理后才能使用
4.uri中如果包含?则表示有param,httprequest的param一般表现为:/index.jsp?username=xiaoming&id=2
下面是处理cookie,不过这里cookie的实现较为简单,所以跳过。之后是serve方法,serve方法提供了用户自己实现httpserver具体逻辑的很好接口。在NanoHttpd中的serve方法实现了一个默认的简单处理功能。
这个默认的方法处理了PUT和POST方法,如果不是就返回默认的返回值。
parseBody方法中使用了tmpFile的方法保存httpRequest的content信息,然后处理,具体逻辑就不细说了,不是一个典型的实现。
最后看一下发response的逻辑:
sendAsFixedLength(outputStream,pending);
}
outputStream.flush();
safeClose(data);
}catch(IOExceptionioe){
//Couldn'twrite?Nocando.
}
}
发送response的步骤如下:
1.设置mimeType和Time等内容。
2.创建一个PrintWriter,按照HTTP协议依次开始写入内容
3.第一行是HTTP的返回码
4.然后是content-Type
5.然后是Date时间
6.之后是其他的HTTP Header
7.设置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是让客户端和服务器端之间保持一个长链接。
8.如果客户端指定了ChunkedEncoding则分块发送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比较大的时候使用,server端会首先发送response的HEADER,然后分块发送response的body,每个分块都由chunk length 和chunk data 组成,最后由一个0 结束。
9.如果没指定ChunkedEncoding则需要指定Content-Length来让客户端指定response的body的size,然后再一直写body直到写完为止。
最后总结下实现HttpServer最重要的几个部分:
1.能够accept tcp连接并从socket中读取request数据
2.把request的比特流转换成request对象中的对象数据
3.根据http协议的规范处理http request
4.产生http response再写回到socket中传给client。