网络编程


网络参考模型

OSI参考模型

TCP/IP参考模型



通信其实就是数据的封包和拆包过程,从应用层开始每进入一层数据中都会添加每层的特征,到达目的后,从物理层开始拆包。如果通信协议不同无法解析封包的数据,那么就会通信失败

网络通讯要素

IP地址:InetAddress

网络中设备的标识(硬件设备标识)

不易记忆,可用主机名

本地回环地址:127.0.0.1  主机名:localhost(主机内部自测)

端口号

用于标识进程的逻辑地址,不同进程的标识(应用程序标识)

有效端口:0~65535,其中0~1024系统使用或保留端口。

传输协议

通讯的规则

常见协议:TCP,UDP

TCP和UDP的区别

UDP(聊天,视频会议)

将数据及源和目的封装成数据包中,不需要建立连接(面向无连接)

每个数据报的大小限制在64k内

因无连接,是不可靠协议

不需要建立连接,速度快

TCP(下载)

建立连接,形成传输数据的通道。

在连接中进行大数据量传输

通过三次握手完成连接,是可靠协议(1,哥们,你在吗,2,我在,3,哦,我知道你在了)

必须建立连接,效率会稍低


网络通讯过程描述

举例:使用QQ传输一个文件

通讯的前提:双方的通讯协议相同(TCP协议)

通讯的过程:

1,首先通信双方先找到对方的IP地址

2,按照通信规则进行数据传输(封包拆包的过程)

3,数据拆包后,识别接收数据的应用程序的端口,逻辑端口匹配,数据才会被该应用程序处理

4,数据传输完毕


获取百度的所有IP地址

/**
获取IP
*/
import java.net.*;
class GetIP 
{
	public static void main(String[] args) throws Exception
	{
		InetAddress[] ia = InetAddress.getAllByName("www.baidu.com");
		for (InetAddress i : ia)
		{
			System.out.println(i.getHostName());
			System.out.println(i.getHostAddress());
		}
	}
}

Socket

Socket就是为网络服务提供的一种机制。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。

Socket既可以发送数据也可以接收数据


UDP

udp的正常通讯需要发送端和接收端

定义发送端的步骤:

1,建立updsocket服务。(创建DatagramSocket对象)
2,提供数据,并将数据封装到数据包中。(DatagramPacket)
3,通过socket服务的发送功能,将数据包发出去。(send())
4,关闭资源。(close())

发送端注意事项:在发送端,要在数据包对象中明确目的地IP及端口。

代码示例:

import java.net.*;
class UdpSend 
{
	public static void main(String[] args) throws Exception
	{
		//建立UDPsend服务
		DatagramSocket ds = new DatagramSocket();
		//将要发送的数据封装到数据包中
		byte[] buf = "zui hou yi zhang".getBytes();
		DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("1L3EYLRWCX7IWPZ"),2000);
		//发送数据
		ds.send(dp);
		//关闭资源
		ds.close();
	}
}

定义接收端的步骤

1,定义udpsocket服务。传入要监听的端口
2,定义一个数据包,用于存储接收到的字节数据。
数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。(getData(),getPort(),getAddress())
5,关闭资源。

接收端注意事项:在接收端,要指定监听的端口。

代码示例:

import java.net.*;
class  UdpRece
{
	public static void main(String[] args) throws Exception
	{
		//创建UDPsocket服务
		DatagramSocket ds = new DatagramSocket(2000);
		//定义数据包存储数据
		byte[] buf = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf,buf.length);
		//将接收到的数据存入已定义好的数据包中
		ds.receive(dp);
		//数据包对象的特有方法,提取信息
		String data = new String(dp.getData(),0,dp.getLength());
		System.out.println(dp.getAddress().getHostName()+"---"+data+"---"+dp.getPort());
		//关闭资源
		ds.close();
	}
}

TCP

tcp的正常通讯需要客户端和服务端

1,建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2,如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStreamgetOutputStream就可以获取两个流对象。
3,关闭资源。

数据传输示意图


定义客户端的步骤:
客户端

1,建立socket服务,并指定要连接的服务器的端口和主机名
2,发送数据。
因为要传输的数据种类很多,所以使用字节流,socket服务要先获取输出流,(getOutputStream())
将要发送的数据写入输出流中。socket服务将输出流的内的数据发送到指定服务端
3,关闭socket服务

import java.io.*;
import java.net.*;
class  TcpClient
{
	public static void main(String[] args) throws Exception
	{
		Socket s = new Socket("1L3EYLRWCX7IWPZ",1000);
		OutputStream os = s.getOutputStream();
		//使用write方法将要传输的数据写入输出流中
		os.write("hallo c".getBytes());
		s.close();
	}
}


定义服务端的步骤:

服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象。
通过ServerSokcet的 accept方法。没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取(getInputStream())到该客户端对象的读取流来读取发过来的数据。
并打印在控制台。
4,关闭客户端连接(根据需要也可以关闭服务端)

import java.io.*;
import java.net.*;
class  TcpServer
{
	public static void main(String[] args) throws Exception
	{
		ServerSocket ss = new ServerSocket(1000);
		//监听并接受服务端的连接
		Socket s = ss.accept();
		System.out.println("ClientName:"+s.getInetAddress().getHostAddress());
		//提取字节流中的数据
		InputStream is = s.getInputStream();//获取socket流中的输入流对象
		byte[] buf = new byte[1024];
		int len = is.read(buf);
		System.out.println(new String(buf,0,len));
		//此处关闭的是客户端的资源
		s.close();
	}
}

上传图片案例:

客户端:

/*
需求:上传图片
分析:
客户端。
1,服务端点。
2,读取客户端已有的图片数据。
3,通过socket 输出流将数据发给服务端。
4,读取服务端反馈信息。
5,关闭。
*/
import java.io.*;
import java.net.*;
class PicClient 
{
	public static void main(String[] args) throws Exception
	{
		//创建socket服务,指定服务端地址和端口
		Socket s = new Socket("1L3EYLRWCX7IWPZ",1001);
		//写入图片文件
		FileInputStream fis = new FileInputStream("c:\\4.jpg");
		OutputStream os = s.getOutputStream();
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = fis.read(buf)) != -1)
		{
			os.write(buf,0,len);
		}
		/*
		上面代码读取完毕后,并没有告诉服务端读取完毕,read是阻塞式方法,所以两端会一直等待
		这里需要调用输出流结束标记方法
		*/
		s.shutdownOutput();
		System.out.println("IP:"+s.getInetAddress().getHostAddress());
		//获取服务器端反馈信息
		InputStream is = s.getInputStream();
		byte[] bt = new byte[1024];
		int l = is.read(bt);
		System.out.println(new String(bt,0,l));
		//关闭资源
		fis.close();
		s.close();

	}
}

服务器端

/**
需求:复制图片
服务端
1,建立服务
2,读取文件
3,反馈信息
4,关闭资源
*/
import java.io.*;
import java.net.*;
class PicServer 
{
	public static void main(String[] args) throws Exception 
	{
		//建立服务端服务
		ServerSocket ss = new ServerSocket(1001);
		//获取客户端
		Socket s = ss.accept();
		//读取流中的数据并写入指定的文件中
		FileOutputStream fos = new FileOutputStream("server.jpg");
		InputStream is = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = 0;
		while ((len = is.read(buf)) != -1)
		{
			fos.write(buf,0,len);
		}
		//定义服务端反馈信息
		OutputStream os = s.getOutputStream();
		os.write("文件已经收到".getBytes());
		//关闭资源
		fos.close();
		s.close();
		ss.close();
	}
}

浏览器客户端-自定义服务端:

在浏览器地址栏中输入服务端监听的端口和IP地址就可以显示出服务端所发送的数据,并且可以写入浏览器所支持的语言,这时候浏览器接收到这些语言后,会自动解析,按照语言所定义的格式显示信息

浏览器客户端-tomcat服务端

tomcat是一款由java语言开发出来的服务端程序

tomcat的安装和配置

1,配置的前提是要配置好JDK

2,解压tomcat软件包

3,配置环境变量

3.1,新建变量名:CATALINA_BASE,变量值:C:\tomcat

3.2,新建变量名:CATALINA_HOME,变量值:C:\tomcat

3.3,打开PATH,添加变量值:%CATALINA_HOME%\lib;%CATALINA_HOME%\bin

4,启动tomcat的三种方式

1,方法一:在CMD命令下输入命令:startup,出现如下对话框,表明服务启动成功。

2,方式二:找到tomcat所在的文件夹bin目录下的startup.bat文件,双击运行

3,方法三:右键点击桌面上的“我的电脑”->“管理”->“服务和应用程序”->“服务”,找到“Apache     Tomcat”服务,右键点击该服务,选择“属性”,将“启动类型”由“手动”改成“自动”。


java.net.URL

URL 代表一个统一资源定位符,它是指向互联网“资源”的指针。

常用的方法

 String getFile() 
          获取此 URL 的文件名。 
 String getHost() 
          获取此 URL 的主机名(如果适用)。 
 String getPath() 
          获取此 URL 的路径部分。 
 int getPort() 
          获取此 URL 的端口号。 
 String getProtocol() 
          获取此 URL 的协议名称。 
 String getQuery() 
          获取此 URL 的查询部 

代码示例:

import java.net.*;
class URLDemo 
{
	public static void main(String[] args) throws MalformedURLException
	{
		URL url = new URL("http://192.168.1.254/myweb/demo.html?name=haha&age=30");


		System.out.println("getProtocol() :"+url.getProtocol());
		System.out.println("getHost() :"+url.getHost());
		System.out.println("getPort() :"+url.getPort());
		System.out.println("getPath() :"+url.getPath());
		System.out.println("getFile() :"+url.getFile());
		System.out.println("getQuery() :"+url.getQuery());
	}
}

对应的结果:

getProtocol() :http   URL的协议名称
getHost() :192.168.1.254 获取URL的主机地址
getPort() :-1   当URL中没有端口号时,获取端口号返回-1
getPath() :/myweb/demo.html   URL中的路径名
getFile() :/myweb/demo.html?name=haha&age=30  URL的文件名
getQuery() :name=haha&age=30  URL的查询部分


域名解析过程

日常生活中我们浏览网页时,输入网址后就可以打开对应的网站,其实并不是我们表面看到的这么简单

首先我们的电脑中有一个hosts文件,其次网络中有一个存储了各大网站IP地址的DNS服务器,当我们输入网址时,并不是直接进入了对方的网站,而是先查找本地的hosts文件,如果这里没有指定网站的IP,就会到网络中的DNS服务器中查找对应的网址IP,DNS会向请求方返回IP地址,这时候我们才能进入指定网址的网站。

示意图:





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值