1 InetAddress
- 一些常用的方法
//1. 获取本机的InetAddress 对象InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost);//2. 根据指定主机名 获取 InetAddress对象InetAddress host1 = InetAddress.getByName("PCOS-2020YWLYDD");System.out.println("host1=" + host1);//3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应InetAddress host2 = InetAddress.getByName("www.baidu.com");System.out.println("host2=" + host2);//4. 通过 InetAddress 对象,获取对应的地址String hostAddress = host2.getHostAddress();System.out.println("host2 对应的ip = " + hostAddress);//5. 通过 InetAddress 对象,获取对应的主机名/或者的域名String hostName = host2.getHostName();System.out.println("host2对应的主机名/域名=" + hostName); // www.baidu.com
2 Socket
2.1 TCP
- java中TCP的工作流程
TCP是连接的协议,需要先建立连接再发送数据

2.1.1 利用TCP传输数据
- 服务器端
import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class SocketTCPServer {public static void main(String[] args) throws IOException {//思路//1. 在本机 的9999端口监听, 等待连接// 细节: 要求在本机没有其它服务在监听9999// 细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接9999端口时,程序会 阻塞, 等待连接// 如果有客户端连接,则会返回Socket对象,程序继续Socket socket = serverSocket.accept();System.out.println("服务端 socket =" + socket.getLocalSocketAddress());////3. 通过socket.getInputStream() 读取客户端写入到数据通道的数据, 显示InputStream inputStream = socket.getInputStream();//4. IO读取, 使用字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);//输出//5. 获取socket相关联的输出流OutputStream outputStream = socket.getOutputStream();// 使用字符输出流的方式回复信息BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello client 字符流");bufferedWriter.newLine();// 插入一个换行符,表示回复内容的结束bufferedWriter.flush();//注意需要手动的flush//6.关闭流和socketbufferedWriter.close();bufferedReader.close();socket.close();serverSocket.close();//关闭}}
- 客户端
import java.io.*;import java.net.InetAddress;import java.net.Socket;public class SocketTCPClient {public static void main(String[] args) throws IOException {//思路//1. 连接服务端 (ip , 端口)//解读: 连接本机的 9999端口, 如果连接成功,返回Socket对象Socket socket = new Socket(InetAddress.getLocalHost(), 9999);System.out.println("客户端 socket=" + socket.getLocalSocketAddress());//2. 连接上后,生成Socket, 通过socket.getOutputStream()// 得到 和 socket对象关联的输出流对象OutputStream outputStream = socket.getOutputStream();//3. 通过输出流,写入数据到 数据通道, 使用字符流BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello, server 字符流");bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束, 注意,要求对方使用readLine()!!!!bufferedWriter.flush();// 如果使用的字符流,需要手动刷新,否则数据不会写入数据通道//4. 获取和socket关联的输入流. 读取数据(字符),并显示InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);//5. 关闭流对象和socket, 必须关闭bufferedReader.close();//关闭外层流bufferedWriter.close();socket.close();System.out.println("客户端退出.....");}}
2.1.1 利用TCP传输文件
- 服务器端
import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TCPFileUploadServer {public static void main(String[] args) throws Exception {//1. 服务端在本机监听8888端口ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务端在8888端口监听....");//2. 等待连接Socket socket = serverSocket.accept();//3. 读取客户端发送的数据// 通过Socket得到输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bis);//4. 将得到 bytes 数组,写入到指定的路径,就得到一个文件了String destFilePath = "f\\b.png";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));bos.write(bytes);bos.close();// 向客户端回复 "收到图片"// 通过socket 获取到输出流(字符)BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("收到图片");writer.flush();//把内容刷新到数据通道socket.shutdownOutput();//设置写入结束标记//关闭其他资源writer.close();bis.close();socket.close();serverSocket.close();}}
- 客户端
import java.io.*;import java.net.InetAddress;import java.net.Socket;public class TCPFileUploadClient {public static void main(String[] args) throws Exception {//客户端连接服务端 8888,得到Socket对象Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//创建读取磁盘文件的输入流String filePath = "f:\\a.png";BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));//bytes 就是filePath对应的字节数组byte[] bytes = StreamUtils.streamToByteArray(bis);//通过socket获取到输出流, 将bytes数据发送给服务端BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());bos.write(bytes);//将文件对应的字节数组的内容,写入到数据通道bis.close();socket.shutdownOutput();//设置写入数据的结束标记//=====接收从服务端回复的消息=====InputStream inputStream = socket.getInputStream();//使用StreamUtils 的方法,直接将 inputStream 读取到的内容 转成字符串String s = StreamUtils.streamToString(inputStream);System.out.println(s);//关闭相关的流inputStream.close();bos.close();socket.close();}}
2.2 UDP
- UDP是无连接协议
- 发送数据时先创建套接字绑定本机一个端口,向目的IP和端口发送数据,不需要去管是否有主机在这个端口接收数据

- A端
import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class UDPReceiverA {public static void main(String[] args) throws IOException {//1. 创建一个 DatagramSocket 对象,准备在9999接收数据DatagramSocket socket = new DatagramSocket(9999);//2. 构建一个 DatagramPacket 对象,准备接收数据byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);//3. 调用 接收方法, 将通过网络传输的 DatagramPacket 对象// 填充到 packet对象// 如果没有数据包发送到 本机的9999端口, 就会阻塞等待.System.out.println("接收端A 等待接收数据..");socket.receive(packet);//4. 可以把packet 进行拆包,取出数据,并显示.int length = packet.getLength();//实际接收到的数据字节长度byte[] data = packet.getData();//接收到数据String s = new String(data, 0, length);System.out.println(s);//===回复信息给B端//将需要发送的数据,封装到 DatagramPacket对象data = "库里FMVP".getBytes();//说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口packet =new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 9998);socket.send(packet);//发送//5. 关闭资源socket.close();System.out.println("A端退出...");}}
- B端
import java.io.IOException;import java.net.*;public class UDPSenderB {public static void main(String[] args) throws IOException {//1.创建 DatagramSocket 对象,准备在9998端口 接收数据DatagramSocket socket = new DatagramSocket(9998);//2. 将需要发送的数据,封装到 DatagramPacket对象byte[] data = "hello 勇士总冠军~".getBytes(); ////说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口DatagramPacket packet =new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 9999);socket.send(packet);//3.=== 接收从A端回复的信息//(1) 构建一个 DatagramPacket 对象,准备接收数据// 在前面讲解UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = new byte[1024];packet = new DatagramPacket(buf, buf.length);//(2) 调用 接收方法, 将通过网络传输的 DatagramPacket 对象// 填充到 packet对象//老师提示: 当有数据包发送到 本机的9998端口时,就会接收到数据// 如果没有数据包发送到 本机的9998端口, 就会阻塞等待.socket.receive(packet);//(3) 可以把packet 进行拆包,取出数据,并显示.int length = packet.getLength();//实际接收到的数据字节长度data = packet.getData();//接收到数据String s = new String(data, 0, length);System.out.println(s);//关闭资源socket.close();System.out.println("B端退出");}}
常见的网络程序端口号
tomcat:8080
mysql:3306
oracle:1521
sqlserver:1433
