网络编程要素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();
}



