*java.lang.*:java的核心类
*java.util.*:工具包 *java.text.*:格式化输出的类 (SimpleDataFormat) *java.io.*:保存与IO流操作相关类和接口 *java.net.*:保存与网络通信相关类和接口 *IPv4地址是有32为二进制组成,IPv6是128为的二进制组成,用于表示唯一表示网络上的计算机 *端口号:用于表示一台计算机上不同的服务,取值范围0~66535 * 0~1023系统服务占用 * 常用的端口: * ftp的端口号:21 * www服务器:80 * oracle:1521 * mysql:3306 * sqlserver:1433 * *java.net.InetAddress类:此类表示互联网协议 (IP) 地址。 没有端口 *构造函数:没有 *常用方法: *获取InetAddress对象的方法 * getByName(String host)在给定主机名的情况下确定主机的 IP地址。 * getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 * getLocalHost():返回本地主机。 * *实例方法: * getHostName() 获取此 IP 地址的主机名。 * getHostAddress() 返回 IP 地址字符串(以文本表现形式)。 * toString() 将此 IP 地址转换为 String。 主机名/IP地址
* * java.net.InetSocketAddress:此类实现 IP套接字地址(IP 地址 + 端口号)。主要用于Socket编程 * 构造函数: * InetSocketAddress(InetAddress addr, int port) 根据 IP 地址和端口号创建套接字地址。 * InetSocketAddress(int port) 创建套接字地址,其中 IP 地址为通配符地址,端口号为指定值。 * InetSocketAddress(String hostname, int port) ** 根据主机名和端口号创建套接字地址。 * 常用方法: * getAddress()获取 IP 地址。 * getPort()获取端口号。 * getHostName() 获取 IP 地址的主机名。
* http://www.jd.com:80/index.html ftp://192.168.1.23/test/index.html * URL(Uniform Resource Locator):统一资源定位符,它是指向互联网“资源”的指针。 * 组成部分: * 1.协议(http,https,ftp...),在://前面的部分 * 2.主机域名部分: www.jd.com 192.168.1.23 * 3.端口部分:80 * 4.资源路径(资源名称): index.html /test/index.html *java.net.URL * 构造函数: * URL(String spec)根据 String 表示形式创建 URL 对象。 * URL url = new URL("http://www.jd.com:80/test/index.html"); * URL(String protocol, String host, int port, String file)根据指定 protocol、host、port 号和 file 创建 URL 对象。 * URL url = new URL("http","www.jd.com",80,"/test/index.html"); * 常用的方法: * getHost()获取此 URL 的主机名(如果适用)。 * getFile() 获取此 URL 的文件名。 * getPort() 获取此 URL 的端口号。 * getProtocol()获取此 URL 的协议名称。 * openStream()打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 单线程存在的问题:当多个用户同时访问时,用户只能按照访问顺序进行等待。 * 解决方案: * 利用多线程实现同时处理多个用户请求:为每一个客户端的请求单独创建一个线程 *HashMap与Hashtable的区别 *1.HashMap是非线程安全,而Hashtable是线程安全的适合在多线程中使用 *2.HashMap键和值都可以为null,Hashtable则不然
单项通信:
* 单项通信:顾客--->客服发送消息--->客服获取消息并展示
* java.net.DatagramSocket:此类表示用来发送和接收数据报包的套接字。 (发送电报的电台) * 作用:发送和接受数据报包 * 构造函数: * DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。 * DatagramSocket(int port)创建数据报套接字并将其绑定到本地主机上的指定端口。 *常用方法: * send(DatagramPacket p)从此套接字发送数据报包。 receive(DatagramPacket p)从此套接字接收数据报包。 close() 关闭此数据报套接字。 * java.net.DatagramPacket:此类表示数据报包。 类似于信封(封装信和收件人地址信息) * 作用:用于封装内容数据和目的地的地址 * 构造函数: * DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 * 服务器端:客服 * java.net.DatagramPacket:数据报包用来实现无连接包投递服务 * 构造函数: * DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。 * DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。 常用方法: getAddress() 获取发送方的IP地址 getData() 返回数据缓冲区。 getPort() 获取端口 getLength() 返回将要发送或接收到的数据的长度。import java.net.DatagramPacket;
import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;/**
* 利用UDP实现多次双向交互 * 一次单向 * 一次双向 * 多次双向 * * UDP和TCP通信的区别 * 1.是否面向连接:TCP是面向连接,点对点的通信, 而UDP是非连接的 * 2.可靠性:TCP传输数据内容可靠,而UDP数据的顺序无法确定,不可靠 * 3.传输大小:TCP无限制,UDP单包的传输大小限制在64K以内。 * 4.传输效率: UDP>TCP */public class UdpClient { public static void main(String[] args) throws Exception{ Scanner input = new Scanner(System.in); //1.创建数据报套接字 DatagramSocket datagramSocket = new DatagramSocket(6666); while(true){ String content = input.nextLine(); byte[] bs = content.getBytes(); //2.创建数据报包 DatagramPacket datagramPacket = new DatagramPacket(bs, bs.length, InetAddress.getLocalHost(), 8888); //3.发送数据 datagramSocket.send(datagramPacket); if("bye".equals(content)){ break; } //4.接受数据报包 byte[] bs2 = new byte[1024]; DatagramPacket datagramPacket2 = new DatagramPacket(bs2, bs2.length); datagramSocket.receive(datagramPacket2); //5.获取数据报包中数据 byte[] data = datagramPacket2.getData(); System.out.println("客服说:"+new String(data,0,data.length)); } //6.关闭套接字 datagramSocket.close(); }}import java.net.DatagramPacket;
import java.net.DatagramSocket;import java.net.InetAddress;import java.util.Scanner;/** * 客服 * @author Administrator * */public class UdpServer { public static void main(String[] args) throws Exception{ Scanner input = new Scanner(System.in); //1.创建数据报套接字 DatagramSocket datagramSocket = new DatagramSocket(8888); while(true){ //2.接受数据报包 byte[] bs2 = new byte[1024]; DatagramPacket datagramPacket2 = new DatagramPacket(bs2, bs2.length); datagramSocket.receive(datagramPacket2); //3.获取数据报包中数据 byte[] data = datagramPacket2.getData(); System.out.println("顾客说:"+new String(data,0,data.length)); String content = input.nextLine(); byte[] bs = content.getBytes(); //4.创建数据报包 DatagramPacket datagramPacket = new DatagramPacket(bs, bs.length, InetAddress.getLocalHost(), 6666); //5.发送数据 datagramSocket.send(datagramPacket); if("bye".equals(content)){ break; } } //6.关闭套接字 datagramSocket.close(); }}