1.网络编程的三要素

(1)协议(TCP/UDP)

UDP:不安全,数据包容易丢失,但是效率高,因为只需要将包发送出去即可,是基于“数据包、”;

TCP:安全,不丢数据,但是占用资源多,效率低,基于字节流的;

(2)IP地址(唯一标识网络中的一台计算机)

IPv4:十进制点分制192.168.1.110;

IPv6:十六进制,使用“:”分隔;

(3)端口号:(一个虚拟的概念,实际上是使用一串十进制的整数表示,标识计算机中的唯一一个应用程序)例子:mysql的端口号是3306,oracel的端口号是1521 相当于我们现实生活中的门牌号

IP地址对应的java类是InetAddress,位于java.net包中

1 package com.ooxx.next;
 2 import java.net.InetAddress;
 3 import java.net.UnknownHostException;
 4 public class TestInetAddress {
 5     public static void main(String[] args) throws UnknownHostException {
 6         //(1)获取InetAddress对象
 7       //  InetAddress inetAddress=InetAddress.getByName("PC-20181218YOBC");
 8         //  InetAddress inetAddress=InetAddress.getByName("192.168.55.230");
 9         InetAddress inetAddress=InetAddress.getByName("DESKTOP-61VEEUD");
10         System.out.println(inetAddress);//主机名称/主机IP地址
11         System.out.println("主机名称:"+inetAddress.getHostName());
12         System.out.println("主机IP地址:"+inetAddress.getHostAddress());
13         
14     }
15 }

2.TCP编程

又称为Socket编程,采用C/S结构的应用程序  C--》Client客户端   S-->Server服务器端

客户端:发送数据  -—>接收服务器端的响应结果

1 import java.io.DataInputStream;
 2 import java.io.DataOutputStream;
 3 import java.io.IOException;
 4 import java.net.Socket;
 5 public class Clinet { //客户端应用程序
 6     public static void main(String[] args) throws IOException {
 7         //(1)Socket
 8         Socket client=new Socket("192.168.55.241",9999);
 9         //(2)使用数据流发送 (找目的地,网络)client.getOutputStream()的结果为OutputStream
10         DataOutputStream dataOutputStream=new DataOutputStream(client.getOutputStream());
11         dataOutputStream.writeUTF("亲,在吗?");
12         //(3)收数据
13         DataInputStream dataInputStream=new DataInputStream(client.getInputStream());
14         System.out.println(dataInputStream.readUTF());
15         //(3)关闭
16         client.close();
17     }
18 }

 

服务器端--》接收数据并回复客户数据

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server { //服务器端应用程序
        public static void main(String[] args)throws IOException {
                System.out.println("服务器已 开启----------------");
                //(1)ServerSocket
                ServerSocket server=new ServerSocket(9999);
                //(2)等着你 (监听)
                Socket socket=server.accept();
                //(3)收数据
                DataInputStream dis=new DataInputStream(socket.getInputStream());
                System.out.println(dis.readUTF());
                
                //(4)回复
                DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
                dos.writeUTF("在呢,啥事儿?");
                //(4)关闭
                socket.close();
                server.close();
                
        }
}

C/S结构的程序的特征,启动有先后,一定先启动服务器,服务器处于监听状态,等待客户端的连接,一旦建立起来连接,服务端和客户端的地位平等,谁先发送信息都可以,原则上是客户端先发送请求,然后服务端根据请求信息返回相应的“响应”;

UDP:面向无连接的,不靠的,传输层协议

基于数据包的

UDP:称为接收方和发送方

DatagramSocket:用于接收和发送“数据报”

  接收:receive(DatagramPacket p)

  发送:send(DatagramPacket p)

DatagramPacket:数据报

接收数据报:DatagramPacket(byte[] buf,int length)

发送数据报:DatagramPacket(byte[] buf,int length,InetAddress address,int port)

UDP:发送方

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class Sender { //发送
        public static void main(String[] args)throws Exception {
                DatagramSocket ds=new DatagramSocket(8888);//本应用程序Sender的端口
                byte [] buf="helloworld".getBytes();
                //对数据进行打包       由8888发送到9999
                DatagramPacket dp=new DatagramPacket(buf, buf.length,
                                InetAddress.getByName("192.168.55.241"), 9999);
                //发送
                ds.send(dp);
                ds.close();
        }
}

UDP:接收方

import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receiver {//接收方
    public static void main(String[] args) throws  Exception{
        DatagramSocket datagramSocket=new DatagramSocket(9999);//代表本应用程序的端口
        byte []buf=new byte[1024];//准备数据,用于存储接收过来的数据
        DatagramPacket datagramPacket=new DatagramPacket(buf,buf.length);
        //开始接收
        datagramSocket.receive(datagramPacket);
        //将接收到的数的数据进行显示
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        datagramSocket.close();
    }
}

UDP:接收方和发送方地位是平等的,谁先运行都可以

正常情况下:先启动接收方,在启动发送方,数据正常传递

不正常情况:先启动发送方,而没有启动接收方,程序不会抛异常,但是数据发丢了。