Java学习(八)
目录:
1、端口与IP地址:
2、JDK中的网络类:
3、synchronized关键字在多线程中的运用学习:
4、notify方法与wait方法与synchronized关键字综合运用增删线程数目:
5、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信:
6、URL类及URLConnection类学习:
7、练习:
1、端口与IP地址:
答:在互联网上传输的数据都包含有用来识别目的地的IP地址和端口号。IP地址用来标识网络上的计算机,而端口号用来指明该计算机上的应用程序。
端口是一种抽象的软件结构(包括一些数据结构和I/O缓冲区)。应用程序通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都通过该端口输出。
端口用一个整数型标识符来表示,即端口号。端口号跟协议相关,TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,端口通常称为协议端口(protocol port) ,简称端口。
端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。例如:http使用80端口。
2、JDK中的网络类:
答:通过java.net包中的类,java程序能够使用TCP或UDP协议在互联网上进行通讯
Java 通过扩展已有的流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方法支持TCP/IP。
Java支持TCP和UDP协议族。TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式。
3、synchronized关键字在多线程中的运用学习:
(1)代码示例:
说明:当访问某个对象的synchronized方法时,表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,直到之前的那个线程执行方法完毕后(或者是抛出了异常),那么将该对象的锁释放掉,其他线程才有可能再去访问该synchronized方法。
如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。
图3.1 代码示例1
图3.2 代码示例2
运行结果:
图3.3 运行结果截图
4、notify方法与wait方法与synchronized关键字综合运用增删线程数目:
答:说明:
(1)wait方法表示在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。wait方法必须在synchronized方法里面运用;
notify方法唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待;
(2)直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程;
(3)wait和notify是成对出现的。
(4)代码示例:
图4.1 代码示例1
图4.2 代码示例2
图4.3 代码示例3
图4.4 代码示例4
②运行结果:
图4.5 运行结果截图
5、使用ServerSocket和Socket实现服务器端和客户端的 Socket通信:
(1)过程:
① 建立Socket连接
②获得输入/输出流
③读/写数据
④关闭输入/输出流
⑤关闭Socket
(2)Socket:此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。
6、URL类及URLConnection类学习:
答:(1)知识点总结:
①URL类的openConnection( )方法,创建一个URLConnection类的对象,获得实际比特或内容信息。
②URLConnection是访问远程资源属性的一般用途的类。
(2)URL类学习代码示例:
图6.1 代码示例
运行结果:
图6.2 运行结果
(3)URLConnection类学习:
①代码示例:
将百度一下页面读取的1024个字符的数据流传递到一个文件中保存,如下图所示:
图6.3 代码示例2
②运行结果:
图6.4 运行结果2
①代码示例:
注意:当使用java程序检索其他网站上的内容时,如果其服务器设置了禁止抓取,或者其访问需要权限,如果此时你去检索网页那么就会有异常该异常出现。
如果是服务器需要访问权限,比如说你要登录才能访问的网页,那么你抓取不了的。
会出现如同Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL:http://blog.csdn.net的异常警告
图6.5 代码示例3
运行结果:
因为只是装载了其1024个字符,所以网页打开无显示,我们可以查看网页源代码,看到如下图所示
图6.6 运行结果3
7、练习:
(1)题目要求:
实现服务器端与客户端的通信,服务器与客户端可以任意发送消息,将两者的聊天消息保存到一个文件中,当下次启动服务器与客户端时,将历史记录打印到两者的聊天界面中。
(2)代码示例:
①文件操作类,包括读取外部文件保存的聊天记录的数据和将聊天记录写入外部文件的方法。
图7.1 代码示例1
②服务器读取线程类,读取从控制台传来的数据并显示在控制台,并将数据写入到外部文件当中保存聊天记录。
图7.2 代码示例2
③服务器写入线程类,用于服务器从控制台输入数据的写入。
图7.3 代码示例3
④服务器控制主类,服务器创建绑定到端口2000的套接字,并侦听接受来自此套接字客户端的连接,开启服务器写入线程类以及服务器读取线程类。
图7.4 代码示例4
⑤客户端读取线程类,用于读取从服务器传来的数据,并将聊天记录写入外部文件。
图7.5 代码示例5
⑥客户端写入线程类,用于从客户端控制台输入数据的写入。
图7.6 代码示例6
⑦客户端控制主类,客户端创建连接到IP地址为本机的指定端口号2000的流套接字,开启客户端写入线程类以及客户端读取线程类。
图7.7 代码示例7
(3)运行结果:
①在控制台进行聊天页面:
图7.8 运行结果1
图7.9 运行结果2
②查看保存聊天记录的文件
图7.10 运行结果3
③再次连接服务器与客户端,可以在控制台显示出历史聊天记录
图7.11 运行结果4