InetAddress
import java.net.InetAddress;import java.net.UnknownHostException;/* * ?表示互联网中的IP地址 * ???java.net.InetAddress * ?静态方法 * ???static InetAddress ?getLocalHost() ??LocalHost本地主机 * ???返回本地主机,返回值InetAddress对象 * ????* ???static InetAddress getByName(String hostName)传递主机名,获取IP地址对象 * ????* ?非静态方法 * ????String getHoustAddress()获取主机IP地址 * ????String getHoustName()获取主机名 * ????*/public class InetAddressDemo { ???public static void main(String[] args)throws UnknownHostException { ???????function_1(); ???} ???/* ????* static InetAddress getByName(String hostName)传递主机名,获取IP地址对象 ????*/ ???public static void function_1()throws UnknownHostException { ???????InetAddress inet = InetAddress.getByName("www.baidu.com"); ???????System.out.println(inet); ???} ???????/* ????* ?static InetAddress ?getLocalHost() ??LocalHost本地主机 ????*/ ???public static void function() throws UnknownHostException{ ???????InetAddress inet = InetAddress.getLocalHost(); ???????//输出结果就是主机名,和 IP地址 ???????System.out.println(inet.toString()); ???????????????String ip = inet.getHostAddress(); ???????String name = inet.getHostName(); ???????System.out.println(ip+" ??"+name); ???????????????/*String host = inet.toString(); ???????String[] str = host.split("/"); ???????for(String s : str){ ???????????System.out.println(s); ???????}*/ ???}}
UDP发送端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * ?实现UDP协议的发送端: * ???实现封装数据的类 java.net.DatagramPacket ?将你的数据包装 * ???实现数据传输的类 java.net.DatagramSocket ?将数据包发出去 * ????* ?实现步骤: * ???1. 创建DatagramPacket对象,封装数据, 接收的地址和端口 * ???2. 创建DatagramSocket * ???3. 调用DatagramSocket类方法send,发送数据包 * ???4. 关闭资源 * ????* ???DatagramPacket构造方法: * ?????DatagramPacket(byte[] buf, int length, InetAddress address, int port) ?* ??????* ???DatagramSocket构造方法: * ?????DatagramSocket()空参数 * ?????方法: send(DatagramPacket d) * ??????*/public class UDPSend { ???public static void main(String[] args) throws IOException{ ???????//创建数据包对象,封装要发送的数据,接收端IP,端口 ???????byte[] date = "你好UDP".getBytes(); ???????//创建InetAddress对象,封装自己的IP地址 ???????InetAddress inet = InetAddress.getByName("127.0.0.1"); ???????DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000); ???????//创建DatagramSocket对象,数据包的发送和接收对象 ???????DatagramSocket ds = new DatagramSocket(); ???????//调用ds对象的方法send,发送数据包 ???????ds.send(dp); ???????//关闭资源 ???????ds.close(); ???}}
UDP接收端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;/* * ?实现UDP接收端 * ???实现封装数据包 java.net.DatagramPacket 将数据接包 * ???实现输出传输 ????java.net.DatagramSocket 接收数据包 * ????* ?实现步骤: * ????1. 创建DatagramSocket对象,绑定端口号 * ????????要和发送端端口号一致 * ????2. 创建字节数组,接收发来的数据 * ????3. 创建数据包对象DatagramPacket * ????4. 调用DatagramSocket对象方法 * ???????receive(DatagramPacket dp)接收数据,数据放在数据包中 * ????5. 拆包 * ?????????发送的IP地址 * ???????????数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象 * ???????????返回值是InetAddress对象 * ?????????接收到的字节个数 * ???????????数据包对象DatagramPacket方法 getLength() * ?????????发送方的端口号 * ???????????数据包对象DatagramPacket方法 getPort()发送端口 * ????6. 关闭资源 */public class UDPReceive { ???public static void main(String[] args)throws IOException { ???????//创建数据包传输对象DatagramSocket 绑定端口号 ???????DatagramSocket ds = new DatagramSocket(6000); ???????//创建字节数组 ???????byte[] data = new byte[1024]; ???????//创建数据包对象,传递字节数组 ???????DatagramPacket dp = new DatagramPacket(data, data.length); ???????//调用ds对象的方法receive传递数据包 ???????ds.receive(dp); ???????????????//获取发送端的IP地址对象 ???????String ip=dp.getAddress().getHostAddress(); ???????????????//获取发送的端口号 ???????int port = dp.getPort(); ???????????????//获取接收到的字节个数 ???????int length = dp.getLength(); ???????System.out.println(new String(data,0,length)+"..."+ip+":"+port); ???????ds.close(); ???}}
拓展:用UDP实现键盘输入的聊天
UDP发送端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;/* * 实现UDP发送,键盘输入的形式 * 输入完毕,发送给接收端 ??????*/public class UDPSend { ???public static void main(String[] args) throws IOException{ ???????Scanner sc = new Scanner(System.in); ???????DatagramSocket ds = new DatagramSocket(); ???????InetAddress inet = InetAddress.getByName("127.0.0.1"); ???????while(true){ ???????String message = sc.nextLine(); ???????/*if("886".equals(message)){ ???????????break; ???????}*/ ???????byte[] date = message.getBytes(); ???????DatagramPacket dp = new DatagramPacket(date, date.length, inet,6000); ???????ds.send(dp); ???????} ???// ???ds.close(); ???}}
UDP接收端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;/* * ?实现UDP接收端 * ?永不停歇的接收端 */public class UDPReceive { ???public static void main(String[] args)throws IOException { ???????//创建数据包传输对象DatagramSocket 绑定端口号 ???????DatagramSocket ds = new DatagramSocket(6000); ???????//创建字节数组 ???????byte[] data = new byte[1024]; ???????//创建数据包对象,传递字节数组 ???????while(true){ ???????DatagramPacket dp = new DatagramPacket(data, data.length); ???????//调用ds对象的方法receive传递数据包 ???????ds.receive(dp); ???????????????//获取发送端的IP地址对象 ???????String ip=dp.getAddress().getHostAddress(); ???????????????//获取发送的端口号 ???????int port = dp.getPort(); ???????????????//获取接收到的字节个数 ???????int length = dp.getLength(); ???????System.out.println(new String(data,0,length)+"..."+ip+":"+port); ???????} ???????//ds.close(); ???}}
TCP客户端(发送端)
import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/* * ?实现TCP客户端,连接到服务器 * ?和服务器实现数据交换 * ?实现TCP客户端程序的类 java.net.Socket * ??* ?构造方法: * ?????Socket(String host, int port) ?传递服务器IP和端口号 * ?????注意:构造方法只要运行,就会和服务器进行连接,连接失败,抛出异常 * ??????* ???OutputStream ?getOutputStream() 返回套接字的输出流 * ?????作用: 将数据输出,输出到服务器 * ??????* ???InputStream getInputStream() 返回套接字的输入流 * ?????作用: 从服务器端读取数据 * ??????* ???客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new流,不行 */public class TCPClient { ???public static void main(String[] args)throws IOException { ???????//创建Socket对象,连接服务器 ???????Socket socket = new Socket("127.0.0.1", 8888); ???????//通过客户端的套接字对象Socket方法,获取字节输出流,将数据写向服务器 ???????OutputStream out = socket.getOutputStream(); ???????out.write("服务器OK".getBytes()); ???????????????//读取服务器发回的数据,使用socket套接字对象中的字节输入流 ???????InputStream in = socket.getInputStream(); ???????byte[] data = new byte[1024]; ???????int len = in.read(data); ???????System.out.println(new String(data,0,len)); ???????????????socket.close(); ???}}
TCP服务器(接收端)
package cn.itcast.demo3;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;/* * ?实现TCP服务器程序 * ?表示服务器程序的类 java.net.ServerSocket * ?构造方法: * ???ServerSocket(int port) 传递端口号 * ??* ?很重要的事情: 必须要获得客户端的套接字对象Socket * ???Socket ?accept() */public class TCPServer { ???public static void main(String[] args) throws IOException{ ???????ServerSocket server = new ServerSocket(8888); ???????//调用服务器套接字对象中的方法accept() 获取客户端套接字对象 ???????Socket socket = server.accept(); ???????//通过客户端套接字对象,socket获取字节输入流,读取的是客户端发送来的数据 ???????InputStream in = socket.getInputStream(); ???????byte[] data = new byte[1024]; ???????int len = in.read(data); ???????System.out.println(new String(data,0,len)); ???????????????//服务器向客户端回数据,字节输出流,通过客户端套接字对象获取字节输出流 ???????OutputStream out = socket.getOutputStream(); ???????out.write("收到,谢谢".getBytes()); ???????????????socket.close(); ???????server.close(); ???}}
【网络编程】InetAddress、TCP、UDP
原文地址:https://www.cnblogs.com/a888/p/8481602.html