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