通过socket获取字节流处理时最初使用的是BufferedReader和PrintWriter  这种方式在解析字符串时是比较方便的 但是在处理字节时不够方便最终还是回归到InputStream和OutputStream方式 不使用缓存直接使用字节流操作,一次传输的字节数据在300字节以内,目前没有测试差距会有多大。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Arrays; import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log; public class SocThread extends Thread {
private String ip = "10.0.0.113";
private int port = 6666;
private String TAG = "socket thread";
private int timeout = 10000;
int maxsize = 256; public Socket client = null;
PrintWriter out;
BufferedReader in;
public boolean isRun = true;
Handler inHandler;
Handler outHandler;
Context ctx;
private String TAG1 = "===Send===";
SharedPreferences sp; public SocThread(Handler handlerin, Handler handlerout, Context context) {
inHandler = handlerin;
outHandler = handlerout;
ctx = context;
MyLog.i(TAG, "创建线程socket");
} /**
* 连接socket服务器
*/
public void conn() { try {
initdate();
Log.i(TAG, "连接中……");
client = new Socket(ip, port);
client.setSoTimeout(timeout);// 设置阻塞时间
MyLog.i(TAG, "连接成功");
in = new BufferedReader(new InputStreamReader(
client.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
client.getOutputStream())), true);
MyLog.i(TAG, "输入输出流获取成功");
} catch (UnknownHostException e) {
MyLog.i(TAG, "连接错误UnknownHostException 重新获取");
e.printStackTrace();
conn();
} catch (IOException e) {
MyLog.i(TAG, "连接服务器io错误");
e.printStackTrace();
} catch (Exception e) {
MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());
e.printStackTrace();
}
} public void initdate() {
sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
ip = sp.getString("ipstr", ip);
port = Integer.parseInt(sp.getString("port", String.valueOf(port)));
MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);
} /**
* 实时接受数据
*/
@Override
public void run() {
MyLog.i(TAG, "线程socket开始运行");
conn();
MyLog.i(TAG, "1.run开始");
String line = "";
while (isRun) {
try {
if (client != null) {
MyLog.i(TAG, "2.检测数据");
// 以下是按行直接读取字符流
while ((line = in.readLine()) != null) {
MyLog.i(TAG,
"3.getdata" + line + " len=" + line.length());
MyLog.i(TAG, "4.start set Message");
Message msg = inHandler.obtainMessage();
msg.obj = line;
inHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG1, "5.send to handler");
} } else {
MyLog.i(TAG, "没有可用连接");
conn();
}
} catch (Exception e) {
MyLog.i(TAG, "数据接收错误" + e.getMessage());
e.printStackTrace();
}
}
} /**
* 发送数据
*
* @param mess
*/
public void Send(String mess) {
try {
if (client != null) {
MyLog.i(TAG1, "发送" + mess + "至"
+ client.getInetAddress().getHostAddress() + ":"
+ String.valueOf(client.getPort()));
out.println(mess);//按字符流发送
out.flush();
MyLog.i(TAG1, "发送成功");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 1;
outHandler.sendMessage(msg);// 结果返回给UI处理
} else {
MyLog.i(TAG, "client 不存在");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 0;
outHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG, "连接不存在重新连接");
conn();
} } catch (Exception e) {
MyLog.i(TAG1, "send error");
e.printStackTrace();
} finally {
MyLog.i(TAG1, "发送完毕"); }
} /**
* 关闭连接
*/
public void close() {
try {
if (client != null) {
MyLog.i(TAG, "close in");
in.close();
MyLog.i(TAG, "close out");
out.close();
MyLog.i(TAG, "close client");
client.close();
}
} catch (Exception e) {
MyLog.i(TAG, "close err");
e.printStackTrace();
} }
}

原始字节流读取处理如下

package com.example.testsocket;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; import android.content.Context;
import android.content.SharedPreferences;
import android.os.Handler;
import android.os.Message;
import android.util.Log; public class SocThread extends Thread {
private String ip = "10.0.0.113";
private int port = 6666;
private String TAG = "socket thread";
private int timeout = 10000;
private int maxsize = 256;// 默认接受大小 public Socket client = null;
// PrintWriter out;
// BufferedReader in;
OutputStream out;
InputStream in;
public boolean isRun = true;
Handler inHandler;
Handler outHandler;
Context ctx;
private String TAG1 = "===Send===";
SharedPreferences sp; public SocThread(Handler handlerin, Handler handlerout, Context context) {
inHandler = handlerin;
outHandler = handlerout;
ctx = context;
MyLog.i(TAG, "创建线程socket");
} /**
* 连接socket服务器
*/
public void conn() { try {
initdate();
Log.i(TAG, "连接中……");
client = new Socket(ip, port);
client.setSoTimeout(timeout);// 设置阻塞时间
MyLog.i(TAG, "连接成功");
in = client.getInputStream();
out = client.getOutputStream();
// 以下在字符流时比较好用
// in = new BufferedReader(new InputStreamReader(
// client.getInputStream()));
// out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
// client.getOutputStream())), true);
MyLog.i(TAG, "输入输出流获取成功");
} catch (UnknownHostException e) {
MyLog.i(TAG, "连接错误UnknownHostException 重新获取");
e.printStackTrace();
conn();
} catch (IOException e) {
MyLog.i(TAG, "连接服务器io错误");
e.printStackTrace();
} catch (Exception e) {
MyLog.i(TAG, "连接服务器错误Exception" + e.getMessage());
e.printStackTrace();
}
} public void initdate() {
sp = ctx.getSharedPreferences("SP", ctx.MODE_PRIVATE);
ip = sp.getString("ipstr", ip);
port = Integer.parseInt(sp.getString("port", String.valueOf(port)));
MyLog.i(TAG, "获取到ip端口:" + ip + ";" + port);
} /**
* 实时接受数据
*/
@Override
public void run() {
MyLog.i(TAG, "线程socket开始运行");
conn();
MyLog.i(TAG, "1.run开始");
String line = "";
while (isRun) {
try {
if (client != null) {
MyLog.i(TAG, "2.检测数据");
byte[] temp = new byte[maxsize];// 默认最带为256
int size = 0;
while ((size = in.read(temp)) > 0) {
// -1表示文件结尾
byte[] res = new byte[size];// 默认最带为256
MyLog.i(TAG, "4.start set Message 字节读取");
System.arraycopy(temp, 0, res, 0, size);
for (int i = 0; i < size; i++) {
line += res[i] + " ";
}
MyLog.i(TAG, "3.getdata " + line + " size=" + size);
MyLog.i(TAG, "4.start set Message");
Message msg = inHandler.obtainMessage();
msg.obj = line;
inHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG1, "5.send to handler");
} } else {
MyLog.i(TAG, "没有可用连接");
conn();
}
} catch (Exception e) {
MyLog.i(TAG, "数据接收错误" + e.getMessage());
e.printStackTrace();
}
}
} /**
* 发送数据
*
* @param mess
*/
public void Send(byte[] mess) {
try {
if (client != null) {
MyLog.i(TAG1, "发送" + mess + "至"
+ client.getInetAddress().getHostAddress() + ":"
+ String.valueOf(client.getPort()));
out.write(mess);//按字节发送
out.flush();
MyLog.i(TAG1, "发送成功");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 1;
outHandler.sendMessage(msg);// 结果返回给UI处理
} else {
MyLog.i(TAG, "client 不存在");
Message msg = outHandler.obtainMessage();
msg.obj = mess;
msg.what = 0;
outHandler.sendMessage(msg);// 结果返回给UI处理
MyLog.i(TAG, "连接不存在重新连接");
conn();
} } catch (Exception e) {
MyLog.i(TAG1, "send error");
e.printStackTrace();
} finally {
MyLog.i(TAG1, "发送完毕"); }
} /**
* 关闭连接
*/
public void close() {
try {
if (client != null) {
MyLog.i(TAG, "close in");
in.close();
MyLog.i(TAG, "close out");
out.close();
MyLog.i(TAG, "close client");
client.close();
}
} catch (Exception e) {
MyLog.i(TAG, "close err");
e.printStackTrace();
} }
}

参考:

java 从InputStream 获取字节数组

Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理的更多相关文章

  1. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  2. IO流(字节流,字符流,缓冲流)

    一:IO流的分类(组织架构) 根据处理数据类型的不同分为:字节流和字符流 根据数据流向不同分为:输入流和输出流   这么庞大的体系里面,常用的就那么几个,我们把它们抽取出来,如下图:   二:字符字节 ...

  3. IO 复习字节流字符流拷贝文件

    /* 本地文件 URL 文件拷贝 *//*文本文件拷贝 可以通过 字符流,也可以通过字节流*/ /*二进制文件拷贝 只可以通过字节流*//* 希望这个例子能帮助搞懂 字符流与字节流的区别 */ imp ...

  4. IO—》字节流&字符流

    字节流 一.字节输出流OutputStream OutputStream此抽象类,是表示输出字节流的所有类的超类.操作的数据都是字节,定义了输出字节流的基本共性功能方法. FileOutputStre ...

  5. Java之IO流(字节流,字符流)

    IO流和Properties IO流 IO流是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键, 因而所有 I/O 的主体实际上是内置在操作系统中的.单独的 ...

  6. 【C#IO 操作】stream 字节流|字符流 |比特流

    stream的简介 Stream 所有流的抽象基类. 流是字节序列的抽象,例如文件.输入/输出设备.进程中通信管道或 TCP/IP 套接字. Stream类及其派生类提供这些不同类型的输入和输出的一般 ...

  7. servlet 之 response 回复 字节流 字符流

    重定向 设置状态吗为302  添加响应头Location(告诉他重定向到哪里去)           //response.setStatus(302);         //添加响应头Locatio ...

  8. Java开发笔记(八十五)通过字符流读写文件

    前面介绍了文件的信息获取.管理操作,以及目录下的文件遍历,那么文件内部数据又是怎样读写的呢?这正是本文所要阐述的内容.File工具固然强大,但它并不能直接读写文件,而要借助于其它工具方能开展读写操作. ...

  9. java 输入输出IO流 字节流| 字符流 的缓冲流:BufferedInputStream;BufferedOutputStream;BufferedReader(Reader in);BufferedWriter(Writer out)

    什么是缓冲流: 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率. 图解: 1.字节缓冲流BufferedInputStr ...

随机推荐

  1. HDU 2222(AC自动机模板题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2222 题目大意:多个模式串.问匹配串中含有多少个模式串.注意模式串有重复,所以要累计重复结果. 解题 ...

  2. c#操作excel后关闭excel.exe的方法

    关闭进程 C#和Asp.net下excel进程一被打开,有时就无法关闭,   尤其是website.对关闭该进程有过GC.release等方法,但这些方法并不是在所有情况下均适用.  于是提出了kil ...

  3. UITextFielddelegate委托方法注释

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{         //返回一个BOOL值,指定是否循序文本字段开始编辑     ...

  4. python中迭代器和生成器

    l=[1,2,3,4] for n in l: print n 在看上面这段代码的时候,我们没有显式的控制列表的偏移量,就可以自动的遍历了整个列表对象.那么for 语句是怎么来遍历列表l的呢?要回答这 ...

  5. the thread has exited with code -1073741819

    内存分配异常.无效或冲突.指针存在但指向无效内存区域.

  6. 让VIEWSTATE从页面中完全消失(小技巧)

      VIEWSTATE是个好东西,是asp.net的一大创举,给web开发带来了极大的便利,然后这种便利是一种双刃剑,尤其是在前台页面,大多数前台页面都是用来展示列表数据,和用户交互的地方现在大都采用 ...

  7. 中文编码、字符集,GBK, UTF-8的概念

    字符集指的是什么? 字符集是一个人为的规定,人们用一个小册子规定好"文字字符"与"数字"的对应关系. 其中,每一个字符对应的数组也称其为编码. 例如,ASCII ...

  8. DS实验题 Missile

    题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...

  9. java web基础1Tomcat服务器基本知识

    一.Tomcat安装 (1)先安装JDK,并配置环境变量JAVA_HOME.Tomcat服务器的配置需要JDK的JAVA_HOME环境变量. 并在系统path变量添加%JAVA_HOME%/bin. ...

  10. NEC学习 ---- 布局 -两列, 左侧定宽,右侧自适应

    CSS代码:以下两处代码是NEC中CSS初始化样式和功能性样式.今后的NEC研究中,默认这两处是引用的. /* 这是CSS reset 代码 --- 初始化样式 */ /* reset */ html ...