socket是网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。

客户软件将插头插到不同编号的插座,就可以得到不同的服务最重要的是,Socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket,系统为之分配一个Socket号;服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求。Socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器Socket半相关为全局所公认非常重要。

目前想让手机客户端和服务器保持长连接故选择socket进行通信

首先是新建一个socket服务器端

package com.wpndemo.socket;

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.ServerSocket;

import java.net.Socket;

import java.util.ArrayList;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

/**

* TODO

* @author cuiran

* @version TODO

*/

public class Main {

private static final int PORT = 8090;

private List mList = new ArrayList();

private ServerSocket server = null;

private ExecutorService mExecutorService = null; //thread pool

public static final String bm="utf-8"; //全局定义,以适应系统其他部分

public static void main(String[] args) {

new Main();

}

public Main() {

try {

server = new ServerSocket(PORT);

mExecutorService = Executors.newCachedThreadPool(); //create a thread pool

System.out.print("server start ...");

Socket client = null;

while(true) {

client = server.accept();

mList.add(client);

mExecutorService.execute(new Service(client)); //start a new thread to handle the connection

}

}catch (Exception e) {

e.printStackTrace();

}

}

class Service implements Runnable {

private Socket socket;

private BufferedReader in = null;

private String msg = "";

public Service(Socket socket) {

this.socket = socket;

try {

in = new BufferedReader(new InputStreamReader(socket.getInputStream(),bm));

msg = "user" +this.socket.getInetAddress() + "come toal:"

+mList.size();

this.sendmsg();

} catch (IOException e) {

e.printStackTrace();

}

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

while(true) {

if((msg = in.readLine())!= null) {

if(msg.equals("exit")) {

System.out.println("ssssssss");

mList.remove(socket);

in.close();

msg = "user:" + socket.getInetAddress()

+ "exit total:" + mList.size();

socket.close();

this.sendmsg();

break;

} else {

System.out.println("msg="+msg);

msg = socket.getInetAddress() + ":" + msg;

this.sendmsg();

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public void sendmsg() {

System.out.println(msg);

int num =mList.size();

for (int index = 0; index < num; index ++) {

Socket mSocket = mList.get(index);

PrintWriter pout = null;

try {

pout = new PrintWriter(new BufferedWriter(

new OutputStreamWriter(mSocket.getOutputStream(),bm)),true);

pout.println(msg);

}catch (IOException e) {

e.printStackTrace();

}

}

}

}

}

然后是新建一个Android工程:

在文件【AndroidManifest.XML】添加内容:

然后是创建类:

package com.cayden.socket;

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.io.UnsupportedEncodingException;

import java.net.Socket;

import com.cayden.util.Conf;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

public class SocketActivity extends Activity implements Runnable {

private TextView tv_msg = null;

private EditText ed_msg = null;

private Button btn_send = null;

// private Button btn_login = null;

private static final String HOST = "219.143.49.189";

private static final int PORT = 8403;

private Socket socket = null;

private BufferedReader in = null;

private PrintWriter out = null;

private String content = "";

public static final String bm="utf-8"; //全局定义,以适应系统其他部分

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

tv_msg = (TextView) findViewById(R.id.TextView);

ed_msg = (EditText) findViewById(R.id.EditText01);

// btn_login = (Button) findViewById(R.id.Button01);

btn_send = (Button) findViewById(R.id.sendBtn);

try {

socket = new Socket(HOST, PORT);

in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(

socket.getOutputStream(),bm)), true);

Log.i(Conf.TAG, "连接成功");

} catch (IOException ex) {

ex.printStackTrace();

Log.i(Conf.TAG, "出现异常:"+ex.getMessage());

ShowDialog("login exception" + ex.getMessage());

}

btn_send.setOnClickListener(new Button.OnClickListener() {

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

String msg = ed_msg.getText().toString();

if (socket.isConnected()) {

if (!socket.isOutputShutdown()) {

try {

out.println(msg);

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

});

new Thread(SocketActivity.this).start();

}

public void ShowDialog(String msg) {

new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)

.setPositiveButton("ok", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

}).show();

}

@Override

public void run() {

// TODO Auto-generated method stub

try {

while (true) {

if (socket.isConnected()) {

if (!socket.isInputShutdown()) {

if ((content = in.readLine()) != null) {

content += "\n";

mHandler.sendMessage(mHandler.obtainMessage());

} else {

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

public Handler mHandler = new Handler() {

public void handleMessage(Message msg) {

super.handleMessage(msg);

tv_msg.setText(tv_msg.getText().toString() + content);

}

};

}

通过上文可以知道要实现手机客户端和服务器保持长连接需要选择socket通信,整个流程下来首先要做的是新建一个socket服务器端,再新建一个android工程,最后创建一个类。在后续中会增加采用mina框架来实现通信。

android 全局 socket,学习Android socket通信之如何解决中文乱码相关推荐

  1. 爬虫学习----解决中文乱码

    一.字符编码 在编程的过程中,我们会遇到中文乱码的问题.要解决中文乱码我们就要了解计算机的字符编码,计算机有很多编码方式,因为计算机只能处理数字,因为处理文本的话,就必须先转化为数字.最早的时候计算机 ...

  2. android 全局 窗口,学习笔记:WindowManager显示Android全局悬浮窗口

    我用Android手机装了个电商软件,抢购用.自己手机的状态栏不能显示秒级别的时间,只能精确到分钟.为了能准确的把握抢购时间,自己边学习边开发了一个时间显示悬浮窗. WindowManager 参考文 ...

  3. Android菜鸟如何学习Android系统开发?

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  4. android 全局换字体,Android 全局替换字体

    1. 替换全局字体 需要引入依赖 // 替换全局字体使用 api 'com.android.support:support-v13:28.0.0' 在 res 目录下创建一个 font 目录,将用到的 ...

  5. Android菜鸟如何学习Android系统开发?(

    如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...

  6. Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)

    android的时钟,也就是闹钟应用,从桌面的widget直接点进去的会打开AlarmClock这个Activity. 好像我平常都不上图的,今天就上两张图先. 一张是应用界面图如下:(改天再上传了, ...

  7. android 全局dp单位,android应用开发之View的大小计量单位(px、dpi、dp、dip、sp)

    http://blog.csdn.net/ljianhui/article/details/43601495?ref=myread 一.像素(px)与屏幕分辨率 1)px(Pixels ,像素):对应 ...

  8. android 全局缓存,【Android进阶】RecyclerView之缓存(二)

    前言 上一篇,说了ItemDecoration,这一篇,我们来说说RecyclerView的回收复用逻辑. 问题 假如有100个item,首屏最多展示2个半(一屏同时最多展示4个),RecyclerV ...

  9. android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

    写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载   zbarLib编译project  project下载0积分 bug 在2.3的系统中Hol ...

最新文章

  1. oracle decode一个值对应多个值,如何使用Oracle的Decode函数进行多值判断
  2. linux 交叉编译选项
  3. python语言入门z-python中a z
  4. 007_JMS中的持久订阅
  5. python list 取重复次数
  6. js判断时间两小时之内_js判断两个时间的大小
  7. 方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包
  8. socket 选项 详细说明
  9. 在linux云服务器上运行Jar文件
  10. 基础平台为第三方应用接入提供oauth2认证接口
  11. BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
  12. 多个android客户端使用的数据库,android – 将Firebase数据库与本地数据库一起使用...
  13. 图像处理中饱和度、色调、对比度的定义
  14. 北京挪动推出神州行5元卡套餐
  15. WIN10下用anaconda安装tensorflow-gpu1.8.0并用pycharm作编译器(WIN10下anaconda+tensorflow-gpu+pycharm)
  16. 户外设备选择远距离蓝牙需要了解的知识-----工程师必看
  17. 访问服务器文件夹缩略图加载很慢,win10缩略图加载慢怎么办_win10电脑加载缩略图很慢处理方法-win7之家...
  18. 面试时问你对该公司有什么想法如何回答?
  19. Python3《机器学习实战》学习笔记(三):朴素贝叶斯基础篇之言论过滤器
  20. 如何在Bios里禁用集成显卡

热门文章

  1. docker的容器管理和网络模式
  2. 树莓派dht11上云_树莓派使用 DHT11 / DHT22 温湿度传感器
  3. 浅谈语音质量保障:如何测试 RTC 中的音频质量?
  4. 实时计算 Flink 版总体介绍
  5. 阿里云视频云编码优化的思考与发现
  6. 阿里云MongoDB,一直被模仿,从未被超越
  7. AI现状 人才短缺成为障碍
  8. 《磨难之间》——刻意设计,缺失核心
  9. 剑与远征恶魔英雄瑟可斯,我们认识一下他的技能
  10. pmp每日三题(2022年3月10日)