计算机网络
127.0.0.1
IP :互联网协议地址 ipv4和ipv6 设备在网络中的唯一表示
DNS把域名解析为了IP
IPv4 4字节 点分十进制
IPv6 16字节 八组 冒分十六进制 去头0,0位压缩
端口号: 找到设备中软件的标识 两个字节表示的整数 0~65535
协议 :计算机网络中,连接和通信的规则被称为计算机网络通信
InetAddress 类使用
1 2 3 4 | //通过主机名获取主机对象 InetAddress inetAddress= InetAddress.getByName( "DESKTOP-4MKNLPK" ); System.out.println( "主机名为" +inetAddress.getHostName()); System.out.println( "IP为" +inetAddress.getHostAddress()); |
1 允许部分数据丢失,使用UDP(用户数据报)协议 无连接
发送数据 (单播)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Client { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); //找码头 数据报 套接字 DatagramSocket datagramSocket= new DatagramSocket(); //数据报 封装 String string=scanner.next(); byte [] bytes=string.getBytes(); InetAddress inetAddress=InetAddress.getByName( "127.0.0.1" ); int port= 10086 ; DatagramPacket datagramPacket= new DatagramPacket(bytes,bytes.length,inetAddress,port); //发送数据 datagramSocket.send(datagramPacket); System.out.println( "发送成功" ); //释放资源 datagramSocket.close(); } } |
接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | public class Server { public static void main(String[] args) throws IOException { //找码头 数据报套接字 DatagramSocket datagramSocket= new DatagramSocket( 10086 ); //装数据报箱子 byte [] bytes= new byte [ 1204 ]; DatagramPacket datagramPacket= new DatagramPacket(bytes,bytes.length); //接受数据 System.out.println( "接受数据" ); datagramSocket.receive(datagramPacket); System.out.println( "接收成功" ); //获取箱子中的数据 String string= new String(datagramPacket.getData()); System.out.println(string); //释放资源 datagramSocket.close(); } } |
UDP(组播)
MulticastSocket ms=new MulticastSocket(port)//接收端
//把当前计算机绑定一个人组播地址
//组播地址 224.0.0.1~239.255.255.255 组播的预留地址为 224.0.0.1~224.0.0.255
发送数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class Client { public static void main(String[] args) throws IOException { //套接字 Scanner scanner = new Scanner(System.in); DatagramSocket datagramSocket= new DatagramSocket(); //装 数据报的箱子 String string=scanner.next(); byte [] bytes=string.getBytes(); InetAddress inetAddress=InetAddress.getByName( "224.0.0.15" ); int port= 14752 ; DatagramPacket datagramPacket= new DatagramPacket(bytes,bytes.length,inetAddress,port); //发送数据 datagramSocket.send(datagramPacket); System.out.println( "发送成功" ); //释放资源 datagramSocket.close(); } } |
接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public class Server { public static void main(String[] args) throws IOException { //创建 广播套接字对象 MulticastSocket multicastSocket= new MulticastSocket( 14752 ); //创建数据报报对象 byte [] arr= new byte [ 1024 ]; DatagramPacket datagramPacket= new DatagramPacket(arr,arr.length); //加入组播组 multicastSocket.joinGroup(InetAddress.getByName( "224.0.0.15" )); multicastSocket.receive(datagramPacket); String s= new String(datagramPacket.getData()); System.out.println(s); //释放资源 multicastSocket.close(); } } |
UDP (广播)
广播 InetAddressdd255.255.255.255
2 不允许任何数据丢失,是同TCP(传输控制协议)协议 面向连接
发送端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /* //套接字 两台机器间通信的端点 Scoket sk=new Socket(host,port); //获取IO流开始写写数据 OutputStream os=socket.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter osw=new OutputStreamWriter(os); BufferedWriter bw=new BufferedWriter(osw); */ public class SocketClient { public static void main(String[] args) throws IOException { //创建套接字对象 Socket socket= new Socket( "192.168.11.61" , 10000 ); //创建字节输出流对象 OutputStream outputStream=socket.getOutputStream(); //字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter= new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter= new BufferedWriter(outputStreamWriter); bufferedWriter.write( "带骨头的狗" ); bufferedWriter.newLine(); bufferedWriter.close(); //释放资源 socket.close(); } } |
接收数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | //客户端连接服务器三次握手 //在最后一步断开链接,通过四次挥手协议保证连接终止 public class Server { public static void main(String[] args) throws IOException { //创建服务器端的套接字对象 ServerSocket socket= new ServerSocket( 10000 ); //监听客户端连接 阻塞方法 Socket accept=socket.accept(); //创建字节输入流对象,接受 InputStream inputStream=accept.getInputStream(); //字节输入流转换成字符输入流 InputStreamReader inputStreamReader= new InputStreamReader(inputStream); BufferedReader bufferedReader= new BufferedReader(inputStreamReader); //readLine阻塞方法,传输的数据报中没有结束符标记 System.out.println(bufferedReader.readLine()); //在关IO流的时候,多了一个往服务器理写结束标记的动作 bufferedReader.close(); socket.close(); } } |
三次握手 粗浅理解,不是计算机网络
四次挥手 粗浅理解
数据交互小练习
客户端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class Client01 { public static void main(String[] args) throws IOException { //创建套接字对象 Socket socket= new Socket( "127.0.0.1" , 10086 ); //创建字节输出流输出到套接字对象中 OutputStream outputStream=socket.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter= new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter= new BufferedWriter(outputStreamWriter); bufferedWriter.write( "大白鹅" ); bufferedWriter.newLine(); bufferedWriter.flush(); socket.shutdownOutput(); //接受服务器的回复 InputStream inputStream=socket.getInputStream(); //字节输入流转换为字符数入流 InputStreamReader inputStreamReader= new InputStreamReader(inputStream); BufferedReader bufferedReader= new BufferedReader(inputStreamReader); System.out.println(bufferedReader.readLine()); bufferedWriter.close(); bufferedReader.close(); socket.close(); } } |
服务器端
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | public class Server { public static void main(String[] args) throws IOException { //创建服务器端 套接字对象 ServerSocket serverSocket= new ServerSocket( 10086 ); // 创建连接 阻塞任务 Socket accept=serverSocket.accept(); //创建字节输入流 InputStream inputStream=accept.getInputStream(); //字节输入流转换为字符数入流 InputStreamReader inputStreamReader= new InputStreamReader(inputStream); BufferedReader bufferedReader= new BufferedReader(inputStreamReader); System.out.println(bufferedReader.readLine()); //回复客户端 OutputStream outputStream=accept.getOutputStream(); //将字节输出流转换为字符输出流 OutputStreamWriter outputStreamWriter= new OutputStreamWriter(outputStream); BufferedWriter bufferedWriter= new BufferedWriter(outputStreamWriter); bufferedWriter.write( "难道你就是传说中的大白鹅" ); bufferedWriter.close(); bufferedReader.close(); accept.close(); } } |
文件里的数据交互小练习
优化 服务端
文件名随机且唯一(有很小小小的几率重复) UUID
reandomUUID()
toString().replace()
改为多线程
加线程池
类 InetAddress
ipconfig 查看本机IP地址
私有构造 成员方法
1 2 3 4 5 6 7 8 9 10 11 12 | public class MyInetAddress { public static void main(String[] args) throws UnknownHostException { //通过ip获取主机对象 InetAddress inetAddress= InetAddress.getByName( "192.168.56.1" ); System.out.println( "主机名为" +inetAddress.getHostName()); System.out.println( "IP为" +inetAddress.getHostAddress()); /*byte[] arr="192.168.56.1".getBytes(); InetAddress inetAddress=InetAddress.getByAddress(arr); System.out.println(inetAddress.getHostName());*/ } } |