网络编程要素IP
InetAddress的使用 端口协议UDP通信程序
单播组播广播 TCP通信程序
网络编程要素常用 Socket ServerSocket DatagramSocket DatagramPacket
IP地址
设备在网络中的标识,是唯一的标识。
端口号
应用程序在设备中 的标识
协议
数据在网络中传输的规则,常见的协议有:UDP和TCP。
在网络通信中,不同计算机运行的程序,可以进行数据的传输。
IP InetAddress的使用为了方便对IP地址的获取和 *** 作,Java提供了一个类InetAddress供我们使用。
InetAddress: 此类表示Internet协议(IP协议)
static InetAddress getByName(String host) 确定主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址。 String getHostName() 获取此IP地址的主机名。 String getHostAddress() 返回文本显示中的IP地址字符串
private static void demo01() throws UnknownHostException { InetAddress address = InetAddress.getByName("192.168.0.106"); String hostName = address.getHostName(); String hostAddress = address.getHostAddress(); System.out.println("主机名:" + hostName); System.out.println("IP为:" + hostAddress); }端口
应用程序在设备中唯一的标识。
端口号范围:0-65536
0-1023用于知名的网络服务。我们使用1024以上的端口就可。
一个端口号只能供一个应用程序使用。
协议UDP:面向无连接,容易丢失,速度快,数据不安全。
TCP:面向连接。
UDP通信程序1. 创建一个socket DatagramSocket socket = new DatagramSocket(); //发送端可以直接创建一个socket,但是接收端的socket要指定用来接收的端口号, DatagramSocket socket = new DatagramSocket(10000); 2. 创建包裹 DatagramPacket packet = new DatagramPacket(byte[],length,address,port); 这里的参数要进行填写,如果是发送端的话 第一个参数是:发送数据 第二个参数是:数据长度 第三个参数是:服务器地址,通过InetAddress.getByName(Ip或计算机名获取。) 第四个参数是:服务器接收数据的端口号。 3. 接收或发送 send / receive 4. 服务端获取包裹数据 packet.getData(); 数据长度: packet.getLength();单播
private static void demo03() throws IOException { // client DatagramSocket socket = new DatagramSocket(); String data = "hello world"; InetAddress address = InetAddress.getByName("192.168.137.7"); byte[] messgae = data.getBytes(); DatagramPacket packet = new DatagramPacket(messgae, messgae.length, address, 10000); socket.send(packet); socket.close(); }
private static void demo02() throws IOException { //server DatagramSocket socket = new DatagramSocket(10000); byte[] bytes = new byte[1024]; DatagramPacket packet = new DatagramPacket(bytes, 1024); socket.receive(packet); byte[] data = packet.getData(); System.out.println(new String(data)); }组播
通过加入一个组,信息发向一个组。
组播地址:224.0.1.0
组播的服务端,要加入一个组中。并且不再使用DatagramSocket,而是使用MulticastSocket //服务端要首先声明端口号。 MulticastSocket socket = new MulticastSocket(10000); //提出声明,加入224.0.1.0组 socket.joinGroup(InetAddress.getByName("224.0.1.0"));
private static void demo05() throws IOException { // 组播的接收端 MulticastSocket socket = new MulticastSocket(10000); // 将该地址加入到组播地址224.0.1.0中 socket.joinGroup(InetAddress.getByName("224.0.1.0")); DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); socket.receive(packet); byte[] data = packet.getData(); System.out.println(new String(data)); } private static void demo04() throws IOException { // 组播的发送端 DatagramSocket socket = new DatagramSocket(); // 组播地址 InetAddress address = InetAddress.getByName("224.0.1.0"); String message = "你好,我是王小明"; byte[] bytes = message.getBytes(); DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, 10000); socket.send(packet); socket.close(); }广播
广播地址:255.255.255.255
也就是将数据发给能连接到的所有设备。
package day03; import java.io.IOException; import java.net.*; public class Client { // 发送端 public static void main(String[] args) throws IOException { // 广播 // 创建一个socket用来发送数据 DatagramSocket socket = new DatagramSocket(); // 获取广播地址 address 255.255.255.255 InetAddress address = InetAddress.getByName("255.255.255.255"); // 要发送的数据 String data = "Hello world"; byte[] message = data.getBytes(); // 打包数据,并发送 DatagramPacket packet = new DatagramPacket(message, message.length, address, 10000); socket.send(packet); socket.close(); } }
package day03; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class Server { public static void main(String[] args) throws IOException { // 接收端 DatagramSocket socket = new DatagramSocket(10000); // 创建一个盒子用来接收数据, DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); // 开始接收 socket.receive(packet); // 获取盒子中的数据 byte[] data = packet.getData(); // 打印数据 System.out.println(new String(data)); } }TCP通信程序
private static void demo07() throws Exception { // TCP 服务端 ServerSocket socket = new ServerSocket(10000); // 服务端使用ServerSocket,并且绑定端口,然后通过accpet来接收 Socket accept = socket.accept(); // 返回一个Socket对象 InputStream inputStream = accept.getInputStream(); // 通过该Socket对象获得一个输入流,读取数据、 int i = 0; while ((i = inputStream.read()) != -1) { System.out.print((char) i); } inputStream.close(); accept.close(); socket.close(); } private static void demo06() throws IOException { // TCP连接,客户端 // 客户端确认要进行通信的地址和端口,获取字节输出流,写出数据 Socket socket = new Socket("192.168.137.7", 10000); OutputStream outputStream = socket.getOutputStream(); outputStream.write("what are you doing?".getBytes()); outputStream.close(); socket.close(); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)