iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Java中socket使用getInputStream()阻塞问题怎么解决
  • 435
分享到

Java中socket使用getInputStream()阻塞问题怎么解决

2023-06-22 01:06:00 435人浏览 泡泡鱼
摘要

这篇文章主要介绍“Java中Socket使用getInputStream()阻塞问题怎么解决”,在日常操作中,相信很多人在Java中socket使用getInputStream()阻塞问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简

这篇文章主要介绍“Java中Socket使用getInputStream()阻塞问题怎么解决”,在日常操作中,相信很多人在Java中socket使用getInputStream()阻塞问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中socket使用getInputStream()阻塞问题怎么解决”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

socket使用getInputStream()阻塞

今天用socket进行编程练习时,发现程序到了getInputStream()这里就进行不下去了

Socket socket = new Socket("127.0.0.1", 800);ObjectInputStream reader = new ObjectInputStream(socket.getInputStream());System.out.println("a");ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream());

就这样的一个测试代码,a不会打印出来

后来发现是getInputStream()会一直阻塞在那里阻塞

我把两行代码调了一下就好了,还不太清楚原因,先记下来

Socket socket = new Socket("127.0.0.1", 800);ObjectOutputStream writer = new ObjectOutputStream(socket.getOutputStream());System.out.println("a");ObjectInputStream reader = new ObjectInputStream(socket.getInputStream());

线程解决Socket的getInputStream阻塞

1.背景

在Socket通信中,当我们希望传输对象时,往往会用到输入/输出对象流。

ObjectInputStream in=new ObjectInputStream(socket.getInputStream());ObjectOutputStream out=new ObjectOutputStream(socket.getOutputStream());

2.问题

当程序调用socket.getInputStream()程序被被卡住。

3.原因

socket.getInputStream()方法会导致程序阻塞,直到inputStream收到对方发过来的报文消息,程序才会继续往下执行。

public ObjectInputStream(InputStream in) throws ioException的官方api显示:

Creates an ObjectInputStream that reads from the specified InputStream. A serialization stream header is read from the stream and verified. This constructor will block until the corresponding ObjectOutputStream has written and flushed the header. [1]

4.解决办法

用线程的方式处理输入流。以下为示例代码:

//===============客户端代码 SocketClient.java=====================

import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.Socket;import java.net.UnknownHostException;  public class SocketClient {private Socket socket;private ObjectOutputStream out;private ObjectInputStream in;public SocketClient(){try {socket=new Socket("localhost",8081);out=new ObjectOutputStream(socket.getOutputStream());ReadThread readThread=new ReadThread();readThread.start();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void sendMessage(String msg){System.out.println("send message:"+msg);try {out.writeObject(msg);out.flush();} catch (IOException e) {e.printStackTrace();}}class ReadThread extends Thread{boolean runFlag=true;public void run(){try {in=new ObjectInputStream(socket.getInputStream());} catch (IOException e1) {e1.printStackTrace();}while(runFlag){if(socket.isClosed()){return;}try {Object obj=in.readObject();if(obj instanceof String){System.out.println("Client recive:"+obj);}} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}}public void exit(){runFlag=false;}}public static void main(String[] args) {SocketClient socketClient=new SocketClient();System.out.println("build socketClient");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}socketClient.sendMessage("Hello first.");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}socketClient.sendMessage("Hello second.");} }

//============服务器端代码 SocketService.java===========

import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.net.SocketException;import java.util.Date; public class SocketService {ServerSocket serverSocket;public SocketService(){try {serverSocket=new ServerSocket(8081);while(true){Socket socket=serverSocket.accept();SocketServiceThread sst=new SocketServiceThread(socket);sst.start();}} catch (IOException e) {e.printStackTrace();}}class SocketServiceThread extends Thread{Socket socket;ObjectInputStream in;ObjectOutputStream out;boolean runFlag=true;public SocketServiceThread(Socket socket){if(null==socket){runFlag=false;return;}this.socket=socket;try {out=new ObjectOutputStream(socket.getOutputStream());} catch (IOException e) {e.printStackTrace();}}public void run(){if(null==socket){System.out.println("socket is null");return;}try {in=new ObjectInputStream(socket.getInputStream());while(runFlag){if(socket.isClosed()){System.out.println("socket is closed");return;}try {String obj=(String)in.readObject();if(obj instanceof String){System.out.println("Server recive:"+obj);Date date=new Date();out.writeObject("["+date+"]"+obj);out.flush();}else{System.out.println("Server recive:"+obj);}} catch (ClassNotFoundException e) {e.printStackTrace();}catch (SocketException e){e.printStackTrace();return;}catch (IOException e){e.printStackTrace();}}} catch (IOException e1) {e1.printStackTrace();return;} catch (Exception e){return;}}public void exit(){runFlag=false;}}public static void main(String[] args) {System.out.println("===============start service===============");new SocketService();} }

5.Socket通信注意事项

(1).writeXXX()方法后一般用flush()来把缓存内容发送出去。

(2).发送对象时,对象必须串行化,即该对象需要实现Serializable接口。

到此,关于“Java中socket使用getInputStream()阻塞问题怎么解决”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Java中socket使用getInputStream()阻塞问题怎么解决

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

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

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

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

下载Word文档
猜你喜欢
  • 解决Java中socket使用getInputStream()阻塞问题
    目录socket使用getInputStream()阻塞用线程解决Socket的getInputStream阻塞1.背景2.问题3.原因4.解决办法5.Socket通信注意事项soc...
    99+
    2024-04-02
  • Java中socket使用getInputStream()阻塞问题怎么解决
    这篇文章主要介绍“Java中socket使用getInputStream()阻塞问题怎么解决”,在日常操作中,相信很多人在Java中socket使用getInputStream()阻塞问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简...
    99+
    2023-06-22
  • 怎么解决TCP socket的阻塞问题
    小编给大家分享一下怎么解决TCP socket的阻塞问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!解决TCP socket的阻塞问题大家知道,tcp...
    99+
    2023-06-22
  • 如何解决TCP socket的阻塞问题
    目录解决TCP socket的阻塞问题在异常处理程序当中退出socket连接TCP连接阻塞的监控和处理我们整理出符合该类异常的特征如下如何查看一个连接的创建时间解决TCP socke...
    99+
    2024-04-02
  • Java Socket上的Read操作阻塞问题详解
    目录Socket上的Read操作阻塞问题从Socket上读取对端发过来的数据一般有两种方法总结一下,有这么几个方法Socket编程---read方法阻塞问题Socket上的Read操...
    99+
    2024-04-02
  • Android中bindservice阻塞问题怎么解决
    在Android中,绑定服务(bindService)是一种异步操作,它不会阻塞主线程。但有时候可能会出现与服务通信的操作阻塞了UI...
    99+
    2024-02-29
    Android
  • quartz任务阻塞问题怎么解决
    解决Quartz任务阻塞问题的方法有以下几种:1. 增加线程池大小:默认情况下,Quartz使用一个线程执行任务。如果任务较多或者任...
    99+
    2023-09-18
    quartz
  • java调用process线程阻塞问题的解决
    java调用process线程阻塞问题 项目需求中涉及java调用.bat文件进行图像处理,先直接上简略版程序 public void draw(){ //调用b...
    99+
    2024-04-02
  • tomcat高并发阻塞问题怎么解决
    要解决Tomcat高并发阻塞问题,可以考虑以下几个方面:1. 调整Tomcat配置:增加Tomcat的线程池大小、调整连接超时时间等...
    99+
    2023-10-12
    tomcat
  • 如何解决java调用process线程阻塞的问题
    这篇文章将为大家详细讲解有关 如何解决java调用process线程阻塞的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java调用process线程阻塞问题项目需求中涉及java调用.bat文件进行...
    99+
    2023-06-15
  • java线程阻塞怎么解决
    在Java中,线程阻塞可以通过以下几种方式解决:1. 使用synchronized关键字:通过在代码块或方法上加上synchroni...
    99+
    2023-08-18
    java
  • 怎么解决MySQL 5.7中定位DDL被阻塞的问题
    这篇文章主要为大家展示了“怎么解决MySQL 5.7中定位DDL被阻塞的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么解决MySQL 5.7中定位DDL...
    99+
    2024-04-02
  • Java中常用阻塞队列的问题是什么
    本篇内容主要讲解“Java中常用阻塞队列的问题是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中常用阻塞队列的问题是什么”吧!Java常用阻塞队列ArrayBlockingQueue...
    99+
    2023-06-29
  • Java中常用阻塞队列的问题小结
    Java常用阻塞队列 ArrayBlockingQueue 内部由一个固定长度的数组来实现阻塞队列 final Object[] items; int takeIndex; ...
    99+
    2024-04-02
  • Java阻塞队列BlockingQueue怎么使用
    本篇内容介绍了“Java阻塞队列BlockingQueue怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一. 前言在新增的Concu...
    99+
    2023-07-02
  • C#中定时任务被阻塞问题的解决方法
    目录1.摘要2.C#中定时任务的最简方法3.定时任务阻塞现象4.阻塞现象原因分析5.问题解决总结1.摘要 本文会介绍一个C#中最简单定时任务的使用方法,以及会遇到的定时任务被阻塞现...
    99+
    2024-04-02
  • MySQL 中定位 DDL 被阻塞的问题及解决方案
    DDL 被阻塞了,如何找到阻塞它的 SQL 经常碰到开发、测试童鞋会问,线下开发、测试环境,执行了一个DDL,发现很久都没有执行完,是不是被阻塞了?要怎么解决? 包括在群里,也经常会...
    99+
    2024-04-02
  • 解决Go语言Websocket应用程序中的线程阻塞问题
    解决Go语言Websocket应用程序中的线程阻塞问题在开发Web应用程序时,使用Websocket是一种非常常见和流行的方式。它可以建立持久的连接,并在服务器和客户端之间实时通信。然而,有时候我们可能会遇到线程阻塞的问题,这会导致应用程序...
    99+
    2023-12-14
    Go语言 websocket 线程阻塞问题
  • ​java socket通讯中文乱码问题怎么解决
    在Java Socket通讯中,中文乱码问题通常是由于字符编码不一致引起的。可以尝试以下几种解决方案: 统一字符编码:在通讯的两...
    99+
    2023-10-21
    ​java socket
  • MySQL 5.6中怎么定位DDL被阻塞的问题
    这篇文章将为大家详细讲解有关MySQL 5.6中怎么定位DDL被阻塞的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对于DDL被阻塞问题的定位,我们主要是基于MySQ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作