中国最大的免费素材网站,怎么创作一个微信小程序,wordpress七牛云cdn,手机网址大全主页网址网络编程
什么是网络编程
可以让设备中的程序与网络上其他设备中的程序进行数据交互#xff08;实现网络通信的#xff09;
java.net.* 包下提供了网络编程的解决方案
通信的基本架构
CS 架构#xff08;Client 客户端 / Server 服务端#xff09;BS 架构#xff08;…网络编程
什么是网络编程
可以让设备中的程序与网络上其他设备中的程序进行数据交互实现网络通信的
java.net.* 包下提供了网络编程的解决方案
通信的基本架构
CS 架构Client 客户端 / Server 服务端BS 架构Browser 客户端 / Server 服务端
网络通信三要素
IP 地址端口号协议
IP 地址
import java.net.InetAddress;public class Test {public static void main(String[] args) throws Exception {// 1. 获取本机IP地址对象InetAddress ip1 InetAddress.getLocalHost();System.out.println(ip1.getHostName()); // TOMATOSystem.out.println(ip1.getHostAddress()); // 10.233.86.87// 2. 获取指定IP或者域名的IP地址对象InetAddress ip2 InetAddress.getByName(www.baidu.com);System.out.println(ip2.getHostName()); // www.baidu.comSystem.out.println(ip2.getHostAddress()); // 120.232.145.185// 3. 判断6000毫秒内是否能够连通百度System.out.println(ip2.isReachable(6000)); // true}
}端口号
标记正在计算机设备上运行的应用程序被规定为一个16位的二进制范围是 0 ~ 65535
通信协议
网络上通信的设备事先规定的连接规则以及传输数据的规则被称为网络通信协议UDPUser Datagram Protocol用户数据报协议TCPTransmission Control Protocol传输控制协议
UDP
特点无连接不可靠通信
快速入门
// 客户端import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;public class Client {public static void main(String[] args) throws Exception {// 1. 创建客户端对象DatagramSocket socket new DatagramSocket();// 2. 创建数据包对象封装要发出去的数据/*public DatagramPacket(byte buf[], int length, SocketAddress address) {参数一 : 封装要发出去的数据参数二 : 发送出去的数据大小字节个数参数三 : 服务端的IP地址找到服务端主机参数四 : 服务端的端口}*/byte[] bytes 我是客户端.getBytes();DatagramPacket packet new DatagramPacket(bytes, bytes.length,InetAddress.getLocalHost(), 6666);// 3. 开始正式发送这个数据包的数据出来了socket.send(packet);System.out.println(客户端数据发送完毕);// 4. 关闭连接释放其所占用的网卡资源socket.close();}
}// 服务端import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server {public static void main(String[] args) throws Exception {System.out.println(---服务端启动---);// 1. 创建一个服务端对象DatagramSocket socket new DatagramSocket(6666); // 参数端口号// 2. 创建一个数据包对象用于接收数据byte[] buffer new byte[1024 * 64]; // 64KBDatagramPacket packet new DatagramPacket(buffer, buffer.length); // 参数// 3. 正式使用数据包来接收客户端发来的数据socket.receive(packet);// 客户端ipSystem.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());// 4. 从字节数组中把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据int len packet.getLength();String res new String(buffer, 0, len);System.out.println(res);}
}多发多收
// 客户端import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {// 1. 创建客户端对象DatagramSocket socket new DatagramSocket();// 2. 创建数据包对象封装要发出去的数据/*public DatagramPacket(byte buf[], int length, SocketAddress address) {参数一 : 封装要发出去的数据参数二 : 发送出去的数据大小字节个数参数三 : 服务端的IP地址找到服务端主机参数四 : 服务端的端口}*/Scanner sc new Scanner(System.in);while (true) {System.out.println(请输入 );String msg sc.nextLine();// 如果用户输入exit命令就执行退出if (exit.equals(msg)) {System.out.println(欢迎再来);socket.close(); // 4. 关闭连接释放其所占用的网卡资源break;}byte[] bytes msg.getBytes();DatagramPacket packet new DatagramPacket(bytes, bytes.length,InetAddress.getLocalHost(), 6666);// 3. 开始正式发送这个数据包的数据出来了socket.send(packet);System.out.println(客户端数据发送完毕);}}
}// 服务端import java.net.DatagramPacket;
import java.net.DatagramSocket;public class Server {public static void main(String[] args) throws Exception {System.out.println(---服务端启动---);// 1. 创建一个服务端对象DatagramSocket socket new DatagramSocket(6666); // 参数端口号// 2. 创建一个数据包对象用于接收数据byte[] buffer new byte[1024 * 64]; // 64KBDatagramPacket packet new DatagramPacket(buffer, buffer.length); // 参数while (true) {// 3. 正式使用数据包来接收客户端发来的数据socket.receive(packet);// 客户端ipSystem.out.println(packet.getAddress().getHostAddress());System.out.println(packet.getPort());// 4. 从字节数组中把接收到的数据直接打印出来// 接收多少就倒出多少// 获取本次数据包接收了多少数据int len packet.getLength();String res new String(buffer, 0, len);System.out.println(res);System.out.println(-------------------);}}
}TCP
特点面向连接可靠通信
快速入门
// 客户端import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {// 1. 创建 Socket 对象并同时请求与服务器程序的连接Socket socket new Socket(127.0.0.1, 8888);// 2. 从 socket 通信管道中得到一个字节输出流用来发数据给服务端程序OutputStream os socket.getOutputStream();// 3. 把低级的字节输出流包装成数据输出流DataOutputStream dos new DataOutputStream(os);// 4. 开始写数据出去了dos.writeUTF(我们还是好朋友对吧);dos.close(); // 关闭数据输出流管道socket.close(); // 释放连接资源}
}// 服务端import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println(---服务端启动---);// 1. 创建 ServerSocket 的对象同时为服务端注册端口ServerSocket serverSocket new ServerSocket(8888);// 2. 使用 serverSocket 对象调用一个 accept 方法等待客户端的连接请求Socket socket serverSocket.accept();// 3. 从 socket 通信管道中得到一个字节输入流InputStream is socket.getInputStream();// 4. 把原始的字节输入流包装成数据输入流DataInputStream dis new DataInputStream(is);// 5. 使用数据输入流读取客户端发送过来的消息String res dis.readUTF();System.out.println(res);// 输出客户端的IP地址System.out.println(socket.getRemoteSocketAddress());dis.close();socket.close();}
}多发多收
// 客户端package login;import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {// 1. 创建 Socket 对象并同时请求与服务器程序的连接Socket socket new Socket(127.0.0.1, 8888);// 2. 从 socket 通信管道中得到一个字节输出流用来发数据给服务端程序OutputStream os socket.getOutputStream();// 3. 把低级的字节输出流包装成数据输出流DataOutputStream dos new DataOutputStream(os);Scanner sc new Scanner(System.in);while (true) {System.out.println(请输入 );String msg sc.nextLine();if(exit.equals(msg)){System.out.println(欢迎再来);dos.close(); // 关闭数据输出流管道socket.close(); // 释放连接资源break;}// 4. 开始写数据出去了dos.writeUTF(msg);dos.flush();}}
}// 服务端package login;import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println(---服务端启动---);// 1. 创建 ServerSocket 的对象同时为服务端注册端口ServerSocket serverSocket new ServerSocket(8888);// 2. 使用 serverSocket 对象调用一个 accept 方法等待客户端的连接请求Socket socket serverSocket.accept();// 3. 从 socket 通信管道中得到一个字节输入流InputStream is socket.getInputStream();// 4. 把原始的字节输入流包装成数据输入流DataInputStream dis new DataInputStream(is);while (true) {try {// 5. 使用数据输入流读取客户端发送过来的消息String res dis.readUTF();System.out.println(res);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress()断开了连接);;socket.close();break;}}}
}多个客户端同时使用服务端
// 客户端import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {// 1. 创建 Socket 对象并同时请求与服务器程序的连接Socket socket new Socket(127.0.0.1, 8888);// 2. 从 socket 通信管道中得到一个字节输出流用来发数据给服务端程序OutputStream os socket.getOutputStream();// 3. 把低级的字节输出流包装成数据输出流DataOutputStream dos new DataOutputStream(os);Scanner sc new Scanner(System.in);while (true) {System.out.println(请输入 );String msg sc.nextLine();if(exit.equals(msg)){System.out.println(欢迎再来);dos.close(); // 关闭数据输出流管道socket.close(); // 释放连接资源break;}// 4. 开始写数据出去了dos.writeUTF(msg);dos.flush();}}
}// 服务端import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws Exception {System.out.println(---服务端启动---);// 创建 ServerSocket 的对象同时为服务端注册端口ServerSocket serverSocket new ServerSocket(8888);while (true) {// 使用 serverSocket 对象调用一个 accept 方法等待客户端的连接请求Socket socket serverSocket.accept();System.out.println(socket.getRemoteSocketAddress() 连接到了服务端);// 使用一个独立的线程把当前的 socket 对象交给它负责处理new ServerReaderThread(socket).start();}}
}class ServerReaderThread extends Thread {private Socket socket;public ServerReaderThread(Socket socket) {this.socket socket;}Overridepublic void run() {try {// 从 socket 通信管道中得到一个字节输入流InputStream is socket.getInputStream();// 把原始的字节输入流包装成数据输入流DataInputStream dis new DataInputStream(is);while (true) {try {// 使用数据输入流读取客户端发送过来的消息String res dis.readUTF();System.out.println(res);} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() 断开了连接);dis.close(); // 关闭流管道socket.close(); // 关闭连接管道break;}}} catch (Exception e) {e.printStackTrace();}}
}