1.线程的生命周期各状态。掌握如何创建一个多线程的类(两种方式,一种是 extends Thread,另一种是implements Runable),如何启动一个线程(调用start()方法);
线程池:掌握如何提交一个线程任务(调用submit()方法),如何关闭线程池(如shutdown())
一种方法是通过继承线程类Thread来创建线程类;
class ThreadA extends Thread{
public void run(){
for(int i=0;i<=100;i++){
System。out。print()
}
}
}
public class ThreadApp{
public statc void main(String args[]){
new ThreadA().start()//实例化第一个线程并启动
}
}
另一个方法是建立一个实现Runnable接口的类来创建线程。
class RA implements Runnable{
public void run(){
}
}
public class RunnableApp(){
public statc void main(String args[]){
RA a = new RA();
new Thread(a).start()
}
start()线程启动
run(定义该线程的动作)
sleep()线程休眠
suspend()使线程挂起
resume()回复挂起的线程
yield()线程让步
join(线程加入)
stop()结束线程
destrroy()结束线程不做清理工作
2.TCP和UDP的概念,及其区别(如:是否面向连接,是否更 为可靠,是否传输速率更快等等)。
TCP:面向连接的服务。可靠,一旦建立连接,传输大小无限制,但是需要连接建立时间,差错控制开销大。比如打电话…
UDP:User Datagram Protocol,用户数据报协议。无连接的服务;不可靠,差错控制开销较小;传输大小限制在每个数据报64K之内;发送的数据报并不一定以相同的次序到达接收方。
比如写信…
/*
3.TCP:
- 创建TCP服务器的基本过程
①绑定 ->
ServerSocket ss = new ServerSocket(5000);
ServerAddress ServerAddr = new InetSocketAddress(“localhost”,5000);
ss.bind(ServerAddr);
② -> 监听
while(true){
Socket s=ss.accept();
③ 获取输入/输出流通信
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream(),“UTF-8”));
BufferedWriter out = new BufferedWriter(new OutputWriterStream(s.getOutputStream(),“UTF-8”));
String msg = null;
while(msg = in.read()!=null){
if(msg.equals("bye")){
break;
}
out.write("echo:hi"+msg);
out。newLine()
out。flush()
}
④-> 关闭
in.close()
out.close();
s.close();
⑤返回第二步
- 创建TCP客户端的基本过程。
①连接
Socket s = new Socket(host,port);
SocketAddress remoteAddr = new InetSocketAddress(“localhost”,5000);
s.connect(remoteAddr);
② ->获取输入/输出流通信
BufferedReader in = new BufferReader(new InputStreamReader(s.getInputStream(),“UTF-8”));
BufferWriter out = new BufferWrite(new OutputStreamWriter(s.getOutputStream(),“UTF-8”));
BufferReader br = new BufferReader(new InputStreamReader(System.in));
String msg = null;
if((msg=br.read())!=null){
out.write(msg);
out.inLine();
out.flush();
if(msg.equals(“bye”)){
break;
}
③-> 关闭
br.close();
in.close();
out.close();
s.close();
}
- TCP通信基本编程实现,(参考编程案例,知识点分析:ServerViaTcp.java,ClientViaTcp.java),并掌握如何应用多线程技术实现并行通信
看完了*/
4.安全通信:
1)SSL协议的作用、SSL握手过程,及JDK中提供的相关的主要的包及类
SSL:安全套接字层协议 (Secure Sockets Layer,SSL),SSL提供加密,来源认证和数据完整性验证功能,为Web浏览器和TCP C/S提供安全通信。
TLS:传输层安全协议(Transport Layer Security,TLS),SSL升级版。
JSSE:Java安全Socket扩展(Java Secure Sockets Extension,JSSE),使用SSL和TLS保护网络通信安全
对称加密:加密和解密都使用相同的密钥,如DES、AES
非对称加密: 加密和解密使用不同的密钥,即,密钥对(公钥、私钥),如RSA 用公钥加密的信息,必须用私钥才能解密; 用私钥加密的信息,必须用公钥才能解密;
由于非对称算法加密计算量大,不适合大的数据量, 解决方法是:应用对称密钥加解密数据,应用非对称密钥验证和加解密对称密钥的相关信息。
SSL协议通信的主要过程如下:
①双方发送与确认协议、算法等信息
②双方应用非对称算法确认对方可信
③双方协商生成“对话秘钥”;
④双方应用生成的“对话秘钥”进行加密通信
SSL协议在网络数据交换中的逻辑地位介于TCP传输层与应用层之间 。其作用:
确保数据传送到正确的服务器端和客户端;
防止消息传递过程中被窃取;
防止消息在传递过程中被修改。
安全Socket编程的主要类与接口:
1)javax.net.ssl包 SSLServerSocket(ServerSocket的子类)、 SSLSocket(Socket的子类)、 KeyManagerFactory、TrustManagerFactory、 SSLContext、SSLSocketFactory
2)Java.security包: KeyStore、MessageDigest、Key等等
2)创建安全客户端与服务器Socket的过程
安全Socket服务器创建如下:
①应用keytool工具配置秘钥
②应用KeyStore加载本地秘钥库,并加载可信任客户端的公钥秘钥库,并创建KeyManager和TrustManager管理相应的秘钥库
③创建SSLContext,并关联KeyManager和TrustManager
SSLContext context = SSLContextgetIntance(“SSL”);
④通过SSLContext对象获取SSLServerSocketFactory,并通过SSLServerSocket创建SSLServerSocket,监听端口
⑤接受客户端连接请求,获取SSLSocket
⑥应用SSLSocket获取输出输入流以发送和接收数据
安全Socket客户端创建如下
①应用keytool工具配置秘钥
②应用KeyStore加载本地秘钥库,并加载可信任客户端公钥秘钥库,创建KeyManager和TrustManager管理相关秘钥库
③创建SSLContext管理KeyManager和TrustManager
④应用SSLContext对象获取SSLSocketFactory,并通过SSLSocket创建SSLSocket,连接服务器
⑤应用SSLSocket获取输出输入流以发送和接收数据
5.UDP:
1)创建UDP客户端的基本过程。
①创建DatagramSocket对象,打开一个特定端口的socket
DatagramSocket s = new DatagramSocket(0);
②获取主机的InetAddress
InetAddress ia = InetAddress。getByName(“localhost”);
③建立发送响应的数据包DatagramPacket,指定InetAddress,并调用socket的send方法发送数据包
BufferedReader br = new Buffered(new InputStream(System.in));
String msg = br.readLine();
Datagram pout = new DatagramPacket(msg.getBytes(),msg.getBytes()。length,ia,8000);
s.send(pout);
④建立接受请求数据包DatagramPacket,设置存储数据的数组,并调用Socket的receive方法接收数据包
Datagram pin = new DatagramPacket(new byte[512],512);
s.receive(pin);
⑤关闭连接
s.close();
2)创建UDP服务器的基本过程。
①创建DatagramSocket,绑定指定端口的socket
DatagramPacket s = new DatagramPaccket(8000);
byte [] buf = new byte[1024];
②建立接受请求数据包DatagramPacket,设置存储数据的数组,并调用receive方法监听端口和接收数据包
DatagramPacket pin = new DatagramPacket(new byte[512],512);
s.receive(pin);
③建立发送响应请求的数据包DatagramPacket,并调用send方法发送数据
String msg = new String(pin.getData());
String replyMsg = “echo:”+msg;
DatagramPacket pout = new DatagramPacket(replyMsg.getBytes(),replyMsg.getBytes().lenght,pin.getAddress(),pin.getPort());
s.close()
④返回步骤2,继续监听端口和接收数据。
s.close()
3) UDP通信基本编程实现。(参考编程案例)
6.非阻塞I/O:服务器和客户端的基本事件,以及判断哪种事件(key.isAcceptable(), key.isReadable(), key.isWritable())。
非阻塞的通信机制主要由 java.nio 包中的类实现,
主要类:
ServerSocketChannel:ServerSocket替代类,支持阻塞通信与非阻塞通信
SocketChannel:Socket替代类,支持阻塞通信与非阻塞通信
Selector:为ServerSocketChannel监控接收连接就绪事件,为SocketChannel监控连接就绪、读就绪和写就绪事件
SelectionKey:其定义的静态常量表示事件类型
ByteBuffer:表示字节缓冲区,SocketChannel的read()和write()方法都会操纵ByteBuffer
/*
7.流:字节流与字符流的区别,字节流如何转换成字符流,
常用的字节流类和字符流类及其方法的应用。
字节流:处理单元为1个字节,操作字节和字节数组。抽象父类是 InputStream 和OutputStream
字符流:处理的单元为两个字节的Unicode字符,分别操作字符、字符数组或字符串。抽象父类是 Reader 和 Writer
//构建套接字输入流,接收客户端数据
DataInputStream in = new DataInputStream(new BufferedInputStream(s.getInputStream()))
//构建套接字输出流,以发送数据给服务器
DataOutPutStream out = new DataOutPutStream(new BufferedOutputStream(s.getOutputStream()))
*/
8.HTTP:
1)请求参数的方式(如get, post等等),各自的适用范围。
方法名 备注
GET 获取一个URL指定的资源。通常用于向服务器索取信息,请求参数放在URL中
POST 将资一个资源上传到已知URL的服务器,不可重复操作。通常用于向服务器提交信息,请求参数放在请求头部
PUT 将一个资源上传到已知URL的服务器
DELETE 从一个指定URL删除一个资源,可重复提交
HEAD 获取一个指定资源的信息
TRACE 网络跟踪
CONNECT 与PROXY之间的连接管理
OPTIONS 查询能力
2)至少掌握两种获取网页内容的方法:URL(可参考例子:MyHttpGetterByURL
), HttpClient(可参考例子:教材p282程序12.1)
9.线程池
①创建线程池
ExecutorService pool = Execuors.newFixedThreadPool(5)
②提交线程
Runnable task = new MyRunnable();
pool.submit(task);
③关闭线程池
pool。shutdow();
10.组播
实现类:MulticastSocket、DatagramPacket MulticastSocket是DatagramSocket的子类
加入组播组:joinGroup(InetAddress grouphost)
发送、接收数据:send(DatagramPacket p)、 receive(DatagramPacket p)
离开组播组:leaveGroup(DatagramPacket p)
设置TTL(生存时间):setTimeToLive(int ttl)