1)网络概述
如果在网络之间应用程序能够通信,那么就需要三个元素(IP,端口和协议)
IP:在网络上的每一个计算机,或者在网络上进行通信的工具,都需要标识自己,那么就会IP地址来标识,IP地址常用的是32位二进制,也有128位的二进制标识。
端口:因为每一个设备上有很多应用程序,那么我们就需要来区分,标识这应用程序,就是每一个应用程序都有自己的端口号来标识自己,都是用数字进行标识。是逻辑地址。0~65535范围,其中0~1024不能使用,因为系统端口号或者保留端口。
协议:就是在网络上通信的规则,必须双方都遵守这个规则,那么双方才能通信,有很多协议的,我们常用的是TCP/IP,UDP协议。
网络模型:OSI参考模型和TCI/IP模型
OSI参考模型:应用层,表示层,会话层,传输层,网络层,链路层,物理层
TCP/IP体系:应用层,传输层,互联层,主机网络层
InetAddress类:
1.无构造函数,可通过getLocalHost()方法获取InetAddress对象,此方法是静态的,返回本类对象。
InetAddress i = InetAddress.getLocalHost();
2.如何获取任意一台主机的IP地址对象:
1)功能:返回InetAddress对象
2)对于任意主机,需要指定传入主机名的参数
注意:如果IP地址和对应的主机名,
import java.net.InetAddress;
public class InterAddressDemo {
public static void main(String[] agrs) throws Exception {
/**
* 获得本机地址,名字和IP
*/
InetAddress ia = InetAddress.getLocalHost();
System.out.println(ia);
System.out.println("名字:" +ia.getHostName());
System.out.println("地址:" +ia.getHostAddress());
/**
* 获得百度的,
* 地址和名字可能不唯一,因为百度对应多个IP和地址
*/
InetAddress ia1=InetAddress.getByName("www.baidu.com");
System.out.println(ia1);
System.out.println("名字:" +ia1.getHostName());
System.out.println("地址:" +ia1.getHostAddress());
}
}
结果:
yang-PC/192.168.1.101
名字:yang-PC
地址:192.168.1.101
www.baidu.com/220.181.111.148
名字:www.baidu.com
地址:220.181.111.148
3.传输协议
UDP:面向无连接的(发数据之前不需要建立连接,打成包,)。不可靠协议,速度快,数据报大小限制在64k内,速度快,例如:qq,网络会议
TCP:要建立连接,可以传输大量数据 通过三次握手玩成连接是可靠协议 必须建立连接,效率低,例如:下载,打电话
Socket就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket的通信
数据在两个Socket间通过IO传输
创建步骤:
1.建立发送端和接收端
2.建立数据包。
3.调用Socket的发送和接受方法
4.关闭Socket
需求:通过UDP传输方式,将一段文字发送出去。
1.建立udpsocket服务
2.提供数据,将数据封装到数据包中
3.通过Socket服务的发送功能,将数据包发出去
4.关闭资源
接收:
需求:定义一个应用程序,用于接收数据并处理
1.定义UDF服务
2.定义一个数据包(无数据,用于存储接收到的字节数据),用其方法提取在包中数据信息
3.通过receive方法接受数据
4.从数据包中提取信息,然后打印在控制台上
5,关闭资源
发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 发送端
*/
public class UdpSend {
public static void main(String[] args) throws Exception{
/**
* 定义服务,可以指定当前端口,如果不指定那么就是随机的
* 定义数据包,指定要发送信息,长度,对方的地址和端口
* 发送,关闭
*/
DatagramSocket socket=new DatagramSocket(20000);//如果不指定,那么就是随机分配
String str="hello world";
DatagramPacket packet=newDatagramPacket(str.getBytes(),str.length(), “192.168.1.101”,10000);
socket.send(packet);//发送
socket.close();
}
}
接收
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* 接收端
*/
public class UdpReceive {
public static void main(String[] args) throws Exception {
/**
* 定义服务,指定本端口号,此端口号要和发送端发动的地址一样定义数据包,然后从数据包中提取信息,关闭
*/
DatagramSocket socket = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);// 接收这是一个阻塞方法
System.out.println(packet.getAddress().getLocalHost());
System.out.println("信息:"
+ new String(packet.getData(), 0, packet.getLength()));
System.out.println("端口号:" + packet.getPort());
socket.close();
}
}
结果:
yang-PC/192.168.1.101
信息:hello world
端口号:20000
三、客户端和服务的浏览器演示
浏览器是一个标准的客户端,它可以对服务端传送过来的数据消息进行解析,把符合应用层协议的消息部分解析后,将头信息拆包掉,传送到应用层,只保留了正确的正文主题部分显示在主体部分上。
而由于使用java编译是在传输层和网际层处理的,所以,会接受到全部的消息,包含了头消息。而浏览器处于应用层,已将发送来的头消息去除,只留下了主体信息。
示例:
自定义服务器,用浏览器访问:
import java.io.*;
import java.net.*;
//服务器
class ServerDemo
{
public static void main(String[] args)throws Exception
{
//创建服务,监听端口
ServerSocket ss=new ServerSocket(10000);
//获取客户端
Socket s=ss.accept();
//显示ip
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip);
//读取客户端读取流数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
//显示数据
System.out.println(new String(buf,0,len));
//返回信息写入客户端输出流
PrintWriter out=new PrintWriter(s.getOutputStream(),true);///true一定要记得写
out.println("<font color='red' size='7'>客户端你好!</font>");
s.close();//关流
ss.close();
}
}