一、网络通信要完成两个要求
1.如果准确找到对方
通过IP地址和端口号来定位到唯一的一台计算机和对应程序
2.如果实现高效的数据传输
传输数据要遵循规则:
1)OSI参考模型
2)TCP/IP参考模型
OSI参考模型过于理想化,TCP/IP协议简化了OSI的应用、表示、会话层为应用层,因此成为了当前主流的网络传输参考模型。
二、Java实现互联网通信
要实现Java程序与互联网上的某台计算机上的某个程序进行通信,不仅要知道这个程序所在计算机的IP地址,还必修知道这个程序在计算机内的端口号。
1.IP地址
在Java中使用InetAddress类来表示IP,常用获得InetAddress对象的方法是getByName():
//获得知道主机的IP地址
InetAddress ip = InetAddress.getByName("www.taobao.com");
2.使用TCP网络通信协议进行编程
TCP协议的理解
- 使用TCP协议钱,虚先简历TCP连接,形成数据传输通道
- 传输前,采用“三次握手”方式,是可靠的
- TCP协议进行通信的两个应用程序:客户端、服务端
- 在连接中可进行大连数据的传输
- 传输完毕后需要释放已建立的链接,效率低
代码示例:
客户端
//创建Socket对象
Scoket socket = new Scoket(InetAddress,getByName("localhost"),9096);
//通过Socket获得输出流
OutputStream os = socket.getOutputStream();
//写数据
os.write("我是客户端".getBytes());
//关闭输出流
socket.shutdownOutput();
//获得输入流
InputStream is = socket.getInputStream();
//读数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while((b=is.read())!=-1){
baos.write(b);
}
System.out.print("服务器说"+baos.toString());
//关闭资源
is.clos();
os.close();
socket.close();
服务端
//创建服务端对象
ServerSocket ss = new ServerSocket(9096);
Socket socket = ss.accept();//获得客户端对象
InputStream is = socket.getInputStream();
//读取客户端发送的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while((b=is.read())!=-1){
baos.write(b);
}
System.out.print("客户端说"+baos.toString());
//此时服务端读取数据已完成,接下来是向客户端写数据
socket.shutdownInputStream() //写数据钱先关闭服务端的输入流;
OutputStream os = socket.getOutputStream();
os.write("已收到你的数据".getBytes());
//关闭资源
is.clos();
os.close();
socket.close();
ss.close();
3.使用UDP协议实现网络编程
- 将数据、源。目的封装成数据包,不需要建立连接,因无需连接所以是不可靠的
- 每个数据包的大小限制在64K内
- 发送数据结束时无需释放资源,速度快
代码示例
发送方
//1.客户端的”码头“:就是能够使用upd协议发送数据报的对象
DatagramSocket ds = new DatagramSocket();
//2.需要有数据报
byte[] message = "sos!".getBytes();//2.1 数据源
//2.2将message打包生成一个数据报对象,该对象包含了发送目标地址(IP:localhost,端口号:9090)
DatagramPacket dp = new DatagramPacket(message,message.length,
InetAddress.getByName("localhost"), 9090);
ds.send(dp); //3.发送数据报
接收端代码
//1.创建码头
DatagramSocket ds = new DatagramSocket(9090);
//2.接收数据报
byte[] buf = new byte[8192];//buf缓冲区用来装接收到的数据报的数据的
DatagramPacket dp= new DatagramPacket(buf, buf.length);
ds.receive(dp);//接收数据报
byte[] bs = p.getData(); 用数组bs接收数据报对象中的数据
//转换得到的数据并输出
String str = new String(bs,0,length);
System.out.println(str);
4.通过URL来访问程序
//1.连接到服务器的java程序,需要通过URL来找到该程序
//http://localhost:8080/Day23_szl/servlet/helloServlet
URL url = new URL("http://localhost:8080/testURL/servlet/helloServlet");
//2.通过调用url.openConnection()得到一个URLConnection对象,该对象是用于连接
URLConnection openConnection = url.openConnection();
//3.将URLConnection强转成HttpURLConnection对象,用于获得更多的方法
HttpURLConnection huc = (HttpURLConnection) openConnection;
//4.发送请求并得到响应结果
/*
* 响应码:
* 200 访问成功
* 3XX 重定向
* 4XX 资源不存在
* 5XX 服务器挂了
*/
int responseCode = huc.getResponseCode();
if(responseCode==200){//访问成功
InputStream is = huc.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=0;
while((i = is.read())!=-1){
baos.write(i);
}
System.out.println(baos);
}else{
System.out.println("访问失败!");
}