------- 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 网络程序设计相关推荐

  1. 黑马程序员Java教程学习笔记(三)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(三) 面向对象:设计对象.注意事 ...

  2. 黑马程序员Java零基础视频教程_下部(P135-P200)

    黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...

  3. 黑马 程序员——Java基础---流程控制

    黑马程序员--Java基础---流程控制 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java提供了两种基本的流程控制结构:分支结构 ...

  4. 黑马 程序员——Java基础---IO(下)

    黑马程序员--Java基础---IO(下) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供 ...

  5. 2023年黑马程序员Java学习路线图

    2023年Java学科免费学习资源放送40+套课程,超过600小时的内容! 在过去的一年里,为了帮助更多人线上充电,学会更多技能,黑马程序员举办了 150+ 场免费直播公开课,新增精品视频教程 80+ ...

  6. 黑马程序员Java教程学习笔记(五)

    学习视频:https://www.bilibili.com/video/BV1Cv411372m 如侵权,请私信联系本人删除 文章目录 黑马程序员Java教程学习笔记(五) 日期时间:Date.Sim ...

  7. 黑马程序员 JAVA WEB 第三节 MYSQL 约束

    这是阿锃总结的第三节黑马程序员JAVA WEB视频的MYSQL约束部分的笔记.希望可以帮助跟我一样正在学习Java web的同学们.我们一起进步.   b_d 若果有同学也想学习黑马程序员Java w ...

  8. 黑马程序员Java零基础视频教程_下部(P52-P134)

    黑马程序员Java零基础视频教程_下部(P52-P134) 1. 异常 1.1 异常体系介绍 1.2 编译时异常和运行时异常 1.3 异常在代码中的两个作用 1.4 JVM虚拟机默认处理异常的方式 1 ...

  9. 黑马程序员Java零基础视频教程_上部(P1-P80)

    黑马程序员Java零基础视频教程_上部(P1-P80) 1. Java入门 1.1 Java学习介绍 1.2 Java人机交互 1.2.1 常用CMD命令 2. Java基础学习 2.1 Java入门 ...

最新文章

  1. python旅游推荐系统_用python写一个简单的推荐系统
  2. swin_transformer用于做图像分类(已跑通)
  3. [Android] 软件中选择文件夹功能
  4. DLL文件用加密工具加密不了怎么办
  5. spotify注册服务器,【评测】Cocktail Audio N25:集USB解码、TIDAL、Spotify、NAS 串流、音乐服务器于......
  6. ubuntu配置搜狗输入法
  7. 我是一名Linux系统运维工程师
  8. 专访平安科技方国伟:全面解读金融云中CaaS的技术选型
  9. 软件插件化,大势所趋新势力
  10. 小米10获取root权限_小米手机:刷机卡刷、线刷、root权限获取
  11. 你知道Graylog吗?不知道的话我建议你知道!
  12. 2018-2019年世界经济危机是中国崛起最大的机遇!
  13. 【台大郭彦甫】Matlab入门教程超详细学习笔记七:数值微积分(附PPT链接)
  14. java求循环节长度
  15. 如何办理股票开户手续
  16. mysql百度翻译_百度翻译与谷歌翻译哪个好,亲测给你们看
  17. 通过 railway 和 code-server 搭建网页版的 visual studio code
  18. osi七层模型每一层的含义及介绍
  19. MAC OS 复制路径 快捷键
  20. 网吧专用Ros软路由+Winbox教程

热门文章

  1. YYGH-9-预约下单
  2. i31005g1和锐龙r5 3500u哪个好
  3. 90天的互信息计算(包含互信息和标准互信息)
  4. 基于WT2605C-32N音频蓝牙语音芯片的实时录音上传技术方案介绍
  5. 超级计算机通信工程研发相关高校,南京大学研发量子通信技术无人机,每秒产生240万对纠缠的光粒子...
  6. gazebo地图构建
  7. 100个python算法超详细讲解:π的近似值
  8. AT89S52与CF卡的接口设计
  9. Python获取int最大值和float最大值
  10. 模拟橄榄山增改删轴线测试