文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何理解Java Socket聊天程序核心代码

2023-06-17 15:25

关注

如何理解Java Socket聊天程序核心代码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Java Socket聊天程序在编写的时候需要我们注意很多的事情,本程序是基于Java Socket聊天程序,采用TCP传输协议,实现两个人之间的信息交互。下面我们就详细的向大家介绍这一程序。

在形成最终结果之前,我经历了两个过程程序,两个过程均为半成品,他们反映了我整个课程设计中的思考过程,在一个较为系统思考过程后,socket思想一层一层加固,让我映像很深刻,收获很多。在此文档中,我将演示我两个过程程序的思考过程,然后对源代码进行讲解,但最终上传的代码为制成品。

在两个过程程序中,TestServer1和TestClient1为***个过程,TestServer2和TestClient2为第二个过程,MySingleThreadServer1和MySingleThreadClient1为最终程序。其中,TestServer2和TestClient2实现了多线程,一个线程负责接收,另一个线程负责发送,MySingleThreadServer1和MySingleThreadClient1实现了基于GUI的聊天。控件并非像MFC那样很容易就可以通过拖动组件实现,java是通过程序的编写来实现,我采用awt组件编码实现GUI,界面很简单,但花了不少时间来布局。

核心代码讲解:

三个过程程序都牵涉了Java Socket聊天程序最核心的思想,以下为核心的讲解。

1.服务器

Java Socket服务器端需要引入两个包,java.io包和java.net包,io包是解决输入输出流的问题,而net包包含了socket编程所需的API.服务器端首先要得到ServerSocket的对象,即ServerSocket ss = new ServerSocket(5555); 5555为服务器端的端口号。Socket s = ss.accept();服务器端Socket对象通过accept()方法开始监听链接过来的客户端信息。如果有客户端有信息过来,则对象s调用输入输出流的方法,如s.getInputStream(),同时把得到的InputStream 封装在DataInputStream当中,在客户端与服务器端通信时,有可能两端存在于不同的操作系统,封装在DataInputStream可以很好的解决这个问题。

2.客户端

其实客户端代码与服务器端大多类似,有一点显著不同,在客户端没有ServerSocket类,即客户端不用监听任何链接,他只需要发送链接即可。Socket s = new Socket(String IPAddr,int port),IPAddr为服务器端的IP地址,port为服务器端的端口号即5555,由于本程序服务器端和客户端在同一主机上,所以服务器端IP地址为127.0.0.1。通过IPAddr和port两个参数就可以得到Java Socket聊天程序对象s,接下来的步骤就和服务器程序类似了。

对三个过程程序的详解

Procedure1:服务器端核心代码如下:

  1. ServerSocket ss = new ServerSocket(5555);  

  2. Socket s = ss.accept();  

  3. OutputStream os = s.getOutputStream();  

  4. DataOutputStream dos = new DataOutputStream(os);  

  5. InputStream is = s.getInputStream();  

  6. DataInputStream dis = new DataInputStream(is);  

  7. InputStreamReader isr = new InputStreamReader(System.in);
     //重键盘读入数据  

  8. BufferedReader br = new BufferedReader(isr); 
    //把从键盘读入的数据放入缓冲  

  9. String info;  

  10. while(true){  

  11. info = dis.readUTF();   

  12. System.out.println("客户端说:" + info);  

  13. if(info.equals("goodbye")){  

  14. break;  

  15. }  

  16. info = br.readLine();  

  17. dos.writeUTF(info);  

  18. System.out.println("服务器说:" + info);  

  19. if(info.equals("goodbye")){  

  20. break;  

  21. }  

客户端核心代码如下:

Socket s = new Socket("127.0.0.1",5555);  InputStream is = s.getInputStream();  DataInputStream dis = new DataInputStream(is);  OutputStream os = s.getOutputStream();  DataOutputStream dos = new DataOutputStream(os);  InputStreamReader isr = new InputStreamReader(System.in);   BufferedReader br = new BufferedReader(isr);  String info;  while(true){  info = br.readLine();  System.out.println("客户端说的是:" + info);  dos.writeUTF(info);  if(info.equals("goodbye")){  break;  }  info = dis.readUTF(); //阻塞函数  System.out.println("服务器端说的是:" + info);  if(info.equals("goodbye")){  break;  }  }

服务器端和客户端在while(true)循环处各不相同,服务器端是dis.readUTF(),必须首先读取客户端传过来的信息,才能通过info = br.readLine();dos.writeUTF(info);从键盘中读取信息再发送给客户端。相反,客户端必须首先通过br.readLine();读取键盘信息,才能接收服务器发送来的信息。

思考1:这个简易的聊天程序已经实现了服务器和客户端的信息交互,但此时已经出现了一个必然出现的问题,比如拿服务器端来讲,当服务器通过dos.writeUTF(info)发送消息给客户端后,在while循环体内,他又要执行info = dis.readUTF()代码,而readUTF()是一个阻塞函数,如果客户端没有发送过来,他就阻塞在那个地方,此时下面部分的代码dos.writeUTF(info)就不能执行,即服务器端不能发送消息出去。

Java Socket聊天程序要怎样解决这个问题呢?怎样readUTF()阻塞的同时又可以writeUTF(info)发送出消息呢?显然,一条路径走不通时应该考虑走另一条路,于是,多线程在这里引入了。Procedure2就是这样出来的。

关于如何理解Java Socket聊天程序核心代码问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯