在Android上使用Socket
原文地址:http://www.cnblogs.com/kross/p/3621952.html
考虑到以后可能要用到这方面的知识,就来写个Demo尝试下,其实以前学过,但不记得了……(用不到的东西各种不记得啊)
直接进入正题吧,在Android上使用Socket实际上跟在Java中使用差不多,只要注意下在Manifest中加网络权限就好了(我原来经常犯这个错误),另外网络请求不能再主线程里,基本就OK了。
そして,先写一个服务器的小程序吧。就直接使用Java写就好了,灰常的简单,随便写写。
/**
* 测试服务器
* */
public class TestServer { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(5417); Socket client = null; while (true) {
System.out.println("waiting for...");
client = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
System.out.println(br.readLine());
}
}
}
然后我的构想是,手机上有一个输入框,一个按钮,用户可以按按钮,把输入框里的内容发送到服务器上。一开始我写了一个很混乱的demo,为了更加方便使用,就把Socket的封装了一下,就叫SocketManager吧,代码如下:
/**
* SocketManager,简单的封装了一下
* @author Kross(krossford@foxmail.com)
* @date 2014-3-24 21:39:48
* */
public class SocketManager { private Socket client = null; //服务器的IP地址
private String ip = "113.251.172.30"; //监听的端口号
private int port = 5417; /**
* 获取一个实例
* */
public static SocketManager newInstance() throws UnknownHostException, IOException {
return new SocketManager();
} private SocketManager() throws UnknownHostException, IOException {
client = new Socket(ip, port);
} /**
* 发送一条消息
* @param msg 消息内容
* */
public void sendMessage(String msg) throws IOException {
PrintWriter printWriter = new PrintWriter(client.getOutputStream());
printWriter.print(msg);
printWriter.flush();
printWriter.close(); //一定要关闭输出流,要不然消息无法送达到服务器
}
}
几个要点:
1.IP地址就写Java程序锁运行的机器的公网地址,cmd->ipconfig就可以查到。
2.端口号请和服务器那个保持一致,都不在一个管道里怎么通信哇。
3.我使用了静态工厂方法,每次都要重新new一个SocketManager,因为我发现Socket这个类只能用一次,close之后再发送便没用了。
4.服务器要收到信息,必须要客户端的东西close了,输出流close也好,socket.close也好,总之要close,服务器才能确切的收到。
然后,我写了一个线程来执行这个Socket,因为不能在主线程跑嘛,我想了很久,可不可以让这个线程一直执行着,然后只要调用下这个线程的sendMessage方法,就可以发送了,这样就只需要new一个线程就行了,但是我想了好久,都想不通,貌似不能那样,线程要么没有,有的话就会一股脑的执行它的run()方法,想要长时间持有它?在run里面加个while(true)?那怎么做到调用它的共有方法呢?总之,我没有想到用只需要new一个线程就可以发N个请求的办法,貌似需要使用到Service来实现了。
/**
* 发起请求的线程
* @author Kross(krossford@foxmail.com)
* @date 2014-3-24 21:40:21
* */
public class SocketThread implements Runnable { private String message; public SocketThread(String msg) {
message = msg;
} @Override
public void run() {
try {
SocketManager.newInstance().sendMessage(message);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这里倒没什么好说的。接下来我们就直接在MainActivity里面准备好控件,监听器,然后就OK了,大致的看下代码吧。
public class MainActivity extends Activity {
private EditText etInput = null;
private Button bSend = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("MainActivity", Thread.currentThread().getName());
etInput = (EditText)findViewById(R.id.et_input);
bSend = (Button)findViewById(R.id.b_send);
bSend.setOnClickListener(new SendButtonListener());
}
class SendButtonListener implements OnClickListener {
@Override
public void onClick(View v) {
String msg = etInput.getEditableText().toString().trim();
new Thread(new SocketThread(msg)).start();
etInput.setText("");
}
}
}
OK,代码就是这样了,来看下最终的运行效果吧。
先启动Java的服务器程序,启动后结果是这样的:

然后我们运行手机上的程序,发送一条消息:

再来看服务器端的程序:

看上去一切正常,再来一发!

再看看服务器的程序:

OK,看来是没有问题了。
服务器如何向Socket返回信息暂时还没有去实验,留着明天来搞吧……
原文地址:http://www.cnblogs.com/kross/p/3621952.html
新浪微博:http://weibo.com/KrossFord
在Android上使用Socket的更多相关文章
- Android网络应用之Socket(一)
socket编程是网络通信的一个基础应用.不管是手机端还是PC端都须要socket技术来建立网络通信. 在本章小编主要从下面几个方面来介绍socket的相关知识: 各自是"什么是socket ...
- PhoneGap 在 Android 上的插件开发方法介绍
移动应用开发已经成为软件开发的一个重要方向,但是移动开发面临的一个重要问题就是跨平台的问题.PhoneGap 作为一个多平台的软件开发框架,提供了一次编写多个平台的运行.目前已经支持多达 6 个移动平 ...
- FFmpeg在Android上的移植之第一步
http://blog.sina.com.cn/s/blog_69a04cf40100x1fr.html 从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmpeg开发的. ...
- Android中基于Socket的网络通信
1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...
- Android 网络编程 Socket Http
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- Android 上SuperUser获取ROOT权限原理解析
Android 上SuperUser获取ROOT权限原理解析 一. 概述 本文介绍了android中获取root权限的方法以及原理,让大家对android 玩家中常说的“越狱”有一个更深层次的认识. ...
- FFmpeg在Android上的移植优化步骤
http://blog.csdn.net/feixiang_john/article/details/7894188 从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmp ...
- Android TCP/IP Socket Test
TCP/IP协议:Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本 ...
- Android 网络通信之Socket
Android 网络通信之Socket 应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然 ...
随机推荐
- 【FJOI2014】最短路径树问题
题面 题解 强行将最短路和点分治(长链剖分)融合在一起的题目 构建出字典序最小的最短路树之后,就可以用点分治来解决了 不过有一些细节要注意: 3 3 k 1 2 1 2 3 1 1 3 2 这样建出的 ...
- Object C学习笔记6-如何在Windows环境搭建Object C开发环境
1. 安装编译环境 Object C和其他很多语言一样,都需要有一个编译器.Object C 是在GCC下编译的.GCC(GNU Compiler Collection,GNU编译器集合),是一套由 ...
- python 小技巧之获取固定下面包含的某种类型文件的个数
遇到这样一个问题.我想要统计某个文件夹下有多少个py文件怎么办. 用python能解决吗?答案,能. 解决办法,使用glob 代码如下: import glob path_file_number=gl ...
- linux管道详解
原文链接:http://blog.csdn.net/qq_38646470/article/details/79564392 符号表示 | 和管道特别形象. 作用: 管道是Linux中很重要的 ...
- 第一个Django demo
平台:Pycharm Django 使用 Pycharm 进行开发,需要提前在 Pycharm 中(File > Settings > Project: Python > Proje ...
- Android Studio 导入别人项目时候遇见的问题“Gradle DSL method not found: 'compile()'”
Gradle DSL method not found: 'compile() 遇见这个问题截图: 解决: 在项目的根目录的build.gradle文件中是不是用了compile方法 如果有的话,剪切 ...
- ETCD分布式存储部署
一.ETCD 概述 ETCD 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置.具有一下优点: 简单: 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致 ...
- OpenGL学习笔记(4) GLM库的使用
OpenGL和DirextX不一样,没有内置的数学库,于是我们需要找一个第三方库,按照LearnOpenGL的教程我们使用GLM库,可以到他们的官网下载 glm常用的数据类型 vec2 二维向量 ve ...
- SICP读书笔记 2.5
SICP CONCLUSION 让我们举起杯,祝福那些将他们的思想镶嵌在重重括号之间的Lisp程序员 ! 祝我能够突破层层代码,找到住在里计算机的神灵! 目录 1. 构造过程抽象 2. 构造数据抽象 ...
- 3星|《实战复盘第四季·商业巨头们的变革之道》:GE、TCL、力拓集团、英美资源集团等企业总裁的变更经验
实战复盘第四季·商业巨头们的变革之道(<哈佛商业评论>增刊) 本期是<哈佛商业评论>“实战复盘”栏目的10篇文章,讲的是GE.TCL.力拓集团.英美资源集团等企业如何熬过变革期 ...