android 全局 socket,学习Android socket通信之如何解决中文乱码
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通信之如何解决中文乱码相关推荐
- 爬虫学习----解决中文乱码
一.字符编码 在编程的过程中,我们会遇到中文乱码的问题.要解决中文乱码我们就要了解计算机的字符编码,计算机有很多编码方式,因为计算机只能处理数字,因为处理文本的话,就必须先转化为数字.最早的时候计算机 ...
- android 全局 窗口,学习笔记:WindowManager显示Android全局悬浮窗口
我用Android手机装了个电商软件,抢购用.自己手机的状态栏不能显示秒级别的时间,只能精确到分钟.为了能准确的把握抢购时间,自己边学习边开发了一个时间显示悬浮窗. WindowManager 参考文 ...
- Android菜鸟如何学习Android系统开发?
如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...
- android 全局换字体,Android 全局替换字体
1. 替换全局字体 需要引入依赖 // 替换全局字体使用 api 'com.android.support:support-v13:28.0.0' 在 res 目录下创建一个 font 目录,将用到的 ...
- Android菜鸟如何学习Android系统开发?(
如何做好Android学习前的准备? 如果你已经确定了学习Android的目标,那么,应该提前做好哪些工作.先打下哪些基础呢? 首先,你最好先熟悉一门编程语言,现在大学里面和计算机相关的专业甚至理工类 ...
- Android闹钟动画,学习Android闹钟源代码(三)-AlarmClock类分析(part1)
android的时钟,也就是闹钟应用,从桌面的widget直接点进去的会打开AlarmClock这个Activity. 好像我平常都不上图的,今天就上两张图先. 一张是应用界面图如下:(改天再上传了, ...
- android 全局dp单位,android应用开发之View的大小计量单位(px、dpi、dp、dip、sp)
http://blog.csdn.net/ljianhui/article/details/43601495?ref=myread 一.像素(px)与屏幕分辨率 1)px(Pixels ,像素):对应 ...
- android 全局缓存,【Android进阶】RecyclerView之缓存(二)
前言 上一篇,说了ItemDecoration,这一篇,我们来说说RecyclerView的回收复用逻辑. 问题 假如有100个item,首屏最多展示2个半(一屏同时最多展示4个),RecyclerV ...
- android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)
写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载 zbarLib编译project project下载0积分 bug 在2.3的系统中Hol ...
最新文章
- oracle decode一个值对应多个值,如何使用Oracle的Decode函数进行多值判断
- linux 交叉编译选项
- python语言入门z-python中a z
- 007_JMS中的持久订阅
- python list 取重复次数
- js判断时间两小时之内_js判断两个时间的大小
- 方正计算机软件保护进超级用户,超级用户权限补丁(SuperSU Pro)含刷机包
- socket 选项 详细说明
- 在linux云服务器上运行Jar文件
- 基础平台为第三方应用接入提供oauth2认证接口
- BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞 DFS版SPFA判负环
- 多个android客户端使用的数据库,android – 将Firebase数据库与本地数据库一起使用...
- 图像处理中饱和度、色调、对比度的定义
- 北京挪动推出神州行5元卡套餐
- WIN10下用anaconda安装tensorflow-gpu1.8.0并用pycharm作编译器(WIN10下anaconda+tensorflow-gpu+pycharm)
- 户外设备选择远距离蓝牙需要了解的知识-----工程师必看
- 访问服务器文件夹缩略图加载很慢,win10缩略图加载慢怎么办_win10电脑加载缩略图很慢处理方法-win7之家...
- 面试时问你对该公司有什么想法如何回答?
- Python3《机器学习实战》学习笔记(三):朴素贝叶斯基础篇之言论过滤器
- 如何在Bios里禁用集成显卡