外观
网络编程
InetAddress类
InetAddress类是ip的包装类,InetAddress中提供了很多查找ip的方法。InetAddress类的构造方法不是公有的,不能通过new实例化。获取InetAddress对象的方法有以下几种。
InetAddress.getLocalHost():用于以本地ip初始化InetAddress类。InetAddress.getByName(Stringhost):以ip的名称初始化InetAddress类。
在获取InetAddress类后。调用这个对象的以下成员方法就可以获取和这个ip有关的信息。
getHostName():返回ip名称。getHostAddress():返回ip地址。getAllByName():返回所有IP地址。
package Inet;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class ClassIP {
//本文件演示如何使用ip的包装类InetAddress
public static void main(String[] args) throws UnknownHostException {
// InetAddress ip = new InetAddress(); //不能通过构造方法实例化
InetAddress ip1 = InetAddress.getLocalHost(); //此方法用于以本地ip初始化ip包装类
System.out.println(ip1);
InetAddress ip2 = InetAddress.getByName("www.baidu.com"); //以ip所在名称初始化
System.out.println("本机名称为:" + ip1.getHostName()); //getHostName()返回ip名称
System.out.println("百度ip地址为:" + ip2.getHostAddress()); //getHostAddress()返回ip地址
InetAddress[] ips = InetAddress.getAllByName("www.baidu.com"); //getAllByName()返回所有IP地址
for (InetAddress i : ips) {
System.out.println(i);
}
}
}运行结果:
Computer/10.122.159.254
本机名称为:Computer
百度ip地址为:220.181.38.149
www.baidu.com/220.181.38.149
www.baidu.com/220.181.38.150编写TCP程序
服务器
使用ServerSocket类实现TCP程序的服务器的步骤如下:
首先使用new ServerSocket(port)实例化ServerSocket类,其中port表示端口,为int值。使用此方法实例化套接字对象后,使用accept()方法等待用户端接入。此方法返回一个已经连接到客户端的Socket对象,之后对这个Socket对象进行操作就可以实现服务器和客户端之间的通信了。若要从客户端接收字符串,则只需要先获取服务器套接字的输入流,然后调用read(b)方法读取即可,其中b为缓冲区,读取的字节流会存入此缓冲区,此方法会返回成功读取的字节数,为int值。若要向客户端发送字符串,则只需要先获取服务器的输出流,然后调用输出流的write(b)方法即可,其中b为字节数组,对应要发送的字符串。
package Inet.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
//本文件演示使用TCP技术实现网络通信 此文件是服务器端 需配合同目录下的socket文件使用 此文件先运行
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(1100); //直接使用端口作为参数实例化
System.out.println("服务器创建成功 等待客户端接入...");
Socket socket = server.accept(); //使用服务器套接字的accept()方法等待客户端接入 此为1对1
System.out.println("客户端连接成功");
//服务器从客户端接收字符串 使用字节数组传输数据 所以不注释了
InputStream in = socket.getInputStream(); //先获取服务器套接字的输入流
byte[] b1 = new byte[1024];
int length = in.read(b1);
String content = new String(b1, 0, length);
System.out.println("接收到来自客户端的字符串:" + content);
//服务器向客户端发送字符串
String string = "你好 我是客户端";
byte[] b2 = string.getBytes();
OutputStream out = socket.getOutputStream(); //获取服务器套接字的输出流
out.write(b2);
}
}客户端
使用Socket类实现TCP程序的客户端的步骤如下:
首先使用new Socket(ip,port)实例化套接字对象,其中ip是一个InetAddress对象,关于InetAddress类请见上文;port表示端口,是一个int值,这里的ip应为服务器的ip,端口要和服务器的端口保持一致。然后操作这个套接字对象就可以和服务器进行通信。若要向服务器发送字符串,只需要先获取套接字的输出流,然后调用输出流对象的write(b)方法即可。若要从服务器接收字符串,只需要先获取套接字的输入流,然后调用输入流的read(b)方法即可。
package Inet.TCP;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class socket {
public static void main(String[] args) throws IOException {
//本文件演示如何使用TCP技术实现网络通信 此文件为客户端 需配合同包下的server文件使用 此文件后运行
//客户端
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 1100); //通过ip地址和端口实例化套接字对象 也可使用字符串作为ip地址当参数
System.out.println("服务器连接成功");
//客户端向服务器发送字符串
String string = "你好 我是服务器";
byte[] b1 = string.getBytes();
OutputStream out = socket.getOutputStream(); //获取套接字对象的输出流
out.write(b1);
//服务器从客户端接收字符串
InputStream in = socket.getInputStream(); //获取套接字的输入流
byte[] b2 = new byte[1024];
int length = in.read(b2);
String content = new String(b2, 0, length);
System.out.println("接收到来自服务器的字符串:" + content);
}
}运行结果:
服务器创建成功 等待客户端接入...
客户端连接成功
接收到来自客户端的字符串:你好 我是服务器
---
服务器连接成功
接收到来自服务器的字符串:你好 我是客户端编写UDP程序——使用数据报包套接字
数据报包套接字是DatagramSocket类,数据报包套接字让不同的终端通过数据报包进行UDP通信。使用此类实现通信程序时,需要实例化数据报包套接字,实例化数据报包对象,准备好缓冲区,然后使用数据报包套接字的发送方法和接收方法就可以进行通信了。
发送端(服务器)
使用DatagramSocket类实现发送端的步骤如下:
准备 首先使用new DatagramSocket()实例化数据报包套接字对象;将要发送的内容转换为字节数组;使用new DatagramPacket(buf, 0, buf.length, ip, port)实例化数据报包,其中buf为要发送的内容转换后的字节数组;0代表发送的起始位置,可以是其他值;第三个参数代表字节数组的长度,可以是其他值;ip代表数据报包发送的目标ip;port代表端口,并准备发送此数据报包。
发送 使用前面数据报包套接字的send(p)发送数据报包,其中p为之前创建的数据报包对象。
接收端(客户端)
使用DatagramSocket类编写接收端的步骤如下:
准备 首先使用new DatagramSocket(port,ip)实例化数据报包套接字对象,其中ip表示发送端的ip地址,port表示端口。创建一个字节数组作为缓冲区,然后使用new DatagramPacket(buf, 0, length, ip, port)实例化数据报包对象,其中buf为前面创建的字节数组;0代表起始位置,可换为其他参数;length代表缓冲区长度;ip代表发送端ip;port代表发送端端口,后两个参数可省略。
接收 使用上面创建的数据报包套接字对象的receive(p)方法接收数据报包,其中p为上面创建好的数据报包对象,该方法执行后p中将存储有关发送端发送数据的信息。使用p.getData()获取数据(字节数组,若要转换成字符串可以使用new String(p.getData(), 0, p.getLength()),使用p.getLength()获取数据的长度。
package Inet.UDP;
import java.io.IOException;
import java.net.*;
public class receive {
//此文件演示如何使用UDP技术实现网络通信 此文件使用单播数据套接字类 需配合同包下的server文件使用 此文件后运行
InetAddress ip;
int port = 1469;
DatagramSocket datagramSocket;
DatagramPacket datagramPacket;
receive() {
try {
ip = InetAddress.getByName("127.0.0.1");
datagramSocket = new DatagramSocket(port,ip);
byte[] buf = new byte[1024];
datagramPacket = new DatagramPacket(buf, 1024);
String content;
System.out.println("接收广播");
while (true) {
datagramSocket.receive(datagramPacket);
content = new String(datagramPacket.getData(), 0, datagramPacket.getLength());
System.out.println(content);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
} catch (UnknownHostException e) {
throw new RuntimeException(e);
} catch (SocketException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
new receive();
}
}package Inet.UDP;
import java.io.IOException;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class send {
//本文件演示如何使用UDP实现网络通信 模拟广播播放天气预报的场景 本文件使用单播数据套接字类 需配合同包下的socket文件使用 此文件先运行
String weather;
int port = 1469;
InetAddress ip;
DatagramSocket datagramSocket;
DatagramPacket datagramPacket;
send() {
try {
ip = InetAddress.getByName("127.0.0.1");
datagramSocket = new DatagramSocket();
byte[] buf;
System.out.println("开始发送广播");
while (true) {
weather = new SimpleDateFormat("HH:mm:ss").format(new Date()) + ": 天气晴";
buf = weather.getBytes();
datagramPacket = new DatagramPacket(buf, 0, buf.length, ip, port);
datagramSocket.send(datagramPacket);
System.out.println(weather);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
new send();
}
}编写UDP程序——使用多播数据套接字
使用多播数据套接字编写UDP程序的步骤大体如下:实例化多播数据套接字对象,加入广播组,然后在广播组中发送和接收数据即可。
使用MulticastSocket类编写UDP发送端的步骤如下:
首先使用new MulticastSocket(port)实例化多播数据套接字,其中port指端口,然后调用这个套接字对象的joinGroup(ip)加入广播ip。准备缓冲区,如命名为buff,长度由发送内容的大小决定。然后使用new DatagramPacket(buff, 0, buff.length, ip, port)实例化数据报包对象,其中buff为上面定义的缓冲区名称;0为缓冲区的起始位置;buff.length为缓冲区的长度;ip指目标ip;port为端口。最后调用send(p)方法发送数据包,其中p为已经打包好的数据包,使用receive(p)实现接收数据包,其中p为准备好的数据包,成功接收后p会存放数据。
一些关于TCP程序设计和UDP程序设计的小提示:在IP选择上,若使用ServerSocket类和Socket类编写TCP程序时,若交流双方都是本地计算机,那么IP为127.0.0.1;若使用多播数据报包套接字,那么IP要在224.0.0.0225.225.225.255之间。在端口的选择上,端口不能选择已被其他应用程序占用的端口,一般来说端口11024都已被系统进程占用,除此之外,电脑的应用程序也会占用一些端口,如MySQL占用3306端口。