Android使用socket通信并实现ios 每隔一段时间执行读取一条数据

Android中Socket通信的实现方法概述
投稿:shichen2014
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android中Socket通信的实现方法,很有实用价值,需要的朋友可以参考下
本文实例简述了Android中Socket通信的实现方法,具体内容如下:
一、socket通信概述
通俗的来说套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
总之一句话,socket是对TCP/IP协议的封装。
二、使用Socket步骤(client):
1、建立Socket(Tcp)连接
在Java中建立Socket连接是相当容易的事情,使用类库提供的Socket类就可以实现。
Socketclient= //表示客户端
client=newSocket("localhost",5000);
2、发送数据
PrintStreamout=newPrintStream(socket.getOutputStream()); //发送数据,PrintStream最方便
3、接收返回信息
buf=newBufferedReader(newInputStreamReader(socket.getInputStream()));; //一次性接收完成读取Socket的输入流,在其中读出返回信息
4、关闭Socket
Socket.close();
三、补充:
Socketsever端(非多线程实现)
ServerSocketserver= //定义ServerSocket类
Socketclient= //表示客户端
PrintStreamout= //打印流输出最方便
server=newServerSocket(8888); //服务器在8888端口上监听
System.out.println("服务器运行,等待客户端连接。");
client=server.accept(); //得到连接,程序进入到阻塞状态
Stringstr="helloworld"; //表示要输出的信息
out=newPrintStream(client.getOutputStream());
out.println(str); //向客户端输出信息
client.close();
server.close();
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Android开发系列之阿堂教程:谈谈Socket通信的简单应用
Android开发系列之阿堂教程:谈谈Socket通信的简单应用
[摘要:由 于Android的运用开辟,是基于Java说话去开辟的, 以是Android完整支撑JDK自身的TCP,UPD收集通讯API,也能够应用ServerSocket,Socket去设立建设基于TCP/IP协定的 收集通讯;也能够应用DatagramSocket,Datagra]
&&& 由于Android的应用开发,是基于Java语言来开发的, 所以Android完全支持JDK本身的TCP,UPD网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的 网络通信;也可以使用DatagramSocket,Datagrampacket,MulticastSocket来建立基于UPD协议的网络通 信。&&&&&&&&&&&&&&
& & 关于TCP/IP通信协议方面的内容,阿堂很早以前就在技术博客.cn/heyitag中就有"基于TCP协议的网络编程学习笔记(1)"和"基于TCP协议的网络编程学习笔记(2)"两篇文章的分享,这里就不再重复罗嗦了,有兴趣的网友可以去阿堂的博客上查看。
&&&& 阿堂下面是从考虑一个简单的C/S聊天室的应用,来和网友一起看看Android是如何实现和服务端进行网络通信(如TCP/IP)。
基本流程如下 1.Java服务端: 包含多条线程,每个Socket对应一条线程,该线程负责读取Socket对应输入流的数据(从客户端发过来的数据,可以是 Android,IOS,Telnet等),并将读到的数据向每个Socket输出流发送一遍(将一个客户端发来的数据广播给其它客户),因此需要在服务 端使用List来保存所有的Socket。 2.Android客户端:包含两条线程,一条线程负责生成主界面,并响应用户动作,并将用户输入的数据写入Socket对应的输出流中;另一条线程负责读取Socket对应输入流中的数据(从服务端发送过来的数据),并负责将这些数据在程序界面上显示出来。(为了说明多个客户端交互,阿堂实际上在下述测试demo中还用了Telnet配合测试)
&&&&&&&&&&&&由于阿堂这里主要是想说明的Android客户端和服务端的网络通信,此demo实现比较简单,阿堂就直接放上测试效果图,后面再附上代码。对此demo不再作特殊说明了,如果有疑问的网友可以在后面留言,我会给予解答。
Java服务端代码 import java.net.*; import java.io.*; import java.util.*; public class MyServer { &&& //定义保存所有Socket的ArrayList &&& public static ArrayList socketList &&& &&& = new ArrayList(); &&& public static void main(String[] args) &&& &&& throws IOException &&& { &&&&&&& ServerSocket ss = new ServerSocket(30000); &&& &&& while(true) &&& &&& { &&& &&& &&& //此行代码会阻塞,将一直等待别人的连接&&&&&&&&&&&
&&& &&& &&& Socket s = ss.accept(); &&&&&&&&&&& System.out.println("s = "+s); &&& &&& &&& socketList.add(s); &&&&&&&&&&& System.out.println("socketList.size() = "+socketList.size()); &&& &&& &&& //每当客户端连接后启动一条ServerThread线程为该客户端服务 &&& &&& &&& new Thread(new ServerThread(s)).start(); &&& &&& } &&& } }
import java.io.*; import java.net.*; import java.util.*; //负责处理每个线程通信的线程类 public class ServerThread implements Runnable { &&& //定义当前线程所处理的Socket &&& Socket s = &&& //该线程所处理的Socket所对应的输入流 &&& BufferedReader br = &&& public ServerThread(Socket s) &&& &&& throws IOException &&& { &&& &&& this.s = &&& &&& //初始化该Socket对应的输入流 &&& &&& br = new BufferedReader(new InputStreamReader( &&& &&& &&& s.getInputStream() , "utf-8"));&& &&& } &&& public void run() &&& { &&& &&& try &&& &&& { &&& &&& &&& String content = &&& &&& &&& //采用循环不断从Socket中读取客户端发送过来的数据 &&& &&& &&& while ((content = readFromClient()) != null) &&& &&& &&& { &&& &&& &&& &&& //遍历socketList中的每个Socket, &&& &&& &&& &&& //将读到的内容向每个Socket发送一次 &&& &&& &&& &&& for (Socket s : MyServer.socketList) &&& &&& &&& &&& { &&& &&& &&& &&& &&& OutputStream os = s.getOutputStream(); &&& &&& &&& &&& &&& os.write((content + "n").getBytes("utf-8")); &&& &&& &&& &&& } &&& &&& &&& } &&& &&& } &&& &&& catch (IOException e) &&& &&& { &&& &&& &&& e.printStackTrace(); &&& &&& } &&& } &&& //定义读取客户端数据的方法 &&& private String readFromClient() &&& { &&& &&& try &&& &&& { &&& &&& &&& return br.readLine();&&&
&&& &&& } &&& &&& //如果捕捉到异常,表明该Socket对应的客户端已经关闭 &&& &&& catch (IOException e) &&& &&& { &&& &&& &&& //删除该Socket。 &&& &&& &&& MyServer.socketList.remove(s);&&&
&&& &&& } &&& &&& &&& } }
Android客户端代码
import java.io.OutputS import java.net.S import android.app.A import android.os.B import android.os.H import android.os.M import android.view.V import android.view.View.OnClickL import android.widget.B import android.widget.EditT
public class MultiThreadClient extends Activity { &&& // 定义界面上的两个文本框 &&& EditText input, &&& // 定义界面上的一个按钮 &&& B &&& OutputS &&& H
&&& @Override &&& public void onCreate(Bundle savedInstanceState) &&& { &&& &&& super.onCreate(savedInstanceState); &&& &&& setContentView(R.layout.main); &&& &&& input = (EditText) findViewById(R.id.input); &&& &&& send = (Button) findViewById(R.id.send); &&& &&& show = (EditText) findViewById(R.id.show); &&& &&& S &&& &&& handler = new Handler() &&& &&& { &&& &&& &&& @Override &&& &&& &&& public void handleMessage(Message msg) &&& &&& &&& { &&& &&& &&& &&& // 如果消息来自于子线程 &&& &&& &&& &&& if (msg.what == 0x123) &&& &&& &&& &&& { &&& &&& &&& &&& &&& // 将读取的内容追加显示在文本框中 &&& &&& &&& &&& &&& show.append("n" + msg.obj.toString()); &&& &&& &&& &&& } &&& &&& &&& } &&& &&& }; &&& &&& try &&& &&& { &&& &&& &&& s = new Socket("192.168.6.100", 30000); &&& &&& &&& // 客户端启动ClientThread线程不断读取来自服务器的数据 &&& &&& &&& new Thread(new ClientThread(s, handler)).start(); &&& &&& &&& os = s.getOutputStream(); &&& &&& } &&& &&& catch (Exception e) &&& &&& { &&& &&& &&& e.printStackTrace(); &&& &&& } &&& &&& send.setOnClickListener(new OnClickListener() &&& &&& { &&& &&& &&& @Override &&& &&& &&& public void onClick(View v) &&& &&& &&& { &&& &&& &&& &&& try &&& &&& &&& &&& { &&& &&& &&& &&& &&& // 将用户在文本框内输入的内容写入网络 &&& &&& &&& &&& &&& os.write((input.getText().toString() + "rn") &&& &&& &&& &&& &&& &&& .getBytes("utf-8")); &&& &&& &&& &&& &&& // 清空input文本框 &&& &&& &&& &&& &&& input.setText(""); &&& &&& &&& &&& } &&& &&& &&& &&& catch (Exception e) &&& &&& &&& &&& { &&& &&& &&& &&& &&& e.printStackTrace(); &&& &&& &&& &&& } &&& &&& &&& } &&& &&& }); &&& } }
import java.io.BufferedR import java.io.IOE import java.io.InputStreamR import java.net.S
import android.os.H import android.os.M public class ClientThread implements Runnable { &&& //该线程负责处理的Socket &&& private S &&& private H &&& //该线程所处理的Socket所对应的输入流 &&& BufferedReader br = &&& public ClientThread(Socket s , Handler handler) &&& &&& throws IOException &&& { &&& &&& this.s = &&& &&& this.handler = &&& &&& br = new BufferedReader( &&& &&& &&& new InputStreamReader(s.getInputStream())); &&& } &&& public void run() &&& { &&& &&& try &&& &&& { &&& &&& &&& String content = &&& &&& &&& //不断读取Socket输入流中的内容。 &&& &&& &&& while ((content = br.readLine()) != null) &&& &&& &&& { &&& &&& &&& &&& // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据 &&& &&& &&& &&& Message msg = new Message(); &&& &&& &&& &&& msg.what = 0x123; &&& &&& &&& &&& msg.obj = &&& &&& &&& &&& handler.sendMessage(msg); &&& &&& &&& } &&& &&& } &&& &&& catch (Exception e) &&& &&& { &&& &&& &&& e.printStackTrace(); &&& &&& } &&& } }
感谢关注 Ithao123C/c++频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
随着国内互联网的发展,产品经理岗位需求大幅增加,在国内,从事产品工作的大部分岗位为产品经理,其实现实中,很多从事产品工作的岗位是不能称为产品经理,主要原因是对产品经理的职责不明确,那产品经理的职责有哪些,本专题将详细介绍产品经理的主要职责
IThao123周刊Socket通信中如何实现用队列发送数据
[问题点数:40分,无满意结帖,结帖人Kern_]
Socket通信中如何实现用队列发送数据
[问题点数:40分,无满意结帖,结帖人Kern_]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2015年9月 移动开发大版内专家分月排行榜第二2015年6月 移动开发大版内专家分月排行榜第二2014年12月 移动开发大版内专家分月排行榜第二2014年7月 移动开发大版内专家分月排行榜第二2013年12月 移动开发大版内专家分月排行榜第二2013年11月 移动开发大版内专家分月排行榜第二2013年10月 移动开发大版内专家分月排行榜第二
2014年11月 移动开发大版内专家分月排行榜第三2014年2月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Android中使用socket通信实现消息推送的方法详解
作者:Jimstin
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android中使用socket通信实现消息推送的方法,文中举了一个消息发送端和一个消息接收端以及服务器端的例子来说明原理并且展示了客户端的实现,需要的朋友可以参考下
最近用socket写了一个消息推送的demo,在这里和大家分享一下。
主要实现了:一台手机向另外一台手机发送消息,这两台手机可以随时自由发送文本消息进行通信,类似我们常用的QQ。
原理:手机通过socket发送消息到服务器,服务器每接收到一条消息之后,都会把这条消息放进一个messageList里面,服务器会不停地检测messageList是否含有消息,如果有的话就会根据messageList里面item的数据,推送到相应的另一端手机上面。
下面简单画了一个图来说明这个原理:
演示:手机客户端client1发送消息msg1到手机客户端client2,client2收到消息后回复msg2给client1
1.手机客户端client1发送一条“msg1”的文本消息到服务器;
2.服务器收到来自client1的“msg1”消息后,把它add进messageList里面;
3.服务器检测到messageList里面含有消息(开启服务器时就新建里一个检测messageList的线程,线程里面有一个死循环,用于不停检测messageList是否含有消息);
4.服务器读取消息数据,如读取到来自client1发给client2的消息“msg1”,那么服务器就把“msg1”推送到client2上;
5.client2检测到服务器推送的消息,做出相应的操作(如:震动、铃声、显示消息等);
6.client2接收到来自服务器推送的“msg1”消息后,client2也回复一条文本消息“msg2”给client1,此过程和client1发送消息给client2一样。
7.最后,client2就可以显示来自client1发送的消息“msg1”,而client1则可以显示来自client2的回复消息“msg2”。
根据消息推送的原理图,我们的实现过程主要分为Server端和Client端,Server端采用Java的编程,而Client端则用Android编程。
所以在这里也分别创建了两个工程SocketServer和SocketClient
我们先来看一下SocketMessage.java类:
public class SocketMessage {
//socketID,指发送给谁
//socketID,指谁发送过来的
public S//消息内容
public S//接收时间
public SocketT//socketThread下面有介绍
该类是一个消息类,用于表示消息是由谁发给谁的、消息内容是什么、接收时间是多少,只有几个属性,比较简单。
而MyServer.java类就相对比较多一些代码:
package com.jimstin.
import java.io.BufferedR
import java.io.BufferedW
import java.io.InputStreamR
import java.io.OutputStreamW
import java.net.ServerS
import java.net.S
import java.text.SimpleDateF
import java.util.ArrayL
import java.util.D
import org.json.JSONO
import com.jimstin.msg.SocketM
public class MyServer {
private boolean isStartS
private ServerSocket mS
* 消息队列,用于保存SocketServer接收来自于客户机(手机端)的消息
private ArrayList&SocketMessage& mMsgList = new ArrayList&SocketMessage&();
* 线程队列,用于接收消息。每个客户机拥有一个线程,每个线程只接收发送给自己的消息
private ArrayList&SocketThread& mThreadList = new ArrayList&SocketThread&();
* 开启SocketServer
private void startSocket() {
isStartServer =
int prot = 2000;//端口可以自己设置,但要和Client端的端口保持一致
mServer = new ServerSocket(prot);//创建一个ServerSocket
System.out.println("启动server,端口:"+prot);
Socket socket =
int socketID = 0;//Android(SocketClient)客户机的唯一标志,每个socketID表示一个Android客户机
//开启发送消息线程
startSendMessageThread();
//用一个循环来检测是否有新的客户机加入
while(isStartServer) {
//accept()方法是一个阻塞的方法,调用该方法后,
//该线程会一直阻塞,直到有新的客户机加入,代码才会继续往下走
socket = mServer.accept();
//有新的客户机加入后,则创建一个新的SocketThread线程对象
SocketThread thread = new SocketThread(socket, socketID++);
thread.start();
//将该线程添加到线程队列
mThreadList.add(thread);
} catch (Exception e) {
e.printStackTrace();
* 开启推送消息线程,如果mMsgList中有SocketMessage,则把该消息推送到Android客户机
public void startSendMessageThread() {
new Thread(){
public void run() {
super.run();
/*如果isStartServer=true,则说明SocketServer已启动,
用一个循环来检测消息队列中是否有消息,如果有,则推送消息到相应的客户机*/
while(isStartServer) {
//判断消息队列中的长度是否大于0,大于0则说明消息队列不为空
if(mMsgList.size() & 0) {
//读取消息队列中的第一个消息
SocketMessage from = mMsgList.get(0);
for(SocketThread to : mThreadList) {
if(to.socketID == from.to) {
BufferedWriter writer = to.
JSONObject json = new JSONObject();
json.put("from", from.from);
json.put("msg", from.msg);
json.put("time", from.time);
//writer写进json中的字符串数据,末尾记得加换行符:"\n",否则在客户机端无法识别
//因为BufferedReader.readLine()方法是根据换行符来读取一行的
writer.write(json.toString()+"\n");
//调用flush()方法,刷新流缓冲,把消息推送到手机端
writer.flush();
System.out.println("推送消息成功:"+from.msg+"&& to socketID:"+from.to);
//每推送一条消息之后,就要在消息队列中移除该消息
mMsgList.remove(0);
Thread.sleep(200);
} catch (Exception e) {
e.printStackTrace();
}.start();
* 定义一个SocketThread类,用于接收消息
public class SocketThread extends Thread {
public int socketID;
public S//Socket用于获取输入流、输出流
public BufferedW//BufferedWriter 用于推送消息
public BufferedR//BufferedReader 用于接收消息
public SocketThread(Socket socket, int count) {
socketID =
this.socket =
System.out.println("新增一台客户机,socketID:"+socketID);
public void run() {
super.run();
//初始化BufferedReader
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
//初始化BufferedWriter
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
//如果isStartServer=true,则说明SocketServer已经启动,
//现在需要用一个循环来不断接收来自客户机的消息,并作其他处理
while(isStartServer) {
//先判断reader是否已经准备好
if(reader.ready()) {
/*读取一行字符串,读取的内容来自于客户机
reader.readLine()方法是一个阻塞方法,
从调用这个方法开始,该线程会一直处于阻塞状态,
直到接收到新的消息,代码才会往下走*/
String data = reader.readLine();
//讲data作为json对象的内容,创建一个json对象
JSONObject json = new JSONObject(data);
//创建一个SocketMessage对象,用于接收json中的数据
SocketMessage msg = new SocketMessage();
msg.to = json.getInt("to");
msg.msg = json.getString("msg");
msg.from = socketID;
msg.time = getTime(System.currentTimeMillis());
//接收到一条消息后,将该消息添加到消息队列mMsgList
mMsgList.add(msg);
System.out.println("收到一条消息:"+json.getString("msg")+" &&&& to socketID:"+json.getInt("to"));
//睡眠100ms,每100ms检测一次是否有接收到消息
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
* 获取指定格式的时间字符串,通过毫秒转换日期
* @param millTime
private String getTime(long millTime) {
Date d = new Date(millTime);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(d);
public static void main(String[] args) {
MyServer server = new MyServer();
server.startSocket();
2.SocketClient工程
该工程是一个Android的工程,只有一个MainActivity.java和activity_main.xml文件,
先看一下activity_main.xml布局文件:
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical" &
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"&
android:id="@+id/ip_edt"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="ip"
android:text="172.16.1.200"/&
android:id="@+id/port_edt"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="port"
android:text="2000"/&
&/LinearLayout&
android:id="@+id/start_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="start"/&
android:id="@+id/socket_id_edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="socketID"/&
android:id="@+id/msg_edt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minLines="5"
android:hint="content"
android:gravity="top"
android:id="@+id/send_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="send"/&
android:id="@+id/console_txt"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/&
android:id="@+id/clear_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="clear"/&
&/LinearLayout&
MainActivity.java类:
package com.jimstin.
import java.io.BufferedR
import java.io.BufferedW
import java.io.IOE
import java.io.InputStreamR
import java.io.OutputStreamW
import java.net.S
import java.net.UnknownHostE
import java.text.SimpleDateF
import java.util.D
import org.json.JSONO
import com.tencent.stat.MtaSDkE
import com.tencent.stat.StatC
import com.tencent.stat.StatS
import android.R.
import android.os.AsyncT
import android.os.B
import android.os.H
import android.os.M
import android.util.L
import android.view.V
import android.view.View.OnClickL
import android.widget.EditT
import android.widget.TextV
import android.widget.T
import android.app.A
public class MainActivity extends Activity implements OnClickListener {
private EditText mIPEdt, mPortEdt, mSocketIDEdt, mMessageE
private static TextView mConsoleT
private static StringBuffer mConsoleStr = new StringBuffer();
private Socket mS
private boolean isStartRecieveM
private SocketHandler mH
protected BufferedReader mR//BufferedWriter 用于推送消息
protected BufferedWriter mW//BufferedReader 用于接收消息
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
private void initView() {
mIPEdt = (EditText) findViewById(R.id.ip_edt);
mPortEdt = (EditText) findViewById(R.id.port_edt);
mSocketIDEdt = (EditText) findViewById(R.id.socket_id_edt);
mMessageEdt = (EditText) findViewById(R.id.msg_edt);
mConsoleTxt = (TextView) findViewById(R.id.console_txt);
findViewById(R.id.start_btn).setOnClickListener(this);
findViewById(R.id.send_btn).setOnClickListener(this);
findViewById(R.id.clear_btn).setOnClickListener(this);
mHandler = new SocketHandler();
* 初始化socket
private void initSocket() {
//新建一个线程,用于初始化socket和检测是否有接收到新的消息
Thread thread = new Thread(new Runnable() {
public void run() {
String ip = mIPEdt.getText().toString();//IP
int port = Integer.parseInt(mPortEdt.getText().toString());//Socket
isStartRecieveMsg =
mSocket = new Socket(ip, port);
mReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(), "utf-8"));
mWriter = new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(), "utf-8"));
while(isStartRecieveMsg) {
if(mReader.ready()) {
/*读取一行字符串,读取的内容来自于客户机
reader.readLine()方法是一个阻塞方法,
从调用这个方法开始,该线程会一直处于阻塞状态,
直到接收到新的消息,代码才会往下走*/
String data = mReader.readLine();
//handler发送消息,在handleMessage()方法中接收
mHandler.obtainMessage(0, data).sendToTarget();
Thread.sleep(200);
mWriter.close();
mReader.close();
mSocket.close();
} catch (Exception e) {
e.printStackTrace();
thread.start();
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_btn:
case R.id.clear_btn:
mConsoleStr.delete(0, mConsoleStr.length());
mConsoleTxt.setText(mConsoleStr.toString());
case R.id.start_btn:
if(!isStartRecieveMsg) {
initSocket();
private void send() {
new AsyncTask&String, Integer, String&() {
protected String doInBackground(String... params) {
sendMsg();
}.execute();
* 发送消息
protected void sendMsg() {
String socketID = mSocketIDEdt.getText().toString().trim();
String msg = mMessageEdt.getText().toString().trim();
JSONObject json = new JSONObject();
json.put("to", socketID);
json.put("msg", msg);
mWriter.write(json.toString()+"\n");
mWriter.flush();
mConsoleStr.append("我:" +msg+"
"+getTime(System.currentTimeMillis())+"\n");
mConsoleTxt.setText(mConsoleStr);
} catch (Exception e) {
e.printStackTrace();
static class SocketHandler extends Handler {
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
switch (msg.what) {
//将handler中发送过来的消息创建json对象
JSONObject json = new JSONObject((String)msg.obj);
mConsoleStr.append(json.getString("from")+":" +json.getString("msg")+"
"+getTime(System.currentTimeMillis())+"\n");
//将json数据显示在TextView中
mConsoleTxt.setText(mConsoleStr);
} catch (Exception e) {
e.printStackTrace();
public void onBackPressed() {
super.onBackPressed();
isStartRecieveMsg =
private static String getTime(long millTime) {
Date d = new Date(millTime);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(d);
以上代码的注释都比较详细,就不再多说了。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 每隔一段时间ping一次 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信