1、InetAddress类
概念
- 表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
方法
// 获得本地 主机地址对象
public static InetAddress getLoclHost()
// 根据主机名称获得地址对象
public static InetAddress getByName(String host)
// 获得所有相关地址对象
public static InetAddress[] getAllByName(String host)
// 获取IP地址字符串
public String getHostAddress()
// 获得IP地址主机名
public String getHostName()
package com.kingtl.NetCode;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* InetAddress类
* 1、创建本机IP地址对象
* 2、创建局域网IP地址对象
* 3、创建外网IP地址对象
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
// 1、创建本机IP地址对象
//1.1 getLocalhost() 方法
InetAddress ia1 = InetAddress.getLocalHost();
System.out.println("ip地址:"+ia1.getHostAddress()+" 主机名:"+ia1.getHostName());
// 1.2 getByName("ip地址")
InetAddress ia2 = InetAddress.getByName("192.168.5.99");
System.out.println("ip地址:"+ia2.getHostAddress()+" 主机名:"+ia2.getHostName());
// 1.3 getByName("127.0.0.1")
InetAddress ia3 = InetAddress.getByName("127.0.0.1");
System.out.println("ip地址:"+ia3.getHostAddress()+" 主机名:"+ia3.getHostName());
// 1.4 getByName("localhost)
InetAddress ia4 = InetAddress.getByName("localhost");
System.out.println("ip地址:"+ia4.getHostAddress()+" 主机名:"+ia4.getHostName());
// 2、创建局域网的IP地址对象
//InetAddress ia5 = InetAddress.getByName("192.168.5.10");
//System.out.println("ip地址:"+ia5.getHostAddress()+" 主机名:"+ia5.getHostName());
//System.out.println("2秒钟是否可达:"+ia5.isReachable(2000));
// 3、创建外网IP地址对象
InetAddress ia6 = InetAddress.getByName("www.baidu.com");
System.out.println("ip地址:"+ia6.getHostAddress()+" 主机名:"+ia6.getHostName());
System.out.println("2秒钟是否可达:"+ia6.isReachable(2000));
InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
for (InetAddress ia : ias) {
System.out.println(ia.getHostAddress());
}
}
}
2、基于TCP的网络编程
Socket编程
- Socket(套接字)是网络中的一个通信节点。
- 分为客户端Socket与服务器ServerSocket。
- 通信要求:IP地址 + 端口号。
开发步骤
服务器端
- 创建ServerSocket,指定端口号。
- 调用accept等待客户端接入。
- 使用
输入流
,接收请求
数据到服务器(等待) - 使用
输出流
,发送响应
数据给客户端 - 释放资源
客户端:
- 创建Socket,指定服务器IP + 端口号
- 使用
输出流
,发送请求
数据给服务器。 - 使用
输入流
,接收响应
数据到客户端(等待)
3、案例部分
4、单客户端发送数据给服务器端
服务器端代码:
package com.kingtl.NetCode;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 基于TCP协议的服务器端开发
* 1、创建ServerSocket ,并制定端口号
* 2、调用accept() ,接收客户端请求
* 3、获取输入流,读取客户端发送的数据
* 4、获取输出流,发送数据给客户端
* 5、释放资源
*/
public class TcpServer {
public static void main(String[] args) throws Exception {
//1、创建ServerSocket ,并制定端口号
ServerSocket listener = new ServerSocket(8899);
//2、调用accept() ,接收客户端请求,阻塞方法(如果没有客户端请求,则阻塞)
System.out.println("服务器已经启动.....");
Socket socket = listener.accept();
//3、获取输入流,读取客户端发送的数据
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
String data = br.readLine();
System.out.println("客户端发送:" + data);
//4、获取输出流,发送数据给客户端【可选】
//5、释放资源
br.close();
socket.close();
listener.close();
}
}
客户端代码:
package com.kingtl.NetCode;
import java.io.*;
import java.net.Socket;
/**
* 基于TCP的客户端开发
* 1、创建客户端套接字,并指定服务器的地址和端口号
* 2、获取输出流,发送数据给服务器
* 3、获取输入流,读取服务器的数据
* 4、释放资源
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
//1、创建客户端套接字,并指定服务器的地址和端口号
Socket socket = new Socket("127.0.0.1", 8899);
//2、获取输出流,发送数据给服务器
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
bw.write("许久不见");
//3、获取输入流,读取服务器的数据 【服务器没写回复的代码】
//4、释放资源
bw.close();
socket.close();
}
}
结果:
5、单客户端上传文件给服务器端
服务器端代码:
package com.kingtl.NetCode2;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP服务器端
*/
public class TcpFileServer {
public static void main(String[] args) throws Exception {
// 1、创建ServerSocket
ServerSocket listener = new ServerSocket(9999);
// 2、侦听接收客户端请求
System.out.println("服务器已启动....");
Socket socket = listener.accept();
// 3、获取输入流
InputStream is = socket.getInputStream();
// 4、边读取边保存
FileOutputStream fos = new FileOutputStream("d:\\002.jpg");
byte[] buf = new byte[1024 * 4];
int count = 0;
while ((count=is.read(buf)) != -1) {
fos.write(buf,0,count);
}
// 关闭
fos.close();
is.close();
socket.close();
listener.close();
System.out.println("接收结束!");
}
}
客户端代码:
package com.kingtl.NetCode2;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* TCP的客户端
*/
public class TcpFileClient {
public static void main(String[] args) throws Exception {
// 1、创建 Socket
Socket socket = new Socket("127.0.0.1",9999);
// 2、获取输出流
OutputStream os = socket.getOutputStream();
// 3、边读取边发送
FileInputStream fis = new FileInputStream("E:\\photos\\bizhi\\fengjing1.jpg");
byte[] buf = new byte[1024 * 4];
int count = 0;
while ((count=fis.read(buf)) != -1) {
os.write(buf,0,count);
}
//关闭
fis.close();
os.close();
socket.close();
System.out.println("发送完毕!");
}
}
6、多客户端发送数据给服务器端
服务器端
package com.kingtl.NetCode3;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 使用TCP实现接收多个客户端请求
*/
public class TcpServer {
public static void main(String[] args) throws Exception {
// 1、创建 ServerSocket
ServerSocket listener = new ServerSocket(10086);
// 2、调用 accept() ,接收客户端请求
System.out.println("服务器已启动.....");
while (true){
Socket socket = listener.accept();
System.out.println(socket.getInetAddress()+"连接了服务器!");
// 创建线程对象,负责接收数据
new SocketThread(socket).start();
}
}
}
线程类
package com.kingtl.NetCode3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class SocketThread extends Thread {
private Socket socket;
public SocketThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
if (socket != null) {
BufferedReader br = null;
try {
InputStream is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is,"utf-8"));
while (true) {
String data = br.readLine();
if (data == null) { // 客户端已经关闭
break;
}
System.out.println(socket.getInetAddress()+"说:" +data);
if (data.equals("886") || data.equals("byebye")) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
socket.close();
System.out.println(socket.getInetAddress()+"退出了...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
客户端
package com.kingtl.NetCode3;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* TCP客户端:一直往服务器发送数据
*/
public class TcpClient {
public static void main(String[] args) throws Exception {
// 1、创建 Socket
Socket socket = new Socket("127.0.0.1", 10086);
// 2、获取输出流
OutputStream os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
// 3、控制台输入
Scanner input = new Scanner(System.in);
while (true) {
String data = input.nextLine();
bw.write(data);
bw.newLine(); // 发送换行符
bw.flush();
if (data.equals("886") || data.equals("byebye")) {
break;
}
}
// 4、关闭
bw.close();
socket.close();
}
}
7、总结
- 计算机网络:
- 为实现资源共享和信息传递,通过通信线路连接起来的若干主机。
- TCP协议:
- 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。
- IP:
- Port:
- Socket编程: