黑马程序员——Java 网络程序设计
------- android培训、java培训、期待与您交流! ----------
Socket介绍
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以
发送请求,利用它可以较为方便地编写网络上数据的传递。在Java中,有专门的Socket
类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通
讯。本章介绍在Java中如何利用Socket进行网络编程。
在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象
有两个关键的方法,一个是getInputStream()方法,另一个是getOutputStream()方法。
getInputStream()方法可以得到一个输入流,客户端的Socket对象上的getInputStream()
方法得到的输入流其实就是从服务器端发回的数据流。getOutputStream()方法得到一个
输出流,客户端Socket对象上的getOutputStream()方法返回的输出流就是将要发送到
服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。
Sockets有两种主要的操作方式:面向连接的和无连接的。面向连接的sockets操
作就像一部电话,必须建立一个连接和一人呼叫。所有的事情在到达时的顺序与它们
出发时的顺序时一样,无连接的sockets操作就像是一个邮件投递,没有什么保证,多
个邮件可能在到达时的顺序与出发时的顺序不一样。
到底用哪种模式是由应用程序的需要决定的。如果可靠性更重要的话,用面向连
接的操作会好一些。比如文件服务器需要数据的正确性和有序性,如果一些数据丢失
了,系统的有效性将会失去。比如一些服务器间歇性地发送一些数据块,如果数据丢
了的话,服务器并不想要再重新发过一次,因为当数据到达的时候,它可能已经过时
了。确保数据的有序性和正确性需要额外的操作的内存消耗,额外的费用将会降低系
统的回应速率。
无连接的操作使用数据报协议。一个数据报是一个独立的单元,它包含了所有的
这次投递的信息。可以把它想象成一个信封,它有目的地址和要发送的内容。这个模
式下的socket不需要连接一个目的的socket,它只是简单地投出数据报.无连接的操作
是快速的和高效的,但是数据安全性不佳。
在Java中面向连接的类有两种形式,它们分别是客户端和服务器端。下面先看
服务器端。
下面首先先建立服务器端程序,此服务器端程序只用于向客户端输出“hello
world!”字符串。
01 import java.io.*;
02 import java.net.*;
03 public class HelloServer
04 {
05 public static void main(String[] args) throws IOException
06 {
07 ServerSocket serversocket=null;
08 PrintWriter out=null;
09 try
10 {
11 // 在下面实例化了一个服务器端的Socket连接
12 serversocket=new ServerSocket(9999);
13 }
14 catch(IOException e)
15 {
16 System.err.println("Could not listen on port:9999.");
17 System.exit(1);
18 }
19 Socket clientsocket=null;
20 try
21 {
22 // accept()方法用来监听客户端的连接
23 clientsocket=serversocket.accept();
24 }
25 catch(IOException e)
26 {
27 System.err.println("Accept failed.");
28 System.exit(1);
29 }
30 out=new PrintWriter(clientsocket.getOutputStream(),true);
31 out.println("hello world!");
32 clientsocket.close();
33 serversocket.close();
34 }
35 }
程序说明:
1、 程序第7行声明了一个ServerSocket的对象。
2、 程序第8行声明了一个PrintWriter的对象,用于向可户端打印输出。
3、 程序第9行~第18行实例化ServerSocket对象,在9999端口进行监听。
4、 程序第19行声明一Socket对象clientsocket,此对象用于接收客户端的Socket连
接。
5、 程序第20行~29行通过ServerSocket类中的accept()方法,接收客户端的Socket
请求,此方法返回一个客户端的Socket请求。
6、 程序第30行,通过客户端的Socket对象去实例化PrintWriter对象,此时out对
象就具备了向客户端打印信息的能力。
7、 程序第31行调用println()方法,将信息打印至客户端。
8、 第32行关闭客户端Socket连接。
9、 第33行关闭服务器端Socket连接。
下面为程序的客户端程序。
范例:HelloClient.java
01 import java.io.*;
02 import java.net.*;
03 public class HelloClient
04 {
05 public static void main(String[] args) throws IOException
06 {
07 Socket hellosocket=null;
08 BufferedReader in=null;
09 // 下面这段程序,用来将输入输出流与socket关联
10 try
11 {
12 hellosocket=new Socket("localhost",9999);
13 in=new BufferedReader(new InputStreamReader(hellosocket.getInputStream()));
14 }
15 catch(UnknownHostException e)
16 {
17 System.err.println("Don't know about host:localhost!");
18 System.exit(1);
19 }
20 catch(IOException e)
21 {
22 System.err.println("Couldn't get I/O for the connection.");
23 System.exit(1);
24 }
25 System.out.println(in.readLine());
26 in.close();
27 hellosocket.close();
28 }
29 }
程序说明:
1、 程序第7行声明一Socket的对象hellosocket。
2、 程序第8行声明一BufferedReader的对象in,此对象用于读取服务器端发送过来
的信息。
3、 程序第12行实例化hellosocket对象,此连接在本机的9999端口上监听。
4、 程序第13行通过hellosocket对象实例化BufferedReader对象。
5、 程序第25行等待服务器端发送过来的信息并打印。
6、 程序第26行关闭BufferedReader。
7、 程序第27行关闭Socket对象。
面向连接的操作使用TCP协议。一个这个模式下的socket必须在发送数据之前与
目的地的socket取得一个连接。一旦连接建立了,sockets就可以使用一个流接口:打开-读-写-关闭。所有的
发送的信息都会在另一端以同样的顺序被接收。面向连接的操
作比无连接的操作效率更低,但是数据的安全性更高。
黑马程序员——Java 网络程序设计相关推荐
- 黑马程序员Java教程学习笔记(三)
学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...
- 黑马程序员Java零基础视频教程_下部(P135-P200)
黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...
- 黑马 程序员——Java基础---流程控制
黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...
- 黑马 程序员——Java基础---IO(下)
黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...
- 2023年黑马程序员Java学习路线图
2023年Java学科免费学习资源放送40+套课程,超过600小时的内容! 在过去的一年里,为了帮助更多人线上充电,学会更多技能,黑马程序员举办了 150+ 场免费直播公开课,新增精品视频教程 80+ ...
- 黑马程序员Java教程学习笔记(五)
学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...
- 黑马程序员 JAVA WEB 第三节 MYSQL 约束
这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步. b_d 若果有同学也想学习黑马程序员Java w ...
- 黑马程序员Java零基础视频教程_下部(P52-P134)
黑马程序员Java零基础视频教程_下部(P52-P134) 1. 异常 1.1 异常体系介绍 1.2 编译时异常和运行时异常 1.3 异常在代码中的两个作用 1.4 JVM虚拟机默认处理异常的方式 1 ...
- 黑马程序员Java零基础视频教程_上部(P1-P80)
黑马程序员Java零基础视频教程_上部(P1-P80) 1. Java入门 1.1 Java学习介绍 1.2 Java人机交互 1.2.1 常用CMD命令 2. Java基础学习 2.1 Java入门 ...
最新文章
- python旅游推荐系统_用python写一个简单的推荐系统
- swin_transformer用于做图像分类(已跑通)
- [Android] 软件中选择文件夹功能
- DLL文件用加密工具加密不了怎么办
- spotify注册服务器,【评测】Cocktail Audio N25:集USB解码、TIDAL、Spotify、NAS 串流、音乐服务器于......
- ubuntu配置搜狗输入法
- 我是一名Linux系统运维工程师
- 专访平安科技方国伟:全面解读金融云中CaaS的技术选型
- 软件插件化,大势所趋新势力
- 小米10获取root权限_小米手机:刷机卡刷、线刷、root权限获取
- 你知道Graylog吗?不知道的话我建议你知道!
- 2018-2019年世界经济危机是中国崛起最大的机遇!
- 【台大郭彦甫】Matlab入门教程超详细学习笔记七:数值微积分(附PPT链接)
- java求循环节长度
- 如何办理股票开户手续
- mysql百度翻译_百度翻译与谷歌翻译哪个好,亲测给你们看
- 通过 railway 和 code-server 搭建网页版的 visual studio code
- osi七层模型每一层的含义及介绍
- MAC OS 复制路径 快捷键
- 网吧专用Ros软路由+Winbox教程