iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >在Java中使用Socket通信会遇到哪些问题
  • 751
分享到

在Java中使用Socket通信会遇到哪些问题

javasocketava 2023-05-31 01:05:57 751人浏览 安东尼
摘要

本篇文章给大家分享的是有关在Java中使用Socket通信会遇到哪些问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Socket通信模型如图所示:不管Socket通信的功能有

本篇文章给大家分享的是有关在Java中使用Socket通信会遇到哪些问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Socket通信模型如图所示:

在Java中使用Socket通信会遇到哪些问题

不管Socket通信的功能有多复杂,任何socket通信过程的基本结构都是一样的。

其基本步骤为:

      ①分别在客户端和服务器端创建Socket和ServerSocket实例;服务器端通过.accept()方法等待请求并阻塞。请求收到后,建立连接Socket对象。

      ②通过getInputStream和getOutputStream方法分别在客户端和服务器端打开输入输出流

      ③利用io流进行读写操作

      ④关闭所有的流资源和套接字资源。

其中,编程工作主要集中在第三步,其他的部分代码基本相同。所有步骤都可能抛出IO异常!

我在编写一个简单的socket程序时,使用的Socket通信出现了一个问题:我在客户端写入的数据,在服务器端无法输出。当我从客户端断开连接时,之前写入的所有数据立刻在服务器端输出出来了。经过反复的验证和求解,以下是我的结论和解决方法。希望有同样问题的小伙伴看完可以解决问题。

通过一端的Socket建立了PrintWriter类来写入数据,通过另一端的Socket建立了BufferedReader类来读取数据并输出。

如果数据写入后没有被显示,可能的原因有两种:

一、写入的数据存储在缓冲区中,没有被写入IO流中:

如果不主动的干涉,写入的数据会一直堆在缓冲区中,直到缓冲区满了引发JVM自动刷新缓冲区。显然这不符合我们的需求。对于这种情况,PrintWriter类提供了flush()方法来强制刷新缓冲区,将缓冲区数据写入IO流中。另外,PrintWriter类的构造器有一个参数”boolean autoflush“,这个参数默认为false,如果设置为true,则会开启自动刷新缓冲区功能。但是请注意,这里的自动刷新是有触发条件的,那就是:PrintWriter类写入数据的方法必须是println、printf或者fORMat方法时,才会触发自动刷新。如果是调用write()这类方法写入数据,是不会触发自动刷新的!总结起来,就是三点:autoflush参数设置,write和println方法的选择,flush方法的使用。对这三个进行组合,就能保证在Socket通信的某一端写入数据时,数据一定能成功地写入到IO流中!

二、读取数据使用了readLine()方法,该方法没有正常的结束:

请注意,BufferedReader类的readLine()方法是一个阻塞函数!也就是说,这个方法本身是读取一行数据,但是它自己识别不了什么叫做“一行”!当调用该方法读取完一段数据后,它会阻塞,而不会return它的读取数据。这就是为什么有的时候明明已经刷新了缓冲区正确的写入数据了,还是通过输入流读取数据并显示出来的原因。

对于readLine()方法,它解除阻塞、正确结束并返回读取的值,只有以下几种情况:

      ①读取的数据里含有回车符"\r"或者换行符"\n"或者回车换行符"\r\n";

      ②读取的数据是在另一端通过println方法写入的,因为println方法自带换行符;

      ③BufferedReader类的缓冲区满了,那么JVM会自动刷新缓冲区从而释放“积攒”的数据(但是鉴于默认缓冲区大小为8192个字符,对于小数据量的通信,显然触发不了);

      ④对于读取的数据,写入这些数据的流发生异常或者直接关闭,那么readLine()就会把它吃的数据全部吐出来。这就刚好解释了,为什么在我的程序中,断开客户端Socket连接,服务器端立刻输出所有客户端消息的原因。

综上,在Socket通信过程中,保证某一端输出流的缓冲被刷新,保证另一端的readLine方法能正常停止,即可解决写入的数据在另一端无法输出的问题。

以下是我修改后能成功运行的代码,分别是服务器端Socket和客户端Socket。

over!

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.io.BufferedWriter;import java.io.OutputStreamWriter;public class ShakingServer{ public static void main(String[] args) throws IOException { //创建服务器套接字实例,设置监听端口为2000 ServerSocket server=new ServerSocket(2000); //开始监听客户端的请求,并阻塞 Socket socket=server.accept(); //请求收到后,自动建立连接。通过IO流进行数据传输 System.out.println("连接建立成功"); OutputStream os=socket.getOutputStream(); PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)),true); pw.write("欢迎访问摇头耶稣的世界!"); pw.flush();  //因为我关闭了输出流,所以另一端的readLine方法才正常结束了 socket.shutdownOutput(); InputStream is=socket.getInputStream(); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); while(true) {  String str=br.readLine();  if(str.equals("quit")) {  break;  }  System.out.println("Client said: "+str); } socket.shutdownInput(); //socket.shutdownOutput(); socket.close(); server.close(); }}

--结束END--

本文标题: 在Java中使用Socket通信会遇到哪些问题

本文链接: https://www.lsjlt.com/news/222620.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在Java中使用Socket通信会遇到哪些问题
    本篇文章给大家分享的是有关在Java中使用Socket通信会遇到哪些问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Socket通信模型如图所示:不管Socket通信的功能有...
    99+
    2023-05-31
    java socket ava
  • Java中使用Map会遇到哪些问题
    Java中使用Map会遇到哪些问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下1、“你知道HashMap的工作原理吗?” “你知道HashMap的get()方法的...
    99+
    2023-05-31
    java ava map
  • Timezone类在Java中使用时会遇到哪些问题
    本篇文章给大家分享的是有关Timezone类在Java中使用时会遇到哪些问题 ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。今天遇到了一个比较有意思的问题,从服务器上封装好的j...
    99+
    2023-05-31
    java timezone tim
  • 在Python中使用import .pyd时会遇到哪些问题
    这期内容当中小编将会给大家带来有关在Python中使用import .pyd时会遇到哪些问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python是什么意思Python是一种跨平台的、具有解释性、编译...
    99+
    2023-06-06
  • 在Android中使用Rreact Native时会遇到哪些问题
    这期内容当中小编将会给大家带来有关在Android中使用Rreact Native时会遇到哪些问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Android Rreact Native 常见错误总结&n...
    99+
    2023-05-31
    android rreact native
  • 使用http代理时会遇到哪些问题
    本篇内容主要讲解“使用http代理时会遇到哪些问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用http代理时会遇到哪些问题”吧!1、设置代理IP后,不及待地想要访问下浏览器查下IP,但发现...
    99+
    2023-06-20
  • 租用韩国服务器通常会遇到哪些问题
    租用韩国服务器通常会遇到的问题:1、用户操作不当导致服务器无法正常运行,出现该问题时需要咨询功服务商机房技术人员进行解决;2、韩国服务器被网络恶意攻击导致无法运行,当遇到该问题时,需要及时给服务器升级防御功能,并且做好日常服务器维护措施,确...
    99+
    2022-10-05
  • 独享ip代理使用会遇到哪些问题
    这篇文章主要介绍“独享ip代理使用会遇到哪些问题”,在日常操作中,相信很多人在独享ip代理使用会遇到哪些问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”独享ip代理使用会遇到哪些问题”的疑惑有所帮助!接下来...
    99+
    2023-06-20
  • 在Win10环境中安装Mysql5.7.23时会遇到哪些问题
    本篇文章给大家分享的是有关在Win10环境中安装Mysql5.7.23时会遇到哪些问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、官网下...
    99+
    2022-10-18
  • 使用欧洲免费vps主机会遇到哪些问题
    使用欧洲免费vps主机会遇到的问题有:1、在vps主机上可以安装不同的软件吗;2、vps主机可以安装控制面板吗;3、vps主机能不能...
    99+
    2023-02-08
    欧洲免费vps主机 欧洲vps主机 vps主机
  • 使用ip代理时会遇到哪些常见的问题
    本篇文章为大家展示了使用ip代理时会遇到哪些常见的问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、授权问题很多用户在开通ip代理后,发现API提取链接生成后,无法提取IP,或者提取IP后无法全...
    99+
    2023-06-15
  • cordova使用中遇到的问题有哪些
    这篇文章主要介绍了cordova使用中遇到的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简介Cordova提供了一组设备相关的A...
    99+
    2022-10-19
  • 使用免费海外虚拟主机会遇到哪些问题
    使用免费海外虚拟主机会遇到的问题有:1、技术类问题,网页程序报错,可能是服务器配置问题或网站管理后台的用户名密码问题;2、服务类问题,包括网站程序的安装、版本升级、数据转移等;3、安全类问题,如网站遭DDOS攻击或CC攻击,网站内容被网警部...
    99+
    2022-10-13
  • Angular中使用MathJax遇到的问题有哪些
    这篇文章主要介绍了Angular中使用MathJax遇到的问题有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MathJax简介Math...
    99+
    2022-10-19
  • React Navigation使用中遇到的问题有哪些
    小编给大家分享一下React Navigation使用中遇到的问题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!在React Native的开发中,使用到react navigati...
    99+
    2022-10-19
  • 在高防服务器租用时可能会遇到问题有哪些
    在高防服务器可能遇到的问题:1.硬件软件升级问题。2.更换IP问题。3.远程登录问题。 4.系统重装问题。 具体内容如下:一、CPU类的升级,通常的操作方法是不能卸下旧的CPU。 最常见的情况是添加处理器、重新创建新机器,或卸下处...
    99+
    2022-10-20
  • VueAwesomeSwiper在VUE中的使用以及遇到的问题有哪些
    这篇文章主要为大家展示了“VueAwesomeSwiper在VUE中的使用以及遇到的问题有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VueAwesome...
    99+
    2022-10-19
  • 使用DBLink过程中遇到的问题有哪些
    这篇文章给大家分享的是有关使用DBLink过程中遇到的问题有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.     &n...
    99+
    2022-10-18
  • 在java中使用subList时需要注意哪些问题
    在java中使用subList时需要注意哪些问题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. 使用Arrays.asList的注意事项1.1 可能会踩的坑先来看下Ar...
    99+
    2023-06-06
  • 在java中使用Sorted时需要注意哪些问题
    这期内容当中小编将会给大家带来有关在java中使用Sorted时需要注意哪些问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作