支持库 internet
支持库 eAPI子程序 >利用服务器控件和客户控件可以做出一个局域网的登录、控制系统源码如下: 版本
2
支持库
sock程序集
窗口程序集1
程序集变量
用户,
文本型
程序集变量
密码,
文本型子程序
__启动窗口_创建完毕
局部变量
IP,
文本型,
,
"0"IP
=
取本机IP
()
编辑框1内容
=
IP
[1]子程序
_服务器_数据到达
局部变量
数据,
文本型数据
=
删首尾空
(到文本
(服务器取回数据
()))
用户
=
取文本左边
(数据,
寻找文本
(数据,
“#”,
,
真)
-
1)
密码
=
取文本右边
(数据,
取文本长度
(数据)
-
寻找文本
(数据,
“#”,
,
真))
信息框
(“有用户登录:”
+
#换行符
+
用户
+
#换行符
+
密码,
0,
)
子程序
_按钮1_被单击客户连接
(编辑框1内容,
19730)
客户发送数据
(到字节集
(编辑框2内容
+
“#”
+
编辑框3内容))
子程序
_服务器_客户进入输出调试文本
(服务器取回客户
())本地测试,客户端连接127001,如果测试通信正常写的代码没问题,就是下面其中一个问题:1IP地址错误或端口冲突(使用1024-30000的端口),2客户端或服务端其中在一方在类局域网环境(路由器间隔需要端口映射,在有路由器端映射)。3客户端有防火墙阻隔(开放客户和服务端使用连接的端口)。最好使用反向连接可以绕过系统自带和一般防火墙。
对,就是要用端口映射。
第一个参数的话要填你电脑的外网ip(查外网ip:在百度搜索输入 ip ,按回车就可也看到了)。
第二个参数是填你映射的那个端口,还有服务端的端口应该和你映射的端口一致才可以!
可以考虑用JAVA实现监听客户端口,参考例子如下:
package test;import javaioByteArrayOutputStream;
import javaioIOException;
import javaioInputStream;
import javaioOutputStream;
import javalangreflectMethod;
import javanetDatagramPacket;
import javanetDatagramSocket;
import javanetInetAddress;
import javanetServerSocket;
import javanetSocket;
import javanetSocketException;
import javautilHashMap;
import javautilLinkedList;
import javautilList;
import javautilRandom;
/
该程序用的DatagramSocket,实现UDP的通讯
@author D'Addario
/
public class Test{
private int headLen = 12;//消息起点和终点的记录 例如classAclassB就是发往classA的消息,发送者是classB
private Random random;
private String serverIp;
private int serverPort;
private HashMap<String,Classes> map ;
{
serverIp = "127001";
serverPort = 9999;
random = new Random(SystemcurrentTimeMillis());
map = new HashMap<String,Classes>();
Classes A = Testthisnew Classes();
Aip = "127001";
Aname = "我是A";
Aport = 10000;
mapput("classA", A);
Classes B = Testthisnew Classes();
Bip = "127001";
Bname = "我是B";
Bport = 10001;
mapput("classB", B);
}
public static void main(String[] a) throws Exception{
Test test = new Test();
new Thread(testnew Server())start();
Client client1 = testnew Client();
client1mine = "classA";
client1remote = "classB";
new Thread(client1)start();
Client client2 = testnew Client();
client2mine = "classB";
client2remote = "classA";
new Thread(client2)start();
}
/
成员 用于记录 每个成员的个性信息
@author D'Addario
/
private class Classes {
private String name ; //成员姓名
private String ip ; //成员ip
private int port;//成员的client server 监听端口
}
/
server 用于转发两个client之间消息的类
@author D'Addario
/
private class Server implements Runnable{
public void run() {
// TODO Auto-generated method stub
boolean start = false;
DatagramSocket socket = null;
try {
socket = new DatagramSocket(serverPort);
start = true;
} catch (SocketException e1) {
e1printStackTrace();
}
while(start)
{
try {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,datalength);
socketreceive(packet);
int len = packetgetLength();
//Systemoutprintln("recevie data:"+new String(data,0,len));
if(len<headLen)
throw new IOException("无效数据");
String id = new String(data,0,headLen/2);//获取发往对象的ID
String id2 = new String(data,headLen/2,headLen/2);
Systemoutprintln("receive from "+id2 +", send to "+id+",msg["+new String(data,headLen,len-headLen)+"]");
Classes one = mapget(idtrim());
DatagramPacket retPack = new DatagramPacket(data,0,len,InetAddressgetByName(oneip),oneport);
socketsend(retPack);
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
}
/
Client 客户端类,用于客户端消息的发送
@author D'Addario
/
private class Client implements Runnable{
private String mine;
private String remote;
public void run() {
// TODO Auto-generated method stub
String msg = remote+mine;
DatagramSocket socket = null;
try {
socket = new DatagramSocket(mapget(mine)port);
ClientServer srv=new ClientServer();
srvsetSocket(socket);
new Thread(srv)start();
} catch (SocketException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
byte[] data ;
while(true)
{
String sendStr = msg + "给我"+randomnextInt(5000)+"分吧";
data = sendStrgetBytes();
try {
DatagramPacket retPack = new DatagramPacket(data,0,datalength,InetAddressgetByName(serverIp),serverPort);
socketsend(retPack);
Threadsleep(randomnextInt(5)1000);
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
}
/
客户端server 用于监听服务器的消息
@author D'Addario
/
private class ClientServer implements Runnable{
DatagramSocket socket ;
public DatagramSocket getSocket() {
return socket;
}
public void setSocket(DatagramSocket socket) {
thissocket = socket;
}
public void run() {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data,datalength);
while(true){
try {
socketreceive(packet);
int len = packetgetLength();
if(len<headLen)
throw new IOException("无效数据");
Systemoutprintln("I get the message :"+ThreadcurrentThread()getId()+"-->["+new String(data,0,len)+"]");
} catch (IOException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} }
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)