*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();
}
}