import java.io.DataInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.util.Log; @SuppressLint("NewApi")
public class SocketTCPServer implements Runnable
{
private String tag="SocketTCPServer";
//服务器端口
private final int SERVERPORT = 5111;
//存储所有客户端Socket连接对象
public List<Socket> mClientList = new ArrayList<Socket>();
//线程池
private ExecutorService mExecutorService;
//ServerSocket对象
private ServerSocket mServerSocket;
private PrintWriter mPrintWriter;
private String mStrMSG;
public SocketTCPServer()
{
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
StartServer();
handler.postDelayed(runnable, DELYED); //启动定时器
}
//接收线程发送过来信息,并用TextView显示
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg); Log.e(tag,mStrMSG); }
};
//每个客户端单独开启一个线程
class ThreadServer implements Runnable
{
private Socket mSocket;
private DataInputStream dinput;
public ThreadServer(Socket socket)
{
try{
this.mSocket = socket;
dinput = new DataInputStream(socket.getInputStream());
SendToClient("hello,tcp server...");
}
catch(Exception e){
Log.e(tag, e.toString());
} }
public void run()
{
try
{
byte[] bbuf = new byte[10000];
while (true) { if (!mSocket.isClosed()) {
if (mSocket.isConnected()) {
if (!mSocket.isInputShutdown()) {
int length = dinput.read(bbuf);
mStrMSG = new String(bbuf, 0, length, "gb2312");
mStrMSG += "\n";
Log.e(tag, mStrMSG);
mHandler.sendMessage(mHandler.obtainMessage());
}
}
}
}
}
catch (IOException e)
{
Log.e(tag, e.toString());
}
}
}
public void run() {
Socket client = null;
try{
while (true)
{
Log.e(tag, "收到客户端连接。。。");
//接收客户连接并添加到list中
client = mServerSocket.accept();
mClientList.add(client);
//开启一个客户端线程
if(client!=null){
//异常捕不到,客户端退出后,程序挂了
mExecutorService.execute(new ThreadServer(client));
} }
}
catch(Exception e){
mClientList.remove(client);
Log.e(tag, e.toString());
}
}
/**
* 向客户端发送消息
* @param msg
*/
public void SendToClient(String msg){
try{
if(mClientList.size()>0){
for (Socket client : mClientList)
{
mPrintWriter = new PrintWriter(client.getOutputStream(), true);
mPrintWriter.println(msg);
}
}
}
catch(Exception e){
Log.e("向客户端发送消息败了", e.toString());
StartServer();//消息发送失败,重启服务器
}
}
public void StartServer(){
try
{
if(mServerSocket!=null){
mServerSocket.close();
}
//设置服务器端口
mServerSocket = new ServerSocket(SERVERPORT);
//创建一个线程池
mExecutorService = Executors.newCachedThreadPool();
//用来临时保存客户端连接的Socket对象
new Thread(SocketTCPServer.this).start();
}
catch (IOException e)
{
Log.e(tag, e.toString());
} }
public void CloseServer(){
try {
mServerSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
} //定時器
private int DELYED= 5000;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
handler.postDelayed(this, DELYED);
SendToClient("this message from server:dongdongdong");
} catch (Exception e) {
Log.e(tag+"->runnable定时器", e.toString());
}
}
};
}

客户端

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 com.onesuncomm.model.CurrentUserInfo;
import com.onesuncomm.utils.DateUtil;
import com.onesuncomm.w511.MainActivity;
import com.onesuncomm.w511.TabCorePlateLocateActivity;
import com.onesuncomm.w511.TabServerLogActivity; import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.util.Log; @SuppressLint("NewApi")
public class SocketTCPClient implements Runnable {
private static SocketTCPClient mobileSocket;
private static String Tag="SocketTCPClient"; private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
private String content = "";
public SocketTCPClient(){
try {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
handler.postDelayed(runnable, DELYED); //启动定时器 } catch (Exception ex) {
Log.e(Tag+"->SocketTCPClient", ex.getMessage());
CurrentUserInfo.SocketStatus=false;
}
}
public static final SocketTCPClient instanceMobileSocket(){
synchronized (SocketTCPClient.class) {
if(mobileSocket==null) {
mobileSocket = new SocketTCPClient();
}
}
return mobileSocket;
}
public void ConnectionService(){
try { if(socket!=null){
socket.close();
}
socket = new Socket(CurrentUserInfo.server_ip, Integer.parseInt(CurrentUserInfo.server_port));
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())), true);
CurrentUserInfo.SocketStatus=true;
//启动线程,接收服务器发送过来的数据
new Thread(SocketTCPClient.this).start();
}
catch (IOException ex) {
CurrentUserInfo.SocketStatus=false;
}
}
//接收线程发送过来信息
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
//处理接收的信息
TabServerLogActivity.AddToLog("接收("+DateUtil.GetNowDateString()+"):"+content);
if(content.contains("Z0")){
sendMsgToServer("Z0\r\n");
}
if(MainActivity.isNetworkAvailable()){
//todo: 若返回lac,Cell则从服务器查询基站信息并显示在地图上
}
else{ }
//CurrentUserInfo.sbLog.append(content);
}
};
/*
* 读取服务器发来的信息,并通过Handler发给UI线程
*/
public void run() {
try {
char [] bbuf = new char[10000];
StringBuilder temp = new StringBuilder();
while (true) {
if (!socket.isClosed()) {
if (socket.isConnected()) {
CurrentUserInfo.SocketStatus=true;
timeOut=0;
if (!socket.isInputShutdown()) {
int leng=in.read(bbuf);
content = new String(bbuf, 0, leng);
temp.append(content);
//if (temp.toString().contains("Z")){
content=temp.toString();
temp =new StringBuilder();
mHandler.sendMessage(mHandler.obtainMessage());
//}
CurrentUserInfo.SocketStatus=true;
}
}
}
}
} catch (Exception e) {
CurrentUserInfo.SocketStatus=false;
Log.e(Tag+"->run()", e.getMessage());
}
} public void sendMsgToServer(Object msg){
if (socket.isConnected()) {
if (!socket.isOutputShutdown()) {
out.println(msg);
TabServerLogActivity.AddToLog("发送("+DateUtil.GetNowDateString()+"):"+msg);
}
}
}
//定時器
private int DELYED= 1000;
private int timeOut=0;
private int timeSendZ3=0;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
handler.postDelayed(this, DELYED);
timeOut++;
timeSendZ3++;
if (socket==null||socket.isOutputShutdown()||!CurrentUserInfo.SocketStatus||!socket.isConnected()) {
CurrentUserInfo.SocketStatus=false;
new Thread() {
public void run() {
ConnectionService();
};
}.start();
} TabCorePlateLocateActivity.setSocketStatus(); } catch (Exception e) {
Log.e(Tag+"->runnable定时器", e.toString());
}
}
};
}

调用

/**
* 开启socket
*/
private void openSocket(){
try{
//SocketTCPServer server =new SocketTCPServer();
//server.SendToClient("本消息来自服务器");
final SocketTCPClient tcp =SocketTCPClient.instanceMobileSocket();
new Thread() {
public void run() {
tcp.ConnectionService();
};
}.start();
}
catch(Exception ex){
LogUtil.WriteError(ex);
}
}

Android之socket服务端的更多相关文章

  1. Android版Ftp服务端软件

    分享一款开发的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件 ...

  2. Android客户端与服务端交互之登陆示例

    Android客户端与服务端交互之登陆示例 今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台 ...

  3. 在python中编写socket服务端模块(二):使用poll或epoll

    在linux上编写socket服务端程序一般可以用select.poll.epoll三种方式,本文主要介绍使用poll和epoll编写socket服务端模块. 使用poll方式的服务器端程序代码: i ...

  4. AutoCAD.net支持后台线程-Socket服务端

    最近因为公司项目的需求,CAD作为服务端在服务器中常驻运行,等待客户端远程发送执行任务的指令,最终确认用Socket-tcp通讯,CAD需要实时监听客户端发送的消息,这时就需要开启线程执行Socket ...

  5. 使用NewLife网络库构建可靠的自动售货机Socket服务端(一)

    最近有个基于tcp socket 协议和设备交互需求,想到了新生命团队的各种组件,所以决定用NewLife网络库作为服务端来完成一系列的信息交互. 第一,首先说一下我们需要实现的功能需求吧 1,首先客 ...

  6. 第一个socket服务端程序

    第一个socket服务端程序 #include <stdio.h> #include <stdlib.h> #include <string.h> #include ...

  7. Android 小例子服务端

    这是之前发布的Android项目的服务端源码,只是简单的根据请求返回了一些测试数据,没有实现对数据库的操作,可以根据需求自己实现. 这是mvc4 WebAPI项目,需要用vs2012打开. 如果是用的 ...

  8. C# Socket服务端与客户端通信(包含大文件的断点传输)

    步骤: 一.服务端的建立 1.服务端的项目建立以及页面布局 2.各功能按键的事件代码 1)传输类型说明以及全局变量 2)Socket通信服务端具体步骤:   (1)建立一个Socket   (2)接收 ...

  9. MSDN上的异步socket 服务端例子

    MSDN上的异步socket 服务端例子 2006-11-22 17:12:01|  分类: 代码学习 |  标签: |字号大中小 订阅     Imports SystemImports Syste ...

随机推荐

  1. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...

  2. Redux 笔记详解

    npm install --save redux 多数情况下,你还需要使用 React 绑定库和开发者工具. npm install --save react-redux npm install -- ...

  3. cocos2d-x 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  4. 8.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?

    注:这题胜在区分度高,知识点覆盖广,再不懂的人,也能答出几句, 而高手可以根据自己擅长的领域自由发挥,从URL规范.HTTP协议.DNS.CDN.数据库查询. 到浏览器流式解析.CSS规则构建.lay ...

  5. PDO数据访问抽象层(下)

    PDO两大功能 一.事务功能 PDO的事务功能主要控制好几条sql语句同时成功或者同时失败(当其中一条SQL语句有错误时,同时好几条一起失败),失败时可以回滚操作 1.造对象 <?php $ds ...

  6. report源码分析——report_object和report_message

    uvm的report机制,主要涉及uvm_report_object,uvm_report_handle,uvm_report_server这三个类: uvm_report_object主要是提供uv ...

  7. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  8. linux常见运维题

    linux运维题 一.填空题 1. 在Linux 系统 中,以文件方式访问设备 . (linux下一切都是文件) 2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 . ( ...

  9. js原型链的说明

    首先需要明确的是:只有对象有__proto__属性,而函数只有prototype属性,没有__proto__属性,函数的原型有一个constructor属性,指向的是函数本身! Function是Ob ...

  10. Visible Lattice Points (莫比乌斯反演)

    Visible Lattice Points 题意 : 从(0,0,0)出发在(N,N,N)范围内有多少条不从重合的直线:我们只要求gcd(x,y,z) = 1; 的点有多少个就可以了: 比如 : 点 ...