java之网络编程
需要掌握的知识点概括:
了解网络编程,IP地址,TCP,UDP,网络通信之间的数据通信连接点,InetAddress,URL&URLConnection,HTTP
01、概念
(1)什么是网络:网络是一组相互连接的计算机,用于实现数据通信,交换数据,资源共享。分为局域网,城域网,广域网。
(2)什么是Internet:一个巨大的网络集合,用于Internet中不同计算机系统的互联通信。
(3)什么是网络通信:即实现不同主机上的数据通信。
02、网络通信3要素::
(1)IP地址
— 网络的地址,或者在网络上的唯一标识,IP地址是数字,主要由4段组成,IP地址,不易记忆,可用主机名
— 获取本地主机ip地址对象:InetAddressip = InetAddress.getLocalHost();
— 获取其他主机的ip地址对象:ip =InetAddress.getByName("www.baidu.com");
(2)端口号
即数据发送的目的应用程序的数字标识,也称为逻辑端口,范围在0~65535,其中0~1024系统使用或保留端口
(3)传输协议
TCP/IP协议:国际组织定义的通用协议。
其他协议:UDP,FTP,HTTP等。
03、网络模型:
(1)概述
即网络数据传输模型,分为多个层,每层都有自己的数据传输任务,一个主机主机间层层往下,在另一主机往上,构成了网络通信。
主要有OSI和TCP/IP两个模型,TCP/IP和UDP协议在传输层,IP协议在网络层,FTP和HTTP协议在应用层
(2)OSI的七层
①物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。这一层的数据叫做比特。
②数据链路层:定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
③网络层:在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
④传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。 主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
⑤会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
⑥表示层:可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
⑦应用层:是最靠近用户的OSI层。这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
(3)使用TCP协议:
协议特点:
① 是面向连接的
② 需要形成传输通道
③ 可以大量传输数据
④ 连接通过3次握手完成,即呼叫—回应—回应,是可靠协议(相当于打电话)
⑤ 传输速度较慢
应用特点:需求与在乎数据的完整性传输。
应用程序实例:下载等。
(4)使用UDP协议:
协议特点:
① 是面向无连接的,不需要目的(相当于对讲机)
② 每个数据包的大小受限制,最大为64kb
③ 是不可靠协议
④ 传输数度快
应用特点:需求与只在乎传输速度,程序不在乎数据的丢失。
应用程序实例:视频会议,聊天室工具,网络会议等。
04、描述IP地址的类:InetAddress
InetAddress特点:
① 没有构造方法,使用本类静态方法返回本类对象
② 返回本类对象的静态方法有两种类型:有参数和无参数
— 有参数的可以返回指定主机名的InetAddress对象
— 无参数的返回本机InetAddress对象
③ InetAddress类对象代表主机IP地址:2013-1112-1918/169.254.186.231
05、网络通信之间的数据通信连接点
(1)数据通信连接点是网络服务的一种机制。
(2)网络通信主机两端都有数据通信连接点对象端点。
(3)实现网络通信,也就是实现数据通信连接点对象之间的通信,即在数据通信连接点对象之间使用IO流进行数据通信。
(4)UDP传输数据:
创建UDP传输的发送端。
① 建立udp的socket服务,使用DatagramSocket对象
② 将要发送的数据封装到数据包中。使用DatagramPacket讲数据封装
③ 通过udp的socket服务将数据包发送出去。send方法
④ 关闭socket服务。close方法
建立UDP接收端的思路。
① 建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
② 创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
③ 使用socket服务的receive方法将接收的数据存储到数据包中。
④ 通过数据包的方法解析数据包中的数据。
⑤ 关闭资源
06、多线程聊天案例
/*
这是UDP协议的练习。
需求:编写一个聊天程序。
利用到了多线程技术。
一个线程控制收,一个线程控制发。
*/
import java.io.*;
import java.net.*;
//发送端
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while ((line = br.readLine())!=null)
{
if ("886".equals(line))
break;
byte[] buf = line.getBytes();
InetAddress i = InetAddress.getByName("255.255.255.255");
DatagramPacket dp = new DatagramPacket(buf,0,buf.length,i,10004);
ds.send(dp);
}
ds.close();
}
catch (Exception e)
{
throw new RuntimeException("发送端失败");
}
}
}
//接收端
class Rece implements Runnable
{
private DatagramSocket ds;
public Rece(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while (true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"...."+data);
}
}
catch (Exception e)
{
throw new RuntimeException("接收端端失败");
}
}
}
class ChatByUdp
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receSocket = new DatagramSocket(10004);
//线程控制收发
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(receSocket)).start();
}
}
7、TCP中传输数据(Socket与ServerSocket)
(1)建立客户端与服务器端
(2)建立连接后,通过Socket中的IO流进行数据的传输
(3)关闭socket
注意:客户端需要与服务端建立连接,才可以通信,一旦连接建立好了,靠的是IO流进行通信。TCP中的IO流对象,是不可以创建的,流对象是通过Socket服务获取出来的,一但连接成功,在连接的通路,IO流已经建立好了。
实现:
——服务端
//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);
//获取连接过来的客户端对象。
Socket s = ss.accept();//阻塞式.
String ip = s.getInetAddress().getHostAddress();
//通过socket对象获取输入流,要读取客户端发来的数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
intlen = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
s.close();
ss.close();
——客户端
//创建客户端socket服务。
Socket socket = new Socket("192.168.1.100",10002);
//获取socket流中的输出流。
OutputStream out = socket.getOutputStream();
//使用输出流将指定的数据写出去。
out.write("tcp演示:我来了!".getBytes());
//关闭资源。
socket.close();