一、网络编程基础
1.在Java中,可以通过InetAddress类的静态方法getLocalHost()来获取本地主机的IP地址
实现代码如下:
try {
//获取本地主机的网络地址(InetAddress对象)
InetAddress netAddr=InetAddress.getLocalHost();
System.out.println(netAddr);
//获取指定域名主机的网络地址(InetAddress对象)
InetAddress[] netAddrArray=InetAddress.getAllByName("www.taobao.com");
for(InetAddress netAddr2:netAddrArray) {
System.out.println("主机名称:"+netAddr2.getHostName());
System.out.println("主机IP地址:"+netAddr2.getHostAddress());
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2.在Java中,如果需要测试网络是否通畅,可以使用Runtime对象的exec()执行ping命令
实现代码如下:
try {
//获取当前应用程序的“运行时”
Runtime rt=Runtime.getRuntime();
//调用exec()方法,向操作系统发送要执行的命令
Process process=rt.exec("ping 192.168.199.xxx");
//通过process进程对象的输入流,"读取"执行结果
InputStream in=process.getInputStream() ;
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
String line=null;
while((line=reader.readLine())!=null) {
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
3.如果想检查主机与目标主机之间的网络是否通畅,可以使用ping命令来测试,请求超时代表网络不通畅,有正常答复响应代表网络通畅。在Windows操作系统中,可以通过ipconfig命令查看本地主机的IP地址。
二、TCP编程
1.编写服务器端程序
Java标准库提供了ServerSocket来实现对指定IP和指定端口的监听。
(1).服务端首先启动,等待客户连接
(2).创建服务端Socket对象,监听1011端口
(3).服务端启动,并进入"等待状态"(等待某一个客户端的连接),当如果没有客户端连接时,accept()处于等待阻塞状态;如果发现客户端连接时,accept()返回当前正在连接的客户端Socket
(4).服务端读取来自客户端的一条信息
实现代码如下:
public class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket=new ServerSocket(1011);){
while(true) {
Socket clientSocket=serverSocket.accept();
InetAddress clientNetAddress=clientSocket.getInetAddress();
System.out.printf("客户端%s正在连接服务器~~",clientNetAddress.getHostAddress());
BufferedReader reader=new BufferedReader(new InputStreamReader(clientSocket.getInputStream(),"utf-8"));
String message=reader.readLine();
System.out.printf("客户端%s说:%s\n",clientNetAddress.getHostAddress(),message);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.编写客户端程序
(1).客户端:在服务器启动后,向服务端发送一个连接的请求
(2).创建客户端Socket对象,连接指定IP和端口
(3).连接成功后就可以向服务端发送信息了
实现代码如下:
public class Client {
public static void main(String[] args) {
try(Socket clientSocket=new Socket("192.168.199.xxx",1011)) {
//客户端向服务端发送一条信息(输出流)
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
//写入缓冲区(内存)
writer.write("我中午吃大米饭!!");
//清空缓冲区,发送至网络
writer.flush();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
当Socket流连接创建成功后,无论是服务器端还是客户端,我们都使用Socket实例进行网络通信。因为TCP是一种基于流的协议,因此,Java标准库使用InputStream和OutputStream来封装Socket的数据流,这样我们使用Socket的流,和普通io流类似。
实现代码如下:
//用于读取网络数据
InputStream in=clientSocket.getInputStream();
//用于写入网络数据
OutputStream out=clientSocket.getOutputStream();
三、UDP编程
1.编写服务器端程序
(1).创建Socket,监听端口
(Java提供了DatagramSocket来实现这个功能)
(2).读取来自客户端的“数据包”,创建数据包
(通过DatagramPacket实现接收)
(3).接收数据包
(4).从数据包中,读取数据
(通过recieve()和send()读写数据)
实现代码如下:
try (DatagramSocket serverSocket = new DatagramSocket(6666)) {
byte[] buff=new byte[64];
DatagramPacket packet=new DatagramPacket(buff,buff.length);
serverSocket.receive(packet);
System.out.println("读取完毕");
byte[] data=packet.getData();
String strFormClient=new String(data).trim();
System.out.println("来自客户端的信息:"+strFormClient);
if("天王盖地虎".equals(strFormClient)) {
packet.setData("宝塔镇河妖".getBytes());
}else {
packet.setData("error~".getBytes());
}
//反馈信息给客户端(发送数据包至客户端)
serverSocket.send(packet);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
2.编写客户端程序
(1).创建socket
(2).连接指定主机的端口
(客户端使用clientSocket.connect()指定远程地址和端口)
(3).创建数据包
(4).发送数据包
(通过recieve()和send()读写数据)
实现代码如下:
try (DatagramSocket clientSocket = new DatagramSocket()) {
clientSocket.connect(InetAddress.getByName("192.168.199.xxx"),6666);
DatagramPacket packet=new DatagramPacket(new byte[64],64);
packet.setData("天王盖地虎".getBytes());//将数据放入数据包
clientSocket.send(packet);
//等待接收反馈信息(等待接收来自服务端的数据包)
clientSocket.receive(packet);
byte[] data=packet.getData();
String strFromServer=new String(data);
System.out.println("来自服务端的信息:"+strFromServer);
} catch (SocketException | UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}