Java socke编程 读取信息信息发生阻塞的解决方法

1、该socket联网工具类会导致读取服务端的数据发生阻塞

public class ConnectToServer {
	private static boolean D=true;
	private static InputStream mInputStream;
	private static OutputStream mOutputStream;

	public ConnectToServer() {
		// TODO Auto-generated constructor stub
	}
	/**
	 * 建立TCP连接
	 * @param ip 服务端ip
	 * @param port 端口
	 */
	public static Socket conn(String ip,int port){
		try {

			Socket	socket=new Socket(InetAddress.getByName(ip), port);
			if(D){
				Log.i("Socket", (socket==null)+"");
			}

					return socket;

			} catch (Exception e) {
				// TODO: handle exception
			}

		return null;

	}

	/**
	 *  把数据msg发送到服务端
	 * @param socket
	 * @param msg 待发送的数据
	 */
	public static void sendReq(Socket socket,byte[] msg){
		try {
			mOutputStream=socket.getOutputStream();
			mOutputStream.write(msg);
			mOutputStream.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 从服务端返回的数据
	 * @param socket
	 * @return
	 */
	public static byte[] recData( Socket socket){
		int count = 0;
		try {
			mInputStream=socket.getInputStream();
			byte[] inDatas = null;
			while (count == 0) {
				count = mInputStream.available();
			}
			inDatas = new byte[count];
			mInputStream.read(inDatas);
			return inDatas;

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		return null;

	}
	/**
	 *  关闭连接释放资源
	 * @param socket
	 */
	public static void closeConn(Socket socket){
		if(mOutputStream!=null){
			try {
				mOutputStream.close();
				mOutputStream=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		if(mInputStream!=null){
			try {
				mInputStream.close();
				mInputStream=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		if(socket!=null){
			try {
				socket.close();
				socket=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}

2、在读取服务端数据的时候,如果一段时间后没有读取到数据,则关闭连接释放资源。(本工具类以5秒为例)

public class ConnectToServer {
	private static boolean D=true;
	private static InputStream mInputStream;
	private static OutputStream mOutputStream;

	public ConnectToServer() {
		// TODO Auto-generated constructor stub
	}
	/**
	 * 建立TCP连接
	 * @param ip 服务端ip
	 * @param port 端口
	 */
	public static Socket conn(String ip,int port){
		try {

			Socket	socket=new Socket(InetAddress.getByName(ip), port);

					return socket;

			} catch (Exception e) {
				Log.i("异常信息", e.toString());
			}

		return null;

	}

	/**
	 *  把数据msg发送到服务端
	 * @param socket
	 * @param msg 待发送的数据
	 */
	public static void sendReq(Socket socket,byte[] msg){
		try {
			mOutputStream=socket.getOutputStream();
			mOutputStream.write(msg);
			mOutputStream.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/**
	 * 从服务端返回的数据
	 * @param socket
	 * @return
	 */
	public static byte[] recData( Socket socket){
		int count = 0;
		try {
			mInputStream=socket.getInputStream();

			byte[] inDatas = null;
			while (count == 0) {
				count = mInputStream.available();
				try {
					//5秒后无响应
					Thread.sleep(5000);
					if(mInputStream.available()==0){
						//关闭连接释放资源
						closeConn(socket);
						break;
					}
				} catch (Exception e) {
					// TODO: handle exception
				}
				if(D){
					Log.i("读取服务端数据", mInputStream.available()+"");
				}
			}
			if(count==0){
				return null;
			}else{
				inDatas = new byte[count];
				mInputStream.read(inDatas);
				return inDatas;
			}

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		return null;

	}
	/**
	 *  关闭连接释放资源
	 * @param socket
	 */
	public static void closeConn(Socket socket){
		if(mOutputStream!=null){
			try {
				mOutputStream.close();
				mOutputStream=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		if(mInputStream!=null){
			try {
				mInputStream.close();
				mInputStream=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		if(socket!=null){
			try {
				socket.close();
				socket=null;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}

}
时间: 2024-07-28 16:57:52

Java socke编程 读取信息信息发生阻塞的解决方法的相关文章

编程中遇到的Python错误和解决方法汇总整理

这篇文章主要介绍了自己编程中遇到的Python错误和解决方法汇总整理,本文收集整理了较多的案例,需要的朋友可以参考下 开个贴,用于记录平时经常碰到的Python的错误同时对导致错误的原因进行分析,并持续更新,方便以后查询,学习.知识在于积累嘛!微笑+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++错误: 复制代码代码如下: >>> def f(x, y):      print x, y  >>> t

【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题.怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时,如果 xxx.csv 文件使用的是 UTF-8 编码,不会有什么问题.当然,个人认为尽量使用 UTF-8 编码,可以在同一编码内使用各国文字. 但是,如果 xxx.csv 文件使用的是 utf-8 编码,使用 Microsoft Excel 打开的时候,可能会出现乱码,因为国内的 Excel 默认使用 GB2312 打开,而且在打开的时候不能选

.net安装部署“Error 1001 在初始化安装时发生异常” 的解决方法

状况描述:打包安装后,如果删除安装目录中的某个文件,这时从桌面快捷方式启动软件系统会自动运行修复程序,此时因为路径问题会报出"错误 1001 在初始化安装时发生异常xxx"的异常.(前提是你的安装部署中加入了"自定义操作",并为其传值). 查找原因原来是"自定义操作"中CustomActionData值有误造成.未出错前的CustomActionData. /DbName=[DBNAME] /ServerName=[SERVERNAME] /Us

14.04麒麟为/检查磁盘时发生严重错误的解决方法

14.04麒麟为/检查磁盘时发生严重错误的解决方法 临时更改引导参数进入系统 进入Ubuntu启动菜单时,光标选中 *Ubuntu 后,按键盘上的 e 键,即可进入启动项编辑模式: 使用光标定位到如下图所示位置,将 ro 改成 rw 后,按 F10 键,即可按照修改后的参数引导进入系统: 修改启动项配置文件 点击左侧最上方按钮,然后输入 终端 ,然后点击进入 终端 程序: 输入 sudo gedit /etc/grub.d/10_lupin 后回车: 输入用户密码后回车,即可调用文本编辑器打开启

java中两double相加精度丢失问题及解决方法

在讨论两位double数0.1和0.2相加时,毫无疑问他们相加的结果是0.2.但是问题总是如此吗? 下面我们让下面两个doubles数相加,然后看看输出结果: @Test public void testBig(){ System.out.println(0.11+2001299.32); } 控制台输出2001299.4300000002 我们吃惊的发现,结果并不是我们预想的那样,这是为什么呢?又如何解决呢? 现贴出BigDecimal的一个构造函数的文档供大家参考 BigDecimal pu

java compiler 与 facet doesn't match 错误的解决方法

java compiler 与 facet doesn't match 错误的解决方法 原文地址:https://www.cnblogs.com/CrisZjie180228/p/9319772.html

(蓝牙)网络编程中,使用InputStream read方法读取数据阻塞的解决方法

问题如题,这个问题困扰了我好几天,今天终于解决了,感谢[1]. 首先,我要做的是android手机和电脑进行蓝牙通信,android发一句话,电脑端程序至少就要做到接受到那句话.android端发送信息的代码如下: try { Log.i("Test", "begin saying hello world"); String test = "Hello world, I am james"; outputStream.write(test.get

Mac OS X 10.12.5下Anaconda中JupyterNotebook出现"不理解“open location”信息。 (-1708)"错误的解决方法

在更新Mac OS X 10.12.5后,发现当通过Anaconda打开JupyterNotebook时出现了以下错误,而且JupyterNotebook并没有通过浏览器启动 我们退出Anaconda,系统提示是否退出JupyterNotebook,这说明JupyterNotebook已经在8888端口上运行了 我们在浏览器地址栏输入(http://localhost:8888)就可以跳转到JupyterNotebook页面,但此时我们会发现页面要求我们输入密码 但这个密码之前并没有被设置过,尝

出现 java.net.ConnectException: Connection refused 异常的原因及解决方法

1 异常描述 在启动 Tomcat 服务器的时候,控制台一直输出异常信息,然后停止服务器,报出如下异常: 2 异常原因 通过观察上图中被标记出来的异常信息,咱们可以知道 java.net.ConnectException: Connection refused 此异常,为:连接被拒绝异常. 之前也在网上搜索过该异常出现的原因,大多数人给出的答案是端口号被占用,或者在启动本次 Tomcat 服务器之前"关闭"的 Tomcat 服务器没有被彻底关闭,因此才导致此异常的发生.也就是说,此异常