网络模型:
网络编程的三要素:1.IP地址2.端口号3.传输协议
1.IP地址:
计算机的唯一标识,本地地址:127.0.0.1,
本地主机名字:localhost
有IPv4和IPv6,出现IPv6的原因是由于使用计算的人越来越多,IPv4的数量不够分配。
每台计算机都有指定的计算机名字
IP地址的分类:
A类: 1.0.0.0 -- 127.255.255.254
私有地址10.0.0.0-10.255.255.255
B类 128.0.0.0---191.255.255.254
私有地址172.16.0.0---172.31.255.255。
C类 192.0.0.0---223.255.255.254
私有地址192.168.0.0-192.168.255.255
D类 224.0.0.0---239.255.255.255是多播地址
E类 240.0.0.1---247.255.255.254
255.255.255.255是当前子网的广播地址
2.端口号:
标识进程的逻辑地址,不同进程的标识不一样
有效端口为0到65535,其中0到1024为系统所用或被系统所保留
3.传输协议:定义的通讯规则
UDP和TCP
UDP特点:
数据源和目的封装成数据包,最大不超过64K,面向无连接,传输速度快,是不可靠协议
使用场景:QQ聊天,在线视频,
TCP特点:
通过三次握手进行连接,是可靠协议,传输速度慢,但可以进行大规模数据传输
使用场景:下载,
InetAddress示例:
import java.net.*;
class IPDemo
{
public static void main(String[] args) throws Exception
{
InetAddress ia = InetAddress.getLocalHost();//得到本地主机
String name = ia.getHostName();//得到主机名
String address = ia.getHostAddress();//得到主机地址
System.out.println(name+":::::::"+address);
/*InetAddress ia = InetAddress.getByName("192.168.1.110");//通过主机名确定IP主机地址
String name = ia.getHostName();//得到主机名
String address = ia.getHostAddress();//得到主机地址
System.out.println(name+":::::::"+address);
System.out.println("-------------------------------------------------");
InetAddress ia1 = InetAddress.getByName("www.baidu.com");通过主机名确定IP主机地址
String name1 = ia1.getHostName();//得到主机名
String address1 = ia1.getHostAddress();//得到主机地址
System.out.println(name1+":::::::"+address1);*/
}
}
域名解析:
首先通过本地的hosts解析,解析失败了,才会去访问DNS服务器解析,然后得到IP地址,通过IP地址,返回数据
Socket:
是为网络服务提供的一种机制,通信的两端都有Socket服务,网络通信就是Socket间的通讯,数据在Socket中通过IO传输
UDP传输示例:
发送端:
思路:
1.创建发送端Socket对象
2.创建数据报包,封装数据和目的
3.发数据
4.关资源
import java.net.*;
import java.io.*;
class UDPSend
{
public static void main(String[] args) throws Exception
{
System.out.println("发送端启动");
//建立一个发送端服务,设置发送端口为8888
DatagramSocket ds = new DatagramSocket(8888);
//从键盘录入发送的数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine())!=null)
{
if(line.equals("886"))
break;
byte[] buf = line.getBytes();
//建立一个数据报包,用于存储发送的源和目的DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10000);
ds.send(dp);
}
ds.close();
}
}
接收端:
思路:
1.创建接收端Socket对象
2.创建数据报包
3.接收数据,并解析数据,输出到控制台
4.关资源
import java.net.*;
import java.io.*;
class UDPReveice
{
public static void main(String[] args)throws Exception
{
System.out.println("接收端启动");
//建立一个接收服务端,设置端口为10000
DatagramSocket ds = new DatagramSocket(10000);
//接收发送过来的数据报包
while(true)
{
byte[] buf = new byte[1024];
//建立一个数据报包,接收发送过来的数据
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();//得到IP地址
String data = new String(dp.getData(),0,dp.getLength()); //得到发送过来的数据
int port = dp.getPort();//得到端口号
System.out.println(ip+":::"+data+":::"+port);
}
}
}
TCP传输示例:
思路:
1.建立服务端点,与客户端相连接
2.通过socket读入流读取数据
3.把图片数据写入指定硬盘位置
4.通过socket输出流传输反馈信息
5.关闭资源
服务端:
import java.io.*;
import java.net.*;
class Server
{
public static void main(String[] args) throws Exception
{
//定义一个服务Socket,设置端口为10000
ServerSocket ss = new ServerSocket(10000);
Socket s1 = ss.accept();//接受连接
InputStream is = s1.getInputStream();//得到客户端的输入流
FileOutputStream fos = new FileOutputStream("2.png");//指定目的
byte[] buf = new byte[1024];
int len = 0;
while((len=is.read(buf))!=-1)
{
fos.write(buf,0,len);
}
OutputStream os =s1.getOutputStream();//得到客户端的输出流
os.write("上传成功!".getBytes());//写出反馈信息给客户端
//释放资源
fos.close();
s1.close();
ss.close();
}
}
客户端:
1.建立客户端点
2.从硬盘读取图片数据
3.通过socket输出流传输给服务端
4.读取服务端的反馈信息
5.释放资源
import java.io.*;
import java.net.*;
class Client
{
public static void main(String[] args) throws Exception
{
//得到本机IP地址
String address = InetAddress.getLocalHost().getHostAddress();
//建立客户端,连接到指定的地址和端口
Socket s = new Socket(address,10000);
FileInputStream fis = new FileInputStream("1.png");
OutputStream os = s.getOutputStream();//得到客户端的输出流
int len = 0;
byte[] buf = new byte[1024];
while((len=fis.read(buf))!=-1)
{
os.write(buf,0,len);
}
//告诉服务端已经发送完毕
s.shutdownOutput();
//接收服务端的反馈信息
InputStream is = s.getInputStream();
byte[] b = new byte[1024];
int num = 0;
num=is.read(b);
//把反馈信息打印在控制台上
System.out.println(new String(b,0,num));
//释放资源
fis.close();
s.close();
}
}