java学习第25天--网络编程

InetAddress
此类用来表示互联网协议(IP)地址

常用方法:
String getHostName()
获取此IP地址对应的主机名
String getHostAddress()
返回IP地址的字符串表现形式

代码表示:
package com.czz.test09;
 
import java.net.InetAddress;
 
public class InetAddressDemo {
   public static void main(String[] args ) throws Exception {
      // 获取 InetAddress 对象
      InetAddress address = InetAddress. getByName ( " 丛中之 " );
//       InetAddress address = InetAddress.getByName("192.168.14.42");
 
      // 获取对应的主机名 , IP 地址
      String ip = address .getHostAddress();
      System. out .println( ip ); //192.168.14.21
      String hostName = address .getHostName();
      System. out .println( hostName );
      }
}
 
UDP编程
发送端:
User Datagram protocol: 用户数据报协议
使用的类是 DatagramSocket
发送端发送数据步骤:
1.创建DatagramSocket对象
2.创建数据包
3.发送数据
4.关闭Socket
代码示例:
package com.czz.test09;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
 
public class UdpSender {
   public static void main(String[] args ) throws Exception {
      // 创建 udp 协议发送端对象
      DatagramSocket sock = new DatagramSocket();
 
      // 创建数据报包
      byte [] buf = "hell world" .getBytes();
      int len = buf . length ;
      // 在给定主机名的情况下确定主机的 IP 地址
      InetAddress address = InetAddress. getByName ( "localhost" );
      int port = 3333;
 
      DatagramPacket pack = new DatagramPacket( buf , 0, len , address , port );
      // 调用 sock 的方法发送数据包
      sock .send( pack );
 
      // 释放资源
      sock .close();
   }
}
 
接收端
接收端接收数据步骤:
1.创建DatagramSocket对象
2.创建接收数据包
3.接收数据,做进一步的处理
4.关闭Socket
代码示例:
package com.czz.test09;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket ;
 
public class UdpReceiver {
 
   public static void main(String[] args ) throws Exception {
      // 创建 DatagramSocket 对象
      DatagramSocket sock = new DatagramSocket ( 3333 );
 
      // 创建数据报包
      byte [] buf = new byte [1024 * 64]; //64kb
      DatagramPacket pack = new DatagramPacket( buf , buf . length );
      // 接收数据到数据报包中
      sock .receive( pack );
 
      // 解析数据
      byte [] data = pack .getData();
      // 获取真实数据的长度
      int len = pack .getLength();
 
      System. out .println( new String( data , 0, len ));
 
      // 释放资源
      sock .close();
   }
}
 
UDP编程练习
发送端接收从键盘录入的数据,在接收端的控制台显示出来
  当键盘录入886时,发送端结束发送
  重点:接收端不能关闭,要一直等待发送端发送数据
  发送端对键盘录入数据也是一个循环判断的过程
发送端代码:
package com.czz.test02;
 
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
 
/*
 * 发送端发送数据步骤 :
   1. 创建 DatagramSocket 对象
   2. 创建数据包
   3. 发送数据
   4. 关闭 Socket
 */
public class UdpSender {
    public static void main(String[] args ) throws Exception {
      Scanner sc = new Scanner(System. in );
  
      // 创建 sock 对象
      DatagramSocket sock = new DatagramSocket();
     
      DatagramPacket pack ;
      InetAddress address = InetAddress. getByName ( " 丛中之 " );
      while ( true ) {
         String line = sc .next();
         if ( line .equals( "886" )) {
            break ;
         }
         byte [] buf = line .getBytes();
         pack = new DatagramPacket( buf , buf . length , address , 8888);
        
         // 发送数据
         sock .send( pack );
      }
     
      // 释放资源
      sock .close();
   }
}
 
接收端代码:
package com.czz.test02;
 
import java.net.DatagramPacket;
/*
 * 接收端接收数据步骤 :
   1. 创建 DatagramSocket 对象
   2. 创建接收数据包
   3. 接收数据 , 做进一步的处理
   4. 关闭 Socket
 */
import java.net.DatagramSocket;
 
public class UdpReceive {
 
   public static void main(String[] args ) throws Exception {
      // 创建 DatagramSocket 对象
      DatagramSocket sock = new DatagramSocket(8888);
 
      byte [] buf = new byte [1024 * 64];
      DatagramPacket pack = new DatagramPacket( buf , buf . length );
     
      while ( true ) {
         sock .receive( pack );
        
         // 解析数据包
         byte [] data = pack .getData();
         int length = pack .getLength();
         String address = pack .getAddress().getHostAddress();
         String hostName = pack .getAddress().getHostName();
        
         System. out .println( " 发送端 IP 地址 : " + address + " 发送端主机名 : " + hostName + " 发送数据 :" + new String( data ,0, length ));
      }
      }
}
 
Socket通信原理
广义上的Socket: 指网络上两个程序之间的通信(可能是TCP或UDP)
狭义上的Socket: 指的是TCP协议通信

 定义:
网络上进行双向通信的两个程序中的一个端点,是对本主机IP地址和端口号的一个封装.即:socket = IP + port

TCP 协议
是一种可靠的网络协议,俗称"三次握手协议".它在通信的两端各自简历一个socket,从而在通信的两端形成一个虚拟的网络连接,一旦建立网络连接,两端就可以进行通信了.
socket对象包含了主机和端口,并可以产生IO流来进行网络间的通信.

TCP编程
示例:
客户端:
package com.czz.test03;
 
/*
 * 客户端发送数据步骤 :
 * 1. 创建 socket 对象
 * 2. 使用 socket 对象创建输出流
 * 3. 向输出流中写入数据
 * 4. 释放资源
 */
import java.io.OutputStream;
import java.net.Socket;
 
public class Client {
 
   public static void main(String[] args ) throws Exception {
      // 创建 socket 对象
      Socket sock = new Socket( " 丛中之 " , 8888);
      // 使用 socket 创建输出流
      OutputStream out = sock .getOutputStream();
      // 向输出流中写入数据
      out .write( " 倪玲是美女吗 ?" .getBytes()); // 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
      // 释放资源
      out .close();
      sock .close();
   }
}
 
服务端:
package com.czz.test03;
 
/*
 * 服务端接收数据步骤 :
 * 1. 创建 serversocket 对象
 * 2. 使用 serversocket 对象接收客户端连接
 * 3. 获取输入流
 * 4. 从流中获取数据
 * 5. 释放资源
 */
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      // 创建 serversocket 对象
      ServerSocket ss = new ServerSocket(8888);
      // 接收客户端连接
      Socket sock = ss .accept();
      // 获取输入流
      InputStream in = sock .getInputStream();
      // 从流中获取数据
      byte [] buf = new byte [1024 * 5];
      int len = in .read( buf );
      System. out .println( new String( buf ,0, len ));
      // 释放资源
      in .close();
      sock .close();
      ss .close();
   }
}
 
练习:
从客户端键盘录入数据,显示在服务端控制台上

客户端:
package com.czz.test04;
 
/*
 * 从客户端键盘录入数据,显示在服务端控制台上
       键盘录入数据 , 需要自定义结束标记
 */
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
 
public class Client {
 
   public static void main(String[] args ) throws Exception {
      Scanner sc = new Scanner(System. in );
      // 创建 socket 对象
      Socket sock = new Socket( " 丛中之 " , 7777);
      // 使用 socket 创建输出流
      OutputStream out = sock .getOutputStream();
     
      while ( true ) {
         String line = sc .next(); // 阻塞式方法
         if ( line .equals( "886" )) {
            break ;
         }
         byte [] bs = line .getBytes();
         out .write( bs );
      }
      out .close();
      sock .close();
   }
}
 
服务端:
package com.czz.test04;
 
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      ServerSocket ss = new ServerSocket(7777);
     
      Socket sock = ss .accept();  // 阻塞式方法
      InputStream in = sock .getInputStream();
      byte [] b = new byte [1024];
      int len = 0;
     
      while (( len = in .read( b )) != -1) {
         System. out .println( new String( b ,0, len ));
      }
   }
}
 
从客户端键盘录入数据,显示在服务端控制台上(优化方案)
客户端:
package com.Socket;
 
/*
 * 从客户端键盘录入数据,显示在服务端控制台上
    键盘录入数据 , 需要自定义结束标记
   优化方案
 */
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
 
public class Client {
 
   public static void main(String[] args ) throws Exception {
      Scanner sc = new Scanner(System. in );
     
      // 创建 socket 对象
      Socket sock = new Socket( " 丛中之 " , 6666);
      // 使用 socket 对象创建输出流
      BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream()));
     
      while ( true ) {
         String line = sc .nextLine();
         if ( line .equals( "886" )) {
            break ;
         }
         bw .write( line );
         bw .newLine();
         bw .flush();
      }
      bw .close();
      sock .close();
   }
}
 
服务端:
package com.Socket;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      // 创建 serversocket 对象
      ServerSocket  ss = new ServerSocket(6666);
     
      Socket socket = ss .accept();
     
      BufferedReader br = new BufferedReader( new InputStreamReader( socket .getInputStream()));
     
      String line = null ;
      while (( line = br .readLine()) != null ) {
         System. out .println( line );
      }
   }
}
 
从客户端发送一个文本文件到服务端,保存在服务端文件中(实际上就是上传文件到服务器)
发送端:
package com.Socket2;
 
import java.io.BufferedReader ;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
 
public class Client {
 
   public static void main(String[] args ) throws Exception {
      Socket sock = new Socket( " 丛中之 " , 5555);
     
      BufferedReader br = new BufferedReader ( new FileReader( "czz.txt" ));
      BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream()));
     
      String line = null ;
      while (( line = br .readLine()) != null ){
         bw .write( line );
         bw .newLine();
         bw .flush();
      }
     
      br .close();
      bw .close();
      sock .close();
   }
}
 
服务端:
package com.Socket2;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      ServerSocket ss = new ServerSocket(5555);
      Socket socket = ss .accept();
     
      BufferedReader br = new BufferedReader( new InputStreamReader( socket .getInputStream()));
      BufferedWriter bw = new BufferedWriter( new FileWriter( "nl.txt" ));
     
      String line = null ;
      while (( line = br .readLine()) != null ) {
         bw .write( line );
         bw .newLine();
         bw .flush();
      }
     
      br .close();
      bw .close();
   }
}
 
在服务端接收完文件后,给客户端传递一个反馈信息:文件已成功接收
发送端:
package com.czz.test09;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
 
/*
 * 在服务端接收完文件后 , 给客户端传递一个反馈信息 : 文件已成功接收
 */
public class Client {
 
   public static void main(String[] args ) throws Exception {
      Socket sock = new Socket( " 丛中之 " , 8888);
      // 数据源
      BufferedReader br = new BufferedReader( new FileReader( "nl.txt" ));
      // 封装字符流
      BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream()));
      // 流对考
      String line = null ;
      while (( line = br .readLine()) != null ){
         bw .write( line );
         bw .newLine();
         bw .flush();
      }
      // 关闭输出流
      sock .shutdownOutput();
      // 接收来自服务端的反馈信息
      BufferedReader br2 = new BufferedReader( new InputStreamReader( sock .getInputStream()));
      String message = br2 .readLine();
      System. out .println( message );
      // 释放资源
      bw .close();
      br .close();
      sock .close();
   }
}
服务端:
package com.czz.test09;
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      ServerSocket ss = new ServerSocket(8888);
 
      Socket sock = ss . accept (); // 阻塞方法
 
      BufferedReader br = new BufferedReader( new InputStreamReader( sock .getInputStream()));
      BufferedWriter bw = new BufferedWriter( new FileWriter( "czz.txt" ));
 
      String line = null ;
      while (( line = br .readLine()) != null ) {
         bw .write( line );
         bw .newLine();
         bw .flush();
      }
     
      BufferedWriter bw2 = new BufferedWriter( new OutputStreamWriter( sock .getOutputStream()));
      bw2 .write( " 文件接收完毕 " );
      bw2 .close();
 
      br .close();
      bw .close();
      sock .close();
      ss .close();
   }
}
 
上传图片到服务端
发送端:
package com.czz.test10;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.net.Socket;
 
/*
 * 上传图片到服务端
 */
public class Client {
 
   public static void main(String[] args ) throws Exception {
      Socket sock = new Socket( " 丛中之 " , 8888);
      // 封装数据源
      BufferedInputStream bis = new BufferedInputStream( new FileInputStream( "E:\\ 图片 \\ 宝马 \\psb.jpg" ));
      // 封装目的地
      BufferedOutputStream bos = new BufferedOutputStream( sock .getOutputStream());
      // 流的对考
      int b = 0;
      while (( b = bis .read()) != -1){
         bos .write( b );
         bos .flush(); // 不刷新也可以 , 关闭 bos bis
      }
//    bos.close();
//    bis.close();
      sock .close();
   }
}
 
服务端:
package com.czz.test10;
 
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
   public static void main(String[] args ) throws Exception {
      ServerSocket ss = new ServerSocket(8888);
      Socket sock = ss .accept();
      // 封装数据源
      BufferedInputStream  bis = new BufferedInputStream( sock .getInputStream());
      // 封装目的地
      BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream( "E:\\ 图片 \\ 宝马 \\psb1.jpg" ));
      // 流的对考
      int b = 0;
      while (( b = bis .read()) != -1){
         bos .write( b );
      }
      // 释放资源
      bos .close();
      bis .close();
      sock .close();
      ss .close();
   }
}
 
 

猜你喜欢

转载自blog.csdn.net/czz1141979570/article/details/80199242