网络编程概述
计算机网络:
把分布在不同地理区域的计算机与专门的外部设备,用通信线路互连成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。
网络编程的目的:
-
就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换
-
java.net 包中 J2SE 的 API 包含有类和接口,它们提供底层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
-
有人说,20世纪最伟大的发明不是计算机,而是计算机网络。
-
还有人说,如果你买了计算机而没有联网,就等于买了电话机而没有接电话线一样。
IP **地址:**InetAddress
唯一的标识 Internet 上的计算机
本地回环地址()127.0.0.1 ()localhost
InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address。
InetAddress 类对象含有一个 Internet 主机地址的域名和IP地址:www.baidu.com和 220.181.111.37
域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。 -------域名解析
方法
InetAddress.getByName*(“www.baidu.com**”);*
getHostAddress();
getHostName();
通讯要素:网络通信协议
网络通信协议
计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代码结构、 传输控制步骤、出错控制等制定标准。
通信协议分层的思想
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成一些简单的成份,再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调用下一层,而与再下一层不发生关系。各层互不影响,利于系统的开发和扩展。
TCP
使用TCP协议前,须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端
在连接中可进行大数据量的传输
传输完毕,需释放已建立的连接,效率低
在断开时要进行四次挥手
UDP概述
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,(系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达)。因此它是不可靠的!
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
package demo2;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
import java.util.Scanner;
/*
* 服务端
* */
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(1000);
Scanner s=new Scanner(System.in);
OutputStream out=null;
while (true){
byte[] by = new byte[1024]; //接受数组内容
DatagramPacket dp = new DatagramPacket(by,by.length);
ds.receive(dp);//接受
//获得数组
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
ds.send(dp);
}
}
}
package demo2;
import java.io.IOException;
import java.net.*;
/*
* 客户端
* */
public class Client {
public static void main(String[] args) throws IOException {
//发送
DatagramSocket ds = new DatagramSocket();
//数据包
while (true) {
byte[] by = "hello,baidu.com".getBytes();
DatagramPacket dp = new DatagramPacket(by, 0, by.length,
InetAddress.getByName("127.0.0.1"), 1000);
ds.send(dp);
ds.receive(dp);
String str = new String(dp.getData(),0,dp.getLength());
System.out.println(str+"--"+dp.getAddress());
}
//ds.close();
}
}