1.网络概况
通信协议通常由三个部分组成:一是语法部分,用于决定双方对话类型,二是语法部分用于决定对话方式,三是变化规则,决定通信双方的答应关系
2.IP地址和端口
IP地址是标识网络中唯一的通信实体,可以是主机,路由器等,而在基于ip协议网络传输的数据包,都必须使用ip地址来标识,IP地址是32位整数 通常是 192.168.56.2
端口是一个16位整数,用于表示数据信息由那个程序的服务器处理
3.Java提供的网络功能有四大类 1、InetAress 用于标识网络上的硬件资源
InetAress类代表IP地址,有两个子类:Inet4Address代表Ipv4,Inet6Adress代表Ipv6。InetAdress无构造器,提供如下两个静态方法来获取实例:
??? getByName(String host):根据主机获取相应的InetAddress对象。 ??? getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象。
public class test {
// InetAddress类
public static void main(String[] args) throws UnknownHostException {
//获取本机实例
InetAddress address= InetAddress.getLocalHost();
//获取计算机名字
System.out.println("本机计算机名字:"+address.getHostName());
//获取计算机ip地址
System.out.println("IP地址:"+address.getHostAddress());
byte[] bytes=address.getAddress();
System.out.println("字节数组形式:"+ Arrays.toString(bytes));
System.out.println(address);
//根据机器名或ip地址获取interaddress实例
InetAddress address1= InetAddress.getByName("LAPTOP-O9S9F7GC");
// InetAddress address1= InetAddress.getByName("192.168.0.147");
System.out.println("本机计算机名字:"+address1.getHostName());
System.out.println("IP地址:"+address1.getHostAddress());
}
}
//运行结果
本机计算机名字:LAPTOP-O9S9F7GC
IP地址:10.3.188.181
字节数组形式:[10, 3, -68, -75]
LAPTOP-O9S9F7GC/10.3.188.181
本机计算机名字:LAPTOP-O9S9F7GC
IP地址:10.3.188.181
2、URL 统一资源定位符 通过URL可以直接读取或写入 网络上的数据
在java.net包中定义了URL类,该类用来处理有关URL的内容。对于URL类的创建和使用,下面分别进行介绍。 java.net.URL提供了丰富的URL构建方式,并可以通过java.net.URL来获取资源。
3、Sockets 使用TCP 协议实现网络通信的Scoket相关的类
TCP,英文全称Transmission control protocol,直译为:传输控制协议。是一种面向连接,可靠的,基于字节流的传输层通信协议。它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
?创建服务器,启动线程
public class Server {
public static void main(String[] args) throws IOException {
Socket socket=null;
int count=0;
//1.创建一个服务器端的Socket,指定绑定的端口
ServerSocket serverSocket=new ServerSocket(8888);
System.out.println("服务器即将启动,等待客服端连接");
while (true){
socket =serverSocket.accept();//调用accept()方法开始监听等待客服端连接
SeverThread severThread=new SeverThread(socket);//创建线程
severThread.start();//启动线程
count++;
System.out.println("客服端的数量"+count);
InetAddress address=socket.getInetAddress();
System.out.println("客服端的IP地址:"+address);
System.out.println("本机计算机名字:"+address.getHostName());
}
}
}
//启动服务端
输出结果
服务器即将启动,等待客服端连接
//启动客服端后
输出结果
服务器即将启动,等待客服端连接
客服端的数量1
客服端的IP地址:/10.3.188.181
本机计算机名字:LAPTOP-O9S9F7GC
我是服务器,客服端说:用户名:TOM;密码:1234561
//服务器线程处理类
public class SeverThread extends Thread{
Socket socket=null;
InputStream is=null;
public SeverThread(Socket socket){
this.socket=socket;
}
//线程执行的操作,
public void run(){
//3.获取输入流,并读取客服端信息
try {//字节输出流
is = socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);//将字节流转换为字符流
BufferedReader br=new BufferedReader(isr);//输入流添加到缓冲区
String info=null;
while ((info=br.readLine())!=null)
{
System.out.println("我是服务器,客服端说:"+info);
}
} catch (IOException e) {
e.printStackTrace();
}
//4.获取输出流 响应客服端请求
try (OutputStream os = socket.getOutputStream()) {
PrintWriter pw = new PrintWriter(os);//将输出流包装为打印流
pw.write("你好ua");//
pw.flush(); //向服务器端发送信息
}//字节输出流
catch (IOException e) {
e.printStackTrace();
} }}
?创建客服端
public static void main(String[] args) throws IOException {
//1.创建客服端Socket ,指定服务器地址 端口
Socket socket=new Socket("LAPTOP-O9S9F7GC",8888);
//2.获取输出流,向服务器发送信息
OutputStream os=socket.getOutputStream();//字节输出流
PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
pw.write("用户名:TOM;密码:123456");//
pw.flush(); //向服务器端发送信息
//关闭输出流
socket.shutdownOutput();
//3.获取输入流,读取服务器的信息
InputStream is=socket.getInputStream();//字节输出流
InputStreamReader isr=new InputStreamReader(is);//将字节流转换为字符流
BufferedReader br=new BufferedReader(isr);//输入流添加到缓冲区
String info=null;
while ((info=br.readLine())!=null)
{
System.out.println("客服端,服务器说:"+info);
}
pw.close();
br.close();
is.close();
os.close();
socket.close();
}
//启动客服端之后,再启动服务端
输出结果
客服端,服务器说:你好ua
4、Datagram 使用UDP协议,将数据保存在数据报中,通过网络进行通信
UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使在今天UDP仍然不失为一项非常实用和可行的网络传输层协议。
udp创建客服端,服务端
public static void main(String[] args) throws IOException {
//1创建服务器端指定端口
DatagramSocket socket=new DatagramSocket(8800);
//2创建数据报,用于接收客服端发送的数据
byte[]date=new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet=new DatagramPacket(date, date.length);
//3接收客服端发送的数据
System.out.println("服务器以及启动等待客服端发送信");
socket.receive(packet);//此方法接收到数据报之前会一直阻塞
//4读取数据
String info=new String(date,0, packet.getLength());
System.out.println("我是服务器,客服端说:"+info);
/*
向客服端响应客服端数据
*/
//1.定义客服端地址,端口,数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] date2 = "欢迎你".getBytes();
//创建数据报
DatagramPacket packet2=new DatagramPacket(date2, date2.length,address,port);
//发送数据报
socket.send(packet2);
//关闭资源
socket.close();
}
//启动服务器
服务器以及启动等待客服端发送信
//启动客服端之后
我是服务器,客服端说:用户名:admin;密码123
?
public static void main(String[] args) throws IOException {
//1定一服务器的地址,端口号,数据
InetAddress address = InetAddress.getByName("LAPTOP-O9S9F7GC");
int port = 8800;
byte[] date = "用户名:admin;密码123".getBytes();
//2创建数据报,包含发送的数据信息
DatagramPacket packet=new DatagramPacket(date, date.length,address,port);
//3创建DatagramSocket对象
DatagramSocket socket=new DatagramSocket();
//4向服务器发送数据报
socket.send(packet);
//接收服务器响应
byte[]date2=new byte[1024];//创建字节数组,指定接收的数据包的大小
DatagramPacket packet2=new DatagramPacket(date2, date2.length);
//3接收客服端发送的数据
socket.receive(packet2);//此方法接收到数据报之前会一直阻塞
//4读取数据
String info1=new String(date2,0, packet2.getLength());
System.out.println("我是客服端,服务器说:"+info1);
}
//启动结果
我是客服端,服务器说:欢迎你
4.upd和tcp区别
- TCP基于连接,UDP是无连接的;
- 对系统资源的要求,TCP较多,UDP较少;
- UDP程序结构较简单;
- TCP是流模式,而UDP是数据报模式;
- TCP保证数据正确性,而UDP可能丢包;TCP保证数据顺序,而UDP不保证;
|