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:接收方和发送方地位是平等的,谁先运行都可以
正常情况下:先启动接收方,在启动发送方,数据正常传递
不正常情况:先启动发送方,而没有启动接收方,程序不会抛异常,但是数据发丢了。