工具/原料
root软件:百度root为佳!如果你已经获取了权限,可以跳过。
ksweb软件:用于搭建手机php服务器的软件。
nat123软件:强大的内网端口映射软件,不需要路由器权限。
方法/步骤
1安装手机本地php+mysql服务器环境篇 :
11安装ksweb软件,安装好ksweb后,会在手机上生成一个文件夹htdocs,其目录是mnt/sdcard/htdocs,htdocs是网站的根目录。
12安装mysql 直接点击mysql管理,点击选择“是”然后解压便可自动安装。mysql的账号密码随后再改(在设置里面更改)。
13安装好MySQL之后,我们需要对ksweb进行一些设置方可更好使用。
131端口的更改步骤:(启用root→更改80端口)手机服务器启用root,在ksweb设置里面把root打钩。
132开启手机80端口方法:把8080端口改为80端口,并把PHP服务,MySQL都打勾。其他一些设置比如MySQL密码,开机自启动等选项大家根据需要自行修改即可!
14ksweb全部设置好后,我们打开手机本地服务器地址localhost:80,表示设置好了。
我们点击页面中的“Enter KSWEB Web Interface”可以看到手机服务器的一些配置信息(默认账号密码都是“admin”),表示手机服务搭建成功,一切正常!
2利用nat123软件进行内网80端口映射篇:
21注册账号,我们先到其官网注册账号官网,大家百度nat123即可。
22登陆并添加域名解析。
221 应用名称,要搭建自己的博客,可以填XX的博客,或者XX的个人博客等。
222 内网端口,只有root的手机才填80端口。
223 内网地址这个默认localhost就行。
224 外网域名,如果没有自己的域名,可以用官方免费的二级域名,注意格式,一切填好之后,点击确认保存即可!
23 下载并安装登陆安卓版的nat123,就自动解析了。
34 接下来在另一台电脑上输入刚才的域名访问,表示安卓手机web服务器安装成功,网站搭建成功!
注意事项
另外如果需要手机网站一直都可以访问,需要下载一个永不关屏软件,这样手机就不会进入睡眠状态,服务也不会停止,不过比较耗电。
外网能访问内网手机web服务器的关键是nat123端口映射功能,利用nat123端口映射功能,不只是搭建内网网站,还可以挖掘其他的许多用途。
如果没有的话公司首先需要买服务器,如果预算比较充足的话
可以连磁盘阵列,专门用来存放咱们的数据库,服务器用两台做个双机热备,
来保证服务器的高可靠性,保证公司业务的连续性。
硬件平台搭设好以后再买数据库软件,有盗版有正版的,
一般的用SQL比较多,高级点的就用ORACLE自己定义一个结构体发字节流过去不就可以了。建议把字节流封包传输
如:
第1个字节 &HB1 表示包头开始标志
第2个字节 &H01 表示发送数据命令
第3-4个字节 &H0005 表示数据长度为5个字节
第5个字节 &H00 具体的数据第1个字节内容
第6个字节 &H00 具体的数据第2个字节内容
第7个字节 &H00 具体的数据第3个字节内容
第8个字节 &H00 具体的数据第4个字节内容
第9个字节 &H00 具体的数据第5个字节内容
第10个字节 &HB5 从包头开始逐个进行异或运算的“异或校检码”,校检数据的完整性用
第11个字节 &HB2 表示包尾
上面这个包主要由6个部分组成
1、包头 用来进行包的初始化识别
2、命令 扩展包协议用,如传输语句、传输控制指令、移动记录等
3、数据长度 我这里的例子是用两个字节表示长度,即最多一个包传输65536个字节的数据
4、数据区域 具体要传输的数据段落
5、异或校检码 为了检测数据的完整性,也可以用CRC16或CRC32等算法进行数据校检
6、包尾 用来完整识别一个包内容的结束标志
通过上面这个包结构,可以在数据包里放置小于65536个字节的内容进行传输
在处理传输数据时可以这么做:
Type SendReport
sr_head As Byte ' 固定为 &HB1
sr_cmd As Byte ' 命令
sr_size As Integer ' 数据大小
sr_data() As Byte ' 数据内容
sr_xor As Byte ' 异或校检码
sr_end As Byte ' 固定为 &HB2
End Type
Type SendRF
rs_type As Integer ' 字段类型
rs_NameSize As Integer ' 字段名称字节数
rs_name() As Byte ' 字段名称内容
rs_size As Integer ' 字段数据大小
rs_data() As Byte ' 字段数据内容
End Type
Type SendRS
rs_fcount As Integer ' 字段数量
rs_data() As SendRF ' 字段数据
End Type
然后把数据集的数据赋值到上面的机构体里,再把结构体的数据格式化到一个字节数组中,便可把这个字节数组发送出去,接收端只要根据格式提取出相关数据到结构体,就可以实现数据的还原过程。在过程里只要善用 CopyMemory API 就可以很容易实现这种过程的处理,如
Dim SR As SendReport
Dim SentBytes() as Byte
Dim i As Long
SRsr_head = &HB1:SRsr_xor = SRsr_head
SRsr_cmd = &H01:SRsr_xor = SRsr_xor xor SRsr_cmd
SRsr_size = &H05:SRsr_xor = SRsr_xor xor SRsr_size
Redim SRsr_data(4)
for i=0 to ubound(SRsr_data)
SRsr_xor = SRsr_xor xor SRsr_data(i)
next i
SRsr_end = &HB2
Redim SentBytes(10)
CopyMemory SentBytes(0),SRsr_head,1
CopyMemory SentBytes(1),SRsr_cmd,1
CopyMemory SentBytes(2),SRsr_size,2
CopyMemory SentBytes(4),SRsr_data(0),5
SentBytes(Ubound(SentBytes)-1) = SRsr_xor
SentBytes(Ubound(SentBytes)) = SRsr_end
Winsock1SendData SentBytes
当然上面只是封包的过程,没有设置具体的数据集数据,不过原理也差不多,也就是读写SendRF和SendRS结构的问题。具体的自己做做看吧。控制台应用1(服务器):
using System;using SystemCollectionsGeneric;using SystemLinq;using SystemText;using SystemNet;using SystemNetSockets;using SystemThreading;
namespace ConsoleApplication1{ class Program { //服务器端
private static byte[] result = new byte[1024]; private static int myPort = 8081; static Socket serverSocket; static void Main(string[] args) { IPAddress ip = IPAddressParse("127001"); serverSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp); serverSocketBind(new IPEndPoint(ip, myPort)); serverSocketListen(10); ConsoleWriteLine("启动监听成功!终结点:"+serverSocketLocalEndPoint); Thread td1 = new Thread(ListenClient); td1Start(); ConsoleReadKey(); serverSocketClose(); } /// <summary> /// 监听客户端连接 /// </summary> static void ListenClient() { while (true) { Socket clientSocket = serverSocketAccept(); clientSocketSend(EncodingASCIIGetBytes("come on baby!")); Thread td2 = new Thread(ReceiveMessage); td2Start(clientSocket); } }
static void ReceiveMessage(object clientSocket) { Socket mySocket = (Socket)clientSocket; while (true) { try { int receiveNum = mySocketReceive(result); ConsoleWriteLine("接收到客户端({0})消息:{1}", mySocketRemoteEndPoint, EncodingASCIIGetString(result, 0, receiveNum));
} catch(Exception ex) { ConsoleWriteLine(exMessage); mySocketShutdown(SocketShutdownBoth); mySocketClose(); break; } } } }}
控制台应用2(客户端):
using System;using SystemCollectionsGeneric;using SystemLinq;using SystemText;using SystemThreading;using SystemNet;using SystemNetSockets;
namespace ConsoleApplication2{ class Program { //客户端 static byte[] result = new byte[1024]; static void Main(string[] args) { IPAddress ip = IPAddressParse("127001"); Socket clientSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp); try { clientSocketConnect(ip, 8081); ConsoleWriteLine("连接服务器成功!"); } catch { ConsoleWriteLine("连接服务器失败!任意键退出"); ConsoleReadKey(); return; } int receiveNum = clientSocketReceive(result); ConsoleWriteLine("接收到服务器消息:"+EncodingASCIIGetString(result,0,receiveNum));
while (true) { try { ConsoleWrite("你想对服务器说什么('0'键退出):"); string message = ConsoleReadLine(); if (!messageEquals("0")) { clientSocketSend(EncodingASCIIGetBytes(message)); ConsoleWriteLine("发送成功!"); } else { clientSocketShutdown(SocketShutdownBoth); clientSocketClose(); break; } } catch { clientSocketShutdown(SocketShutdownBoth); clientSocketClose(); break; } } ConsoleWriteLine("悄悄话已结束。任意键退出"); ConsoleReadKey(); } }}
写的一个小例子,用socket实现的,楼主参考下吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)