天天看点

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;   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; 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流来进行网络间的通信.

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

TCP编程 示例: 客户端: package com.czz.test03;   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;   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();    } }    

继续阅读