package com.zxq.tcpudp.tcputils;
/**
* 作者:zhangxq
* 时间:2018/1/8 14:50
* 邮箱:zxqthye@163.com
*/
import android.util.Log;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 在android中线程run干完活,线程就消亡了,但是当连接断的时候,也要跳出循环,线程也消亡
* 因为tcp的连接必须在子线程中完成,所以自定义了一个线程去管理Socket
*/
public class TcpSocket extends Thread{
private int duankouhao=8080;
private InetAddress address;
private Socket socket;
private InputStream inputStream = null;
private TcpMsgManager msgHandler;
private InputStreamReader isr;
private OutputStream outputStream;
public TcpSocket(String ipaddress,int duankou) {
this.duankouhao=duankou;
try {
address = InetAddress.getByName(ipaddress);
} catch (UnknownHostException e) {
e.printStackTrace();
Log.e("TcpManagerThread","UnknownHostException"+e.toString());
}
}
@Override
public void run() {
super.run();
try {
//这行代码一执行就去连接服务器了
socket = new Socket(address,duankouhao);
if(socket.isConnected())
{
Log.e("hahah","socket is connected");
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
msgHandler.sendEmptyMessage(TcpMsgManager.CONN_STATE_SUCCESS);
}
} catch (IOException e) {
e.printStackTrace();
Log.e("TcpManagerThread","IOException"+e.toString());
//这里处理连接失败的业务逻辑;
msgHandler.sendEmptyMessage(TcpMsgManager.CONN_STATE_DEFAUL);
}
if(inputStream!=null)
{
getMessage(inputStream);
}
}
/**
* 读取信息;
*/
public void getMessage(InputStream inputStream)
{
//转为字符流
isr = new InputStreamReader(inputStream);
StringBuilder sb=new StringBuilder();
char[] cbuffer=new char[10];
int len;
try
{
//数据读出来,并且返回数据的长度,这是一个阻塞函数,当流中没有数据的时候就不read了
//因为这是阻塞是函数,无法知道读取结束,需要在消息的后面添加结束符号;本例为”&&“为结束符号;
while ((len= isr.read(cbuffer))!=-1)
{
sb.append(cbuffer,0,len);
if(sb.toString().endsWith("&&"))
{
byte[] bytes = sb.toString().getBytes();
String s = new String(bytes, "utf-8");//解码
Log.e("message",len+"---"+s);
if(msgHandler!=null)
{
msgHandler.message(s);
}
sb.delete(0,sb.length());//清空stringbuilder;
}
}
msgHandler.sendEmptyMessage(TcpMsgManager.CONN_STATE_DUAN);
} catch (IOException e) {
e.printStackTrace();
Log.e("TcpManagerThread","IOException"+e.toString());
//连接断开的时候在车里处理
msgHandler.sendEmptyMessage(TcpMsgManager.CONN_STATE_DUAN);
}finally {
if(isr!=null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void close() {
try {
socket.shutdownInput();
socket.shutdownOutput();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void setMessageHandler(TcpMsgManager handler) {
this.msgHandler = handler;
}
/**
* 发送消息给服务器;
* @param content
*/
public void sendTcpMsg(String content) {
if(outputStream!=null&& socket.isConnected())
{
try {
outputStream.write(content.getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
tcpudp.rar (24个子文件)
tcpudp
src
androidTest
java
com
zxq
tcpudp
ExampleInstrumentedTest.java 758B
test
java
com
zxq
tcpudp
ExampleUnitTest.java 408B
main
AndroidManifest.xml 854B
res
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
drawable
layout
activity_main.xml 1KB
values-w820dp
dimens.xml 364B
values
colors.xml 214B
strings.xml 73B
styles.xml 394B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
java
com
zxq
tcpudp
BaseApplication.java 1KB
tcputils
MessageCallback.java 235B
TcpMsgManager.java 2KB
TcpSocket.java 5KB
MainActivity.java 1KB
msgevent
MsgEventManager.java 1KB
tcpudp.iml 12KB
libs
.gitignore 8B
build.gradle 904B
proguard-rules.pro 654B
共 24 条
- 1
资源评论
启之灵
- 粉丝: 136
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功