666,InetAddress
package com.hspedu.api;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class API {
public static void main(String[] args) throws UnknownHostException {
//1,获取本机 InetAddress 对象 getLocalHost
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);//小船儿的宇宙飞船/10.150.216.219
//2,根据指定主机名/域名获取 ip 地址对象 getByName
InetAddress host1 = InetAddress.getByName("小船儿的宇宙飞船");
System.out.println("host1= " + host1);//小船儿的宇宙飞船/10.150.216.219
//3,根据域名返回 InetAddress 对象,比如 www.baidu.com 对应
InetAddress host2 = InetAddress.getByName("www.baidu.com");
System.out.println("host2= " + host2);//www.baidu.com/220.181.38.149
//4,通过InetAddress 对象,获取对应的地址
String hostAddress = host2.getHostAddress();
System.out.println("host2 对应的ip= " + hostAddress);//220.181.38.149
//5,通过 InetAddress 对象,获取对应的主机名/或者域名
String hostName = host2.getHostName();
System.out.println("host2对应的主机名/域名= " + hostName);//www.baidu.com
}
}
668,TCP字节流编程1
思路:
客户端把数据从内存写出到数据通道上,然后服务端把数据通道上的数据读入到内存
代码:
服务端的代码:
packagecom.hspedu.socket;importjava.io.IOException;importjava.io.InputStream;importjava.net.ServerSocket;importjava.net.Socket;//服务端publicclass SocketTCP01Server { publicstaticvoid main(String[] args) throws IOException { //思路//1. 在本机 的 9999 端口监听, 等待连接 // 细节: 要求在本机没有其它服务在监听 9999 // 细节: 这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发] ServerSocket serverSocket = newServerSocket(9999); System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时, 程序会 阻塞, 等待连接 // 如果有客户端连接, 则会返回 Socket 对象, 程序继续 Socket socket = serverSocket.accept(); System.out.println("socket =" +socket.getClass());//3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示 InputStream inputStream =socket.getInputStream();//4. IO 读取byte[] buf = newbyte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1) { System.out.println(new String(buf, 0, readLen)); } //5,关闭流和socket inputStream.close(); socket.close(); serverSocket.close();//关闭}}
客户端的代码:
packagecom.hspedu.socket;importjava.io.IOException;importjava.io.OutputStream;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;//客户端, 发送"hello, server" 给服务端publicclass SocketTCP01Client { publicstaticvoid main(String[] args) throws IOException { //思路//1. 连接服务端 (ip , 端口) //解读: 连接本机的 9999 端口, 如果连接成功, 返回 Socket 对象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客户端 socket返回=" +socket.getClass());//2. 连接上后, 生成 Socket, 通过 socket.getOutputStream() // 得到 和 socket 对象关联的输出流对象 OutputStream outputStream =socket.getOutputStream();//3. 通过输出流, 写入数据到 数据通道 outputStream.write("hello, server".getBytes());//4. 关闭流对象和 socket, 必须关闭 outputStream.close(); socket.close(); System.out.println("客户端退出"); }}
先运行 服务端的代码,再运行客户端的代码,两个代码的运行结果如下:
669,TCP字节流编程2
思路:
比上个案例多了一步: 服务端把 要发送的数据从内存写出到数据通道上
代码:
服务端的代码:
packagecom.hspedu.socket;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;publicclass SocketTCP02Server { publicstaticvoid main(String[] args) throws IOException { //思路//1. 在本机 的 9999 端口监听, 等待连接 // 细节: 要求在本机没有其它服务在监听 9999 // 细节: 这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发] ServerSocket serverSocket = newServerSocket(9999); System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时, 程序会 阻塞, 等待连接 // 如果有客户端连接, 则会返回 Socket 对象, 程序继续 Socket socket = serverSocket.accept(); System.out.println("socket =" +socket.getClass());//3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示 InputStream inputStream =socket.getInputStream();//4. IO 读取byte[] buf = newbyte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1) { System.out.println(new String(buf, 0, readLen)); } //5, 获取socket相关联的输出流 OutputStream outputStream = socket.getOutputStream(); outputStream.write("hello, client".getBytes());//设置结束标记socket.shutdownOutput();//6,关闭流和socket outputStream.close(); inputStream.close(); socket.close(); serverSocket.close();//关闭}}
客户端的代码:
packagecom.hspedu.socket;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.InetAddress;importjava.net.Socket;@SuppressWarnings({"all"})publicclass SocketTCP02Client { publicstaticvoid main(String[] args) throws IOException { //思路//1. 连接服务端 (ip , 端口) //解读: 连接本机的 9999 端口, 如果连接成功, 返回 Socket 对象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客户端 socket返回=" +socket.getClass());//2. 连接上后, 生成 Socket, 通过 socket.getOutputStream() // 得到 和 socket 对象关联的输出流对象 OutputStream outputStream =socket.getOutputStream();//3. 通过输出流, 写入数据到 数据通道 outputStream.write("hello, server".getBytes());//设置结束标记socket.shutdownOutput();//4. 获取和socket关联的输入流,读取数据(字节),并显示 InputStream inputStream =socket.getInputStream();byte[] buf = newbyte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1) { System.out.println(new String(buf, 0, readLen)); } //5. 关闭流对象和 socket, 必须关闭 inputStream.close(); outputStream.close(); socket.close(); System.out.println("客户端退出"); }}
运行结果:
670,TCP字符流编程
思路:
代码:
服务端的代码:
packagecom.hspedu.socket;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclass SocketTCP03Server { publicstaticvoid main(String[] args) throws IOException { //思路//1. 在本机 的 9999 端口监听, 等待连接 // 细节: 要求在本机没有其它服务在监听 9999 // 细节: 这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发] ServerSocket serverSocket = newServerSocket(9999); System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时, 程序会 阻塞, 等待连接 // 如果有客户端连接, 则会返回 Socket 对象, 程序继续 Socket socket = serverSocket.accept(); System.out.println("socket =" +socket.getClass());//3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示 InputStream inputStream =socket.getInputStream();//4. IO读取,使用字符流,老师使用 InputStreamReader 将 inputStream 转成字符流 BufferedReader bufferedReader = newBufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s);//输出//5, 获取socket相关联的输出流 OutputStream outputStream =socket.getOutputStream();//使用字符输出流的方式回复信息 BufferedWriter bufferedWriter = newBufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello client 字符流"); bufferedWriter.newLine(); bufferedWriter.flush();//注意需要手动的flush//设置结束标记socket.shutdownOutput();//6,关闭流和socket bufferedReader.close(); bufferedWriter.close(); socket.close(); serverSocket.close();//关闭}}
客户端的代码:
packagecom.hspedu.socket;importjava.io.*;importjava.net.InetAddress;importjava.net.Socket;publicclass SocketTCP03Client { publicstaticvoid main(String[] args) throws IOException { //思路//1. 连接服务端 (ip , 端口) //解读: 连接本机的 9999 端口, 如果连接成功, 返回 Socket 对象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客户端 socket返回=" +socket.getClass());//2. 连接上后, 生成 Socket, 通过 socket.getOutputStream() // 得到 和 socket 对象关联的输出流对象 OutputStream outputStream =socket.getOutputStream();//3. 通过输出流,写入数据到 数据通道,使用字符流 BufferedWriter bufferedWriter = newBufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write("hello, server 字符流"); bufferedWriter.newLine();// 插入一个换行符, 表示回复内容的结束,注意,要求对方使用readLine()bufferedWriter.flush();//如果使用的是字符流,需要手动刷新,否则数据不会写入数据通道//设置结束标记socket.shutdownOutput();//4. 获取和socket关联的输入流,读取数据(字符),并显示 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader =newBufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s); //5. 关闭流对象和 socket, 必须关闭bufferedReader.close();//关闭外层流 outputStream.close(); socket.close(); System.out.println("客户端退出"); }}
运行结果:
671,网络上传文件
思路:
与前面的题不一样的是,客户端要先把图片读入到内存中,然后再把内存中的图片写出到数据通道上;服务端从数据通道上把图片的数据读入到自己电脑的内存中,再从内存中写出到存放的磁盘目录下;服务端把 收到图片的信息写出到数据通道上,客户端再读入。
代码:
StreamUtils 类
packagecom.hspedu.upload;importjava.io.BufferedReader;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;/** * 此类用于演示关于流的读写方法 * */publicclass StreamUtils { /** * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[] * @param is * @return*@throwsException*/publicstaticbyte[] streamToByteArray(InputStream is) throws Exception{ ByteArrayOutputStream bos =newByteArrayOutputStream();//创建输出流对象byte[] b = newbyte[1024];//字节数组intlen;while((len=is.read(b))!=-1){//循环读取 bos.write(b, 0, len);//把读取到的数据,写入bos}byte[] array = bos.toByteArray();//然后将bos 转成字节数组bos.close();return array; } /** * 功能:将InputStream转换成String * @param is * @return*@throwsException*/publicstatic String streamToString(InputStream is) throws Exception{ BufferedReader reader =newBufferedReader(new InputStreamReader(is)); StringBuilder builder=new StringBuilder(); String line; while((line=reader.readLine())!=null){ builder.append(line+"\r\n"); } return builder.toString(); }}
服务端的代码:
packagecom.hspedu.upload;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;//文件上传的服务端publicclass TCPFileUploadServer { publicstaticvoid main(String[] args) throws Exception { //1. 服务端在本机监听8888端口 ServerSocket serverSocket = newServerSocket(8888); System.out.println("服务端在8888端口监听....");//2. 等待连接 Socket socket =serverSocket.accept();//3. 读取客户端发送的数据 //通过Socket得到输入流 BufferedInputStream bis = newBufferedInputStream(socket.getInputStream());byte[] bytes =StreamUtils.streamToByteArray(bis);//4. 将得到 bytes 数组,写入到指定的路径,就得到一个文件了 String destFilePath ="src\\1.jpg"; BufferedOutputStream bos =newBufferedOutputStream(new FileOutputStream(destFilePath)); bos.write(bytes); bos.close(); // 向客户端回复"收到图片" // 通过socket 获取到输出流(字符) BufferedWriter writer = newBufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write("收到图片"); writer.flush();//把内容刷新到数据通道socket.shutdownOutput();//设置写入结束标记//关闭其他资源 writer.close(); bis.close(); socket.close(); serverSocket.close(); }}
客户端的代码
packagecom.hspedu.upload;importjava.io.*;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;//文件上传的客户端publicclass TCPFileUploadClient { publicstaticvoid main(String[] args) throws Exception { //客户端连接服务端 8888,得到Socket对象 Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//创建读取磁盘文件的输入流//String filePath ="e:\\qie.png"; String filePath ="d:\\1.jpg"; BufferedInputStream bis =newBufferedInputStream(newFileInputStream(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(); }}
运行结果:
677,UDP网络编程1
思路:
代码:
接收端的代码:
packagecom.hspedu.udp;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.net.SocketException;//UDP 接收端publicclass UDPReceiverA { publicstaticvoid main(String[] args) throws IOException { //1. 创建一个 DatagramSocket 对象,准备在9999接收数据 DatagramSocket socket = newDatagramSocket(9999);//2. 构建一个 DatagramPacket 对象,准备接收数据 // 在前面讲解UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = newbyte[1024]; DatagramPacket packet =new DatagramPacket(buf, buf.length); //3. 调用 接收方法, 将通过网络传输的 DatagramPacket 对象 // 填充到 packet对象 //老师提示: 当有数据包发送到 本机的9999端口时,就会接收到数据 // 如果没有数据包发送到 本机的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 ="好的, 明天见".getBytes();//说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口 packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.191.221"), 9998); socket.send(packet);//发送//5. 关闭资源 socket.close(); System.out.println("A端退出..."); }}
发送端的代码:
packagecom.hspedu.udp;importjava.io.IOException;importjava.net.*;//发送端 B ====> 也可以接收数据publicclass UDPSenderB { publicstaticvoid main(String[] args) throws IOException { //1.创建 DatagramSocket对象,准备在9998端口 接收数据 DatagramSocket socket = newDatagramSocket(9998);//2. 将需要发送的数据,封装到 DatagramPacket对象byte[] data ="hello 明天吃火锅~".getBytes();//说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口 DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.191.221"), 9999); socket.send(packet); //3.=== 接收从A端回复的信息 //(1) 构建一个 DatagramPacket 对象,准备接收数据 // 在前面讲解UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = newbyte[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端退出"); }}
运行结果:
679,网络编程作业1
代码:
把 670 节的代码拿来一改就行。
服务端的代码:
packagecom.hspedu.homework;importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;@SuppressWarnings({"all"})publicclass Homework01Server { publicstaticvoid main(String[] args) throws IOException { //思路//1. 在本机 的 9999 端口监听, 等待连接 // 细节: 要求在本机没有其它服务在监听 9999 // 细节: 这个 ServerSocket 可以通过 accept() 返回多个 Socket[多个客户端连接服务器的并发] ServerSocket serverSocket = newServerSocket(9999); System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接 9999 端口时, 程序会 阻塞, 等待连接 // 如果有客户端连接, 则会返回 Socket 对象, 程序继续 Socket socket =serverSocket.accept();//3. 通过 socket.getInputStream() 读取客户端写入到数据通道的数据, 显示 InputStream inputStream =socket.getInputStream();//4. IO读取,使用字符流,老师使用 InputStreamReader 将 inputStream 转成字符流 BufferedReader bufferedReader = newBufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); String answer ="";if("name".equals(s)) { answer ="我是韩顺平"; } elseif("hobby".equals(s)) { answer ="编写java程序"; } else { answer ="你说的啥子"; } //5, 获取socket相关联的输出流 OutputStream outputStream =socket.getOutputStream();//使用字符输出流的方式回复信息 BufferedWriter bufferedWriter = newBufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write(answer); bufferedWriter.newLine(); bufferedWriter.flush();//注意需要手动的flush//设置结束标记socket.shutdownOutput();//6,关闭流和socket bufferedReader.close(); bufferedWriter.close(); socket.close(); serverSocket.close();//关闭}}
客户端的代码:
packagecom.hspedu.homework;importjava.io.*;importjava.net.InetAddress;importjava.net.Socket;importjava.util.Scanner;@SuppressWarnings({"all"})publicclass Homework01Client { publicstaticvoid main(String[] args) throws IOException { //思路//1. 连接服务端 (ip , 端口) //解读: 连接本机的 9999 端口, 如果连接成功, 返回 Socket 对象 Socket socket = new Socket(InetAddress.getLocalHost(), 9999); System.out.println("客户端 socket返回=" +socket.getClass());//2. 连接上后, 生成 Socket, 通过 socket.getOutputStream() // 得到 和 socket 对象关联的输出流对象 OutputStream outputStream =socket.getOutputStream();//3. 通过输出流,写入数据到 数据通道,使用字符流 BufferedWriter bufferedWriter = newBufferedWriter(newOutputStreamWriter(outputStream));//从键盘读取用户的问题 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的问题"); String question = scanner.next(); bufferedWriter.write(question); bufferedWriter.newLine();// 插入一个换行符, 表示回复内容的结束,注意,要求对方使用readLine()bufferedWriter.flush();//如果使用的是字符流,需要手动刷新,否则数据不会写入数据通道//设置结束标记socket.shutdownOutput();//4. 获取和socket关联的输入流,读取数据(字符),并显示 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader =newBufferedReader(new InputStreamReader(inputStream)); String s = bufferedReader.readLine(); System.out.println(s); //5. 关闭流对象和 socket, 必须关闭bufferedReader.close();//关闭外层流 outputStream.close(); socket.close(); System.out.println("客户端退出"); }}
运行结果:
680,网络编程作业2
代码:
把 677 节的代码拿来一改
接收端的代码:
packagecom.hspedu.homework;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;@SuppressWarnings({"all"})//UDP 接收端publicclass Homework02ReceiverA { publicstaticvoid main(String[] args) throws IOException { //1. 创建一个 DatagramSocket 对象,准备在8888接收数据 DatagramSocket socket = newDatagramSocket(8888);//2. 构建一个 DatagramPacket 对象,准备接收数据 // 在前面讲解UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = newbyte[1024]; DatagramPacket packet =new DatagramPacket(buf, buf.length); //3. 调用 接收方法, 将通过网络传输的 DatagramPacket 对象 // 填充到 packet对象 System.out.println("接收端 等待接收问题"); socket.receive(packet); //4. 可以把packet 进行拆包,取出数据,并显示.int length = packet.getLength();//实际接收到的数据字节长度byte[] data = packet.getData();//接收到数据 String s = new String(data, 0, length); //判断接收到的信息是什么 String answer ="";if("四大名著是哪些".equals(s)) { answer ="四大名著 《红楼梦》《三国演义》《西游记》《水浒传》"; } else { answer ="what?"; } //===回复信息给B端//将需要发送的数据,封装到 DatagramPacket对象 data =answer.getBytes();//说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口 packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.191.221"), 9998); socket.send(packet);//发送//5. 关闭资源 socket.close(); System.out.println("A端退出..."); }}
发送端的代码:
packagecom.hspedu.homework;importjava.io.IOException;importjava.net.DatagramPacket;importjava.net.DatagramSocket;importjava.net.InetAddress;importjava.util.Scanner;@SuppressWarnings({"all"})//发送端 B ====> 也可以接收数据publicclass Homework02Sender { publicstaticvoid main(String[] args) throws IOException { //1.创建 DatagramSocket对象,准备在9998端口 接收数据 DatagramSocket socket = newDatagramSocket(9998);//2. 将需要发送的数据,封装到 DatagramPacket对象 Scanner scanner = new Scanner(System.in); System.out.println("请输入你的问题:"); String question =scanner.next();byte[] data =question.getBytes();//说明: 封装的 DatagramPacket对象 data 内容字节数组 , data.length , 主机(IP) , 端口 DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.191.221"), 8888); socket.send(packet); //3.=== 接收从A端回复的信息 //(1) 构建一个 DatagramPacket 对象,准备接收数据 // 在前面讲解UDP 协议时,老师说过一个数据包最大 64kbyte[] buf = newbyte[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端退出"); }}
运行结果: