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