JAVSE总结--网络编程

来源:互联网 发布:超级英雄数据下载失败 编辑:程序博客网 时间:2024/05/12 10:48

ISO7层协议

理层据链路层 络层 输层 话层示层用层

物理层网络连接的硬件设施

数据链路层交换机与交换机数据之间的传输

网络层

传输层数据传输的方式和地址

TCP传输协议

一种面向连接的,可靠的,基于字节流的运输层通信协议。

特点 面向连接 点到点通信 高可靠性

TCP三次握手

四次挥手

Smtp http ftp

UDP传输协议

一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

特点 非面向连接 传输不可靠 数据可能丢失

IP (Internet Protocol)

网络之间互连的协议,为计算机网络互相连接进行通信而设计的协议。

IPV432位地址,

IPV6128

端口:port

端口是虚拟的概念,并不是说在主机上真的有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。

默认一个电脑有65535个端口,其中1024之前都是系统预留的

端口的作用就是让电脑接收请求的时候不用再判断是哪个程序的请求

===============================================================================

 

InetAddress

封装计算机的ip地址和DNS ,没有端口

//使用getLocalHost方法创建InetAddress对象

InetAddress addr = InetAddress.getLocalHost();

System.out.println(addr.getHostAddress());  //返回:192.168.1.110

System.out.println(addr.getHostName());  //输出计算机名

 

//根据域名得到InetAddress对象

addr = InetAddress.getByName(www.163.com);

System.out.println(addr.getHostAddress());  //返回163服务器的ip:61.135.253.15

System.out.println(addr.getHostName());  //输出:www.163.com

//根据ip得到InetAddress对象

addr = InetAddress.getByName(61.135.253.15);

System.out.println(addr.getHostAddress());  //返回163服务器的ip:61.135.253.15

System.out.println(addr.getHostName());  //输出ip而不是域名。如果这个IP地 址不存在或DNS服务器不允许进行IP地址和域名的映射,getHostName方法就直接返回这个IP地址。

InetSocketAddress

包含端口,用于socket通信的  

//包含端口

InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1",8080);

InetSocketAddress socketAddress2 = new InetSocketAddress(localhost,9000);

System.out.println(socketAddress.getHostName());

System.out.println(socketAddress2.getAddress());

===============================================================================

URL

统一资源定位符

协议:hppts

主机名:www.baidu.com

资源地址:img/bd_logo1.png

端口号:80

URI

统一资源标识符

//获取指定的URL

URL url =new URL("https://www.baidu.com:80/img/bd_logo1.png?name=zhangsan#abcd");

//获取URL指定的属性

System.out.println("协议:" +url.getProtocol());

System.out.println("主机:" +url.getHost());

System.out.println("端口号:" +url.getPort());

System.out.println("默认端口号:" +url.getDefaultPort());

System.out.println("地址:" +url.getPath());

System.out.println("本次请求信息:" +url.getQuery());

System.out.println("锚点:" +url.getRef());

===============================================================================

网络爬虫

public class UrlSpider {

 

public static void main(String[]args) throws IOException {

//目标地址

//String path = "http://tool.cncn.com/youbian/100086";

String path ="http://tianruirui.iteye.com/blog/2318121";

spider(path,"utf-8");

}

 

private static void spider(String path,String charset)throws MalformedURLException,IOException,UnsupportedEncodingException {

//开始抓取数据

URL url =new URL(path);

//建立一个和当前URL相关的连接

URLConnection connection =url.openConnection();

//伪装成浏览器进行访问

connection.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36");

//开始抓取网站内容

InputStream inputStream =connection.getInputStream();

BufferedReader reader =new BufferedReader(new InputStreamReader(inputStream,charset));

//开始读取网站内容

StringBuffer buffer =new StringBuffer();

String line ="";

while ((line =reader.readLine()) !=null) {

buffer.append(line);

}

System.out.println(buffer);

 

System.out.println(buffer.toString().contains("正则表达式"));

 

//关闭流

reader.close();

}

===============================================================================

Socket通信

基于TCP协议,建立稳定连接的点对点的通信

实时、快速、安全性高、占用系统资源多、效率低

“请求-响应”模式

客户端

在网络通讯中,第一次主动发起通讯的程序

服务器

第一次通讯中等待连接的程序

Socket:发送TCP消息

ServerSocket:创建服务器

套接字是一种进程间的数据交换机制。这些进程既可以在同一机器上,也可以在通过网络连接的不同机器上。换句话说,套接字起到通信端点的作用。单个套接字是一个端点,而一对套接字则构成一个双向通信信道,使非关联进程可以在本地或通过网络进行数据交换。一旦建立套接字连接,数据即可在相同或不同的系统中双向或单向发送,直到其中一个端点关闭连接。

步骤:

1.创建服务器ServerSocket,

定义ServerSocket的监听端口(此端口接收客户端发来的消息!)

2.ServerSocket调用accept()方法,使之处于阻塞状态

3.创建客户机Socket,并设置服务器的ip及端口

4.客户机发出连接请求,建立连接。

5.分别取得服务器和客户端Socket的InputStream和OutputStream

6.利用Socket和ServerSocket进行数据传输。

代码:

 * java.net.BindException: Address already in use: JVM_Bind

 * 服务器启动两次,监听了相同的端口

 * java.net.ConnectException: Connection refused: connect

 * 先启动客户端,服务器还没有启动访问被拒绝

public class HelloServer {

public static void main(String[] args) throws IOException {

//先启动服务器,然后客户端才能够进行连接

ServerSocket server = new ServerSocket(18888);

System.out.println("服务器已经启动,正在监听【18888】端口,等待客户端的访问");

//计数器

int count = 0;

 

//等待客户端的连接

while (true) {

Socket socket = server.accept();

System.out.println("当前访问服务器的客户单信息为:" + socket.toString());

//服务器开始给客户端返回信息

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

//开始写出数据

writer.write("Across the Great Wall we can reach every corner in the world." + ++count);

//关闭

writer.flush();

writer.close();

socket.close();

}

 

}

}

public class HelloClient {

public static void main(String[] args) throws UnknownHostException, IOException {

//客户端开始访问服务器

Socket socket = new Socket("127.0.0.1", 18888);

//连接到服务器之后,需要接受服务器的返回信息

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

//开始读取返回信息

System.out.println("the server speak:" + reader.readLine());

//关闭

reader.close();

socket.close();

}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击