java扫描局域网的端口
直接上代码:
import javanetSocket;import javatextSimpleDateFormat;
import javautilDate;
public class PortScanner extends Thread {
private int[] p;
Socket ss = null;
public PortScanner(int[] p) {
thisp = p;
}
public static void main(String[] args) {
for (int i = 0; i < 65535; i = i + 100) {
new PortScanner(new int[] { i + 1, i + 100 })start();
}
}
@Override
public void run() {
for (int i = p[0]; i < p[1]; i++) {
try {
ss = new Socket("8888", i);
Systemoutprintln("扫描到端口: " + i);
} catch (Exception e) {
// Systemoutprintln("关闭端口: " + i);
}
}
}
}
Socket做服务器需要绑定端口,你绑定时用的是啥就是啥。。。一般程序都是约定端口号,比如HTTP就是80,所有人都会去连80,邮箱是25等等。。。作为一个程序,你自己不约定,你指望瞎蒙么 你就算告诉客户端,客户端也要知道,你的数据发到哪个端口上了,客户端才能查看你发的东西,这样同样是相当于约定了一个UDP端口号。。。。
首先你必须建立第一个链接,或者非链接,但无论是什么,这第一次都必须约定端口,无论约定到客户还是服务器,通常程序都是客户端主动链接服务器,因为服务器通常是一个,客户端几百万个的话,你打算去一个个尝试在线不在???
端口有6万多个,大多数是自定义端口,我都不知道你咋冲突,你有6W个服务???一个运气差被占了,链接失败,你换一个就行,6W个够用不。。。主要有一个或几个是约定的就好,你约定100个,我都不信,100个都冲突。。。你约定个6321,保证没人用,我瞎打的,自定义的没人用。。。随机分的印象都是大于10000的。。。
1、UDPRece的DatagramSocket需指定端口。
2、UdpSend的DatagramPacket的目标端口需要和UDPRece的DatagramSocket的端口一致。
import javanetDatagramPacket;import javanetDatagramSocket;
public class UdpRece {
public static void main(String[] args) throws Exception {
// 1创建udp Socket,建立端点
DatagramSocket ds = new DatagramSocket(20000);
// 2定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buflength);
// 3通过服务的receive方法将数到数据存入数据包中
dsreceive(dp);
// 4通过数据包的方法获取其中的数据。
String ip = dpgetAddress()getHostAddress();
String data = new String(dpgetData(), 0, dpgetLength());
int port = dpgetPort();
Systemoutprintln(ip + "::" + data + "::" + port);
// 4关闭资源
dsclose();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import javanetDatagramPacket;
import javanetDatagramSocket;
import javanetInetAddress;
public class UdpSend {
public static void main(String[] args) throws Exception {
// 1创建udp服务,通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket(10000);
// 2确定数据,并封装成数据包。
// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
// 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
byte[] buf = "udp shu ju lai le"getBytes();
DatagramPacket dp = new DatagramPacket(buf, buflength, InetAddressgetByName("1921681100"),
20000);
// 3通过Socket服务,将已有的数据包发送出去。通过send方法。
dssend(dp);
// 4关闭资源
dsclose();
}
}
主机的地址就是作为服务器的IP地址!要是连接你自己的就直接用localhost或是127001都可以!要是连接其他的!就该城相应的IP就可以!
oracle端口号是1521,mysql端口号是3306,sql server端口号是1433,我们一般使用的也就这几中数据库!记住这三个端口号就可以了!记住!这些端口号都是默认的!是可以更改的!
import javanet;
import javaio;
public class TestSocketClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("127001", 5566);
Systemoutprintln("请输入计算式:");
BufferedReader br = new BufferedReader(new InputStreamReader(Systemin));
String s1 = brreadLine();
DataOutputStream dos = new DataOutputStream(socketgetOutputStream());
DataInputStream dis = new DataInputStream(socketgetInputStream());
doswriteUTF(s1);
dosflush();
double s = disreadDouble();
Systemoutprintln("计算结果:" + s);
disclose();
dosclose();
socketclose();
} catch (IOException e) {
eprintStackTrace();
Systemoutprintln("连接出错");
Systemexit(-1);
}
}
}
服务器端:
import javanet;
import javaio;
public class TestSocketServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(5566);
Socket socket = ssaccept();
DataOutputStream dos = new DataOutputStream(socketgetOutputStream());
DataInputStream dis = new DataInputStream(socketgetInputStream());
String s = null;
if ((s = disreadUTF()) != null) {
Systemoutprintln("接收到的算式:" + s);
double result = 0;
String[] sarr1 = ssplit("[\\+\\-\\\\/]");
double a = DoubleparseDouble(sarr1[0]trim());
double b = DoubleparseDouble(sarr1[1]trim());
String[] sarr2 = ssplit("^(-\\d+)(\\\\d+)");
char c = sarr2[1]trim()charAt(0);
switch (c) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '':
result = a b;
break;
case '/':
result = a / b;
break;
default:
break;
}
doswriteDouble(result);
dosflush();
}
disclose();
dosclose();
socketclose();
} catch (IOException e) {
eprintStackTrace();
Systemexit(-1);
}
}
}
0条评论