荣泰建设集团网站,栖霞做网站价格,企业解决方案平台,门户网络是什么#x1f3e1;个人主页 #xff1a; 守夜人st #x1f680;系列专栏#xff1a;Java …持续更新中敬请关注… #x1f649;博主简介#xff1a;软件工程专业#xff0c;在校学生#xff0c;写博客是为了总结回顾一些所学知识点 目录网络编程实现网络编程的三要素#x… 个人主页 守夜人st 系列专栏Java …持续更新中敬请关注… 博主简介软件工程专业在校学生写博客是为了总结回顾一些所学知识点 目录网络编程实现网络编程的三要素IP地址IP地址的分类IP地址形式IP常用命令特殊IP地址IP地址操作类-InetAddress端口协议UDP快速入门TCP快速入门TCP通信引入多线程TCP通信——线程池优化TCP通信实战案例——即时通信TCP通信实战案例——模拟B/S系统网络编程 什么是网络编程 网络编程可以让程序员与网络上的其他设备中的程序进行数据交互。 网络通信基本模式常见的通信模式有如下两种形式Client-Server(CS)、Browser/Server(BS) 实现网络编程的三要素
IP地址设备在网络中的地址是唯一的标识
端口应用程序在设备中的唯一标识
协议数据在网络中传输的规则常见的协议有UDP协议和TCP协议。
IP地址
IP地址的分类 IPv4:32位4字节采用点分十进制表示法192.168.1.1 IPv6:128位16字节采用冒分十六进制表示法ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 IP地址形式 公网地址和私有地址(局域网使用)。 192.168开头的就是常见的局域网地址范围为192.168.0.0——192.168.255.255专门为组织机构内部使用 IP常用命令
Ipconfig:查看本机IP地址ping IP地址检查网络是否连通
特殊IP地址
本机IP127.0.0.1或者localhost称为回送地址也可称为本地回环地址只会寻找当前所在本机
IP地址操作类-InetAddress
InetAddress表示Internet协议(IP)地址
名称说明public static InetAddress getLocalHost()返回本主机的地址对象public static InetAddress getByName(String host)得到指定主机的IP地址对象参数是域名或者IP地址public String getHostName()获取此IP地址的主机名public String getHostAddress()返回IP地址字符串public boolean isReachable(int timeout)在指定毫秒内连通该IP地址对应的主机连通后返回ture
package com.shouyeren.net_app;import java.net.InetAddress;public class InetAddressDemo01 {public static void main(String[] args) throws Exception {//获取本机IP地址对象InetAddress ip InetAddress.getLocalHost();//得到指定主机的IP地址对象参数是域名或者IP地址System.out.println(ip.getHostName());//获取此IP地址的主机名System.out.println(ip.getHostAddress());//获取域名的IP对象InetAddress ip1 InetAddress.getByName(www.baidu.com);System.out.println(ip1.getHostName());System.out.println(ip1.getHostAddress());//获取公网IP对象InetAddress ip2 InetAddress.getByName(112.80.248.76);System.out.println(ip2.getHostName());System.out.println(ip2.getHostAddress());//判断是否连通System.out.println(ip1.isReachable(5000));}
}
端口 端口号标识正在计算机设备上运行的进程(程序)被规定为一个16位的二进制范围是0——65535 端口类型 周知端口0——1023被预先定义的知名应用占用如HTTP占用80FTP占用21注册端口1024——49151分配给用户进程或某些应用程序如Tomcat占用8080MySQL占用3306动态端口49152——65535之所以称为动态端口是因为他一般不固定分配某种进程而是动态分配注意我们自己开发的程序选择注册端口且一个设备中不能出现两个程序的端口号一样否则会出错。 协议 连接和通信数据的规则被称为网络通信协议 网络通信协议有两套参考模型
OSI参考模型世界互联网协议标准全球通信规范由于此模型过于理想化未能在英特网上进行广泛推行TCP/IP参考模型事实上的国际标准
传输的两个常见协议
TCP(Transmission Control Protocol)传输控制协议UDP(User Datagram Protocol)用户数据报协议
TCP协议的特点
使用TCP协议必须双方先建立连接它是一种面向连接的可靠通信协议传输前采用”三次握手“方式建立连接所以是可靠的。在连接中可进行大量数据量的传输。连接、发送数据都需要确认且传输完毕后还需释放已建立的连接通信效率较低
TCP协议通信场景
对信息安全要求较高的场景例如文件下载、金融等数据通信
UDP协议
UDP是一种无连接、不可靠的传输协议将数据源IP、目的地IP和端口封装成数据包不需要建立连接每个数据包的大小限制在64KB内发送不管对方是否准备好接收方收到也不进行确认故是不可靠的可以广播发送发送数据结束时无需释放资源开销小速度快
UDP快速入门 DatagramPacket数据包对象 构造器说明public DatagramPacket(byte[] buf,int length,InetAddress address,int port)创建发送端数据包对象 buf 要发送的内容字节数组 length 发送内容的字节长度address接收端的IP地址对象port接收端的端口号public DatagramPacket(byte[] buf,int length)创建接受端的数据包对象public class ClientDemo {public static void main(String[] args) throws Exception {DatagramSocket socket new DatagramSocket();System.out.println(客户端启动);Scanner sc new Scanner(System.in);while (true) {System.out.println(请说);String s sc.nextLine();if (exit.equals(s)){System.out.println(下线成功);socket.close();break;}byte[] buf s.getBytes();DatagramPacket packet new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),8888);socket.send(packet);}}
}public class ServerDemo {public static void main(String[] args) throws Exception {System.out.println(服务端启动);DatagramSocket socket new DatagramSocket(8888);byte[] buf new byte[1024*64];DatagramPacket packet new DatagramPacket(buf, buf.length);while (true) {socket.receive(packet);int len packet.getLength();String rs new String(buf,0,len);System.out.println(收到了来自 packet.getAddress() packet.getPort() 的信息 rs);}}
}
TCP快速入门 TCP是一种面向连接安全可靠的传输协议 传输前采用三次握手方式点对点通信是可靠的 在连接中可以进行大数据量的传输 package com.shouyeren.net_app.tcp;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;/*** 开发socket网络编程入门案例的服务端*/
public class ServerDemo {public static void main(String[] args) {try {System.out.println(服务端启动);//1.注册端口ServerSocket serverSocket new ServerSocket(7777);//必须使用accept方法等待接收客户端的socket连接请求Socket socket serverSocket.accept();//从socket通信管道获得一个字节输入流InputStream in socket.getInputStream();//把自己输入流包装成缓冲字符输入流BufferedReader buf new BufferedReader(new InputStreamReader(in));//按照行读取消息String msg;while ((msg buf.readLine()) ! null){System.out.println(socket.getRemoteSocketAddress() : msg);}} catch (Exception e) {e.printStackTrace();}}
}
package com.shouyeren.net_app.tcp;import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;/*** 完成socket网络编程入门案例的客户端的开发*/
public class ClientDemo {public static void main(String[] args) {try {//1. 创建客户端的Socket对象请求与服务端连接Socket socket new Socket(127.0.0.1,7777);//2. 使用socket对象调用getOutputStream()方法得到字节输出流OutputStream os socket.getOutputStream();//3. 把低级的字节输出流包装成打印流PrintStream printStream new PrintStream(os);Scanner sc new Scanner(System.in);while (true) {//4. 发送消息System.out.println(请说);String msg sc.nextLine();printStream.println(msg);printStream.flush();}} catch (Exception e) {e.printStackTrace();}}
}
TCP通信引入多线程 需求一个服务端能够同时接收多个客户端发送的消息 package com.shouyeren.net_app.tcp;import java.net.ServerSocket;
import java.net.Socket;/*** 开发socket网络编程入门案例的服务端*/
public class ServerDemo {public static void main(String[] args) {try {System.out.println(服务端启动);//1.注册端口ServerSocket serverSocket new ServerSocket(7777);while (true) {//必须使用accept方法等待接收客户端的socket连接请求Socket socket serverSocket.accept();System.out.println(socket.getRemoteSocketAddress() 连接成功);//把新连接的Socket交给有个独立的线程处理并启动线程new ServerReaderThread(socket).start();}} catch (Exception e) {e.printStackTrace();}}
}
package com.shouyeren.net_app.tcp;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;public class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket socket;}Overridepublic void run() {try {//从socket通信管道获得一个字节输入流InputStream in socket.getInputStream();//把自己输入流包装成缓冲字符输入流BufferedReader buf new BufferedReader(new InputStreamReader(in));//按照行读取消息String msg;while ((msg buf.readLine()) ! null){System.out.println(socket.getRemoteSocketAddress() : msg);}} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() 下线了);}}
}
TCP通信——线程池优化 完成socket通信使用线程池完成优化 package com.shouyeren.net_app.socket_threadpool;import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;/*** 开发socket网络编程入门案例的服务端*/
public class ServerDemo {//使用静态变量记住一个线程池对象private static ExecutorService pool new ThreadPoolExecutor(3,5,6, TimeUnit.SECONDS,new ArrayBlockingQueue(2),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());public static void main(String[] args) {try {System.out.println(服务端启动);//1.注册端口ServerSocket serverSocket new ServerSocket(7777);while (true) {//必须使用accept方法等待接收客户端的socket连接请求Socket socket serverSocket.accept();System.out.println(socket.getRemoteSocketAddress() 连接成功);pool.execute(new ServerReaderRunnable(socket));}} catch (Exception e) {e.printStackTrace();}}
}package com.shouyeren.net_app.socket_threadpool;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;public class ServerReaderRunnable implements Runnable{private Socket socket;public ServerReaderRunnable(Socket socket){this.socket socket;}Overridepublic void run() {try {//从socket通信管道获得一个字节输入流InputStream in socket.getInputStream();//把自己输入流包装成缓冲字符输入流BufferedReader buf new BufferedReader(new InputStreamReader(in));//按照行读取消息String msg;while ((msg buf.readLine()) ! null){System.out.println(socket.getRemoteSocketAddress() : msg);}} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() 下线了);}}
}线程池优化的优势在哪里
服务端可以复用线程处理多个客户端可以避免系统瘫痪适合客户端通信时长较短的场景
TCP通信实战案例——即时通信
package com.shouyeren.net_app.tcp_sms;import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** 完成socket网络编程入门案例的客户端的开发*/
public class ClientDemo {public static void main(String[] args) {try {//1. 创建客户端的Socket对象请求与服务端连接Socket socket new Socket(127.0.0.1,8888);new ClientReaderThread(socket).start();//2. 使用socket对象调用getOutputStream()方法得到字节输出流OutputStream os socket.getOutputStream();//3. 把低级的字节输出流包装成打印流PrintStream printStream new PrintStream(os);Scanner sc new Scanner(System.in);while (true) {//4. 发送消息System.out.println(请说);String msg sc.nextLine();printStream.println(msg);printStream.flush();}} catch (Exception e) {e.printStackTrace();}}
}
class ClientReaderThread extends Thread{private Socket socket;public ClientReaderThread(Socket socket){this.socket socket;}Overridepublic void run() {try {//从socket通信管道获得一个字节输入流InputStream in socket.getInputStream();//把自己输入流包装成缓冲字符输入流BufferedReader buf new BufferedReader(new InputStreamReader(in));//按照行读取消息String msg;while ((msg buf.readLine()) ! null) {System.out.println(收到消息 : msg);}} catch (Exception e) {System.out.println(服务端把你踢出去了);}}}package com.shouyeren.net_app.tcp_sms;import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;/*** 开发socket网络编程入门案例的服务端*/
public class ServerDemo {//定义一个静态的List集合处在当前在线的Socketpublic static ListSocket allOnlineSocket new ArrayList();public static void main(String[] args) {try {System.out.println(服务端启动);//1.注册端口ServerSocket serverSocket new ServerSocket(8888);while (true) {//必须使用accept方法等待接收客户端的socket连接请求Socket socket serverSocket.accept();System.out.println(socket.getRemoteSocketAddress() 连接成功);allOnlineSocket.add(socket);//把新连接的Socket交给有个独立的线程处理并启动线程new ServerReaderThread(socket).start();}} catch (Exception e) {e.printStackTrace();}}
}class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket socket;}Overridepublic void run() {try {//从socket通信管道获得一个字节输入流InputStream in socket.getInputStream();//把自己输入流包装成缓冲字符输入流BufferedReader buf new BufferedReader(new InputStreamReader(in));//按照行读取消息String msg;while ((msg buf.readLine()) ! null) {System.out.println(socket.getRemoteSocketAddress() : msg);//把收到的消息转发给所有在线的客户端sendMsgToAll(msg);}} catch (Exception e) {System.out.println(socket.getRemoteSocketAddress() 已下线);ServerDemo.allOnlineSocket.remove(socket);}}private void sendMsgToAll(String msg) throws Exception {for (Socket socket : ServerDemo.allOnlineSocket) {PrintStream printStream new PrintStream(socket.getOutputStream());printStream.println(msg);printStream.flush();}}}TCP通信实战案例——模拟B/S系统 服务器必须给浏览器响应HTTP协议格式的数据否则浏览器不识别。 package com.shouyeren.net_app.BS;import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;public class ServerDemo {public static void main(String[] args) {try {//1.注册端口ServerSocket serverSocket new ServerSocket(8888);while (true) {//必须使用accept方法等待接收客户端的socket连接请求Socket socket serverSocket.accept();System.out.println(socket.getRemoteSocketAddress() 连接成功);//把新连接的Socket交给有个独立的线程处理并启动线程new ServerReaderThread(socket).start();}} catch (Exception e) {e.printStackTrace();}}
}class ServerReaderThread extends Thread{private Socket socket;public ServerReaderThread(Socket socket){this.socket socket;}Overridepublic void run() {try {PrintStream printStream new PrintStream(socket.getOutputStream());//协议类型和版本 响应成功消息printStream.println(HTTP/1.1 200 OK);//响应的数据类型 文本/网页printStream.println(Content-Type:text/html;charsetUTF-8);//这里需要一个空行printStream.println();//响应数据正文printStream.println(span stylecolor:red;font-size:90px 响应数据!!! /span);printStream.close();} catch (Exception e) {e.printStackTrace();}}
} 感觉不错的话动手点个赞吧