原文地址: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;}@Overridepublic 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;@Overrideprotected 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 {@Overridepublic 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

转载于:https://www.cnblogs.com/kross/p/3621952.html

在Android上使用Socket相关推荐

  1. android 上传文件到 c 服务器,android 怎么样用socket给C服务器 发送二进制数据

    最近在写一个小APP,卡在android与服务器端通讯上了,大致需求是,android端发送二进制数据,文件头为0x00 0x08 0x0b,后面跟字符串的内容为abcd_efdgh, 结尾用0x00 ...

  2. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  3. Android上超级好用的前端调试方法(adb reverse)

    首先,这篇文章要说的不是大名鼎鼎的Inspector. 作为一名偶尔串客写写前端代码,但对前端又非常不熟练的Android终端开发,经常需要改两行代码就要看看页面效果对不对.如果是兼容桌面浏览器的页面 ...

  4. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  5. android上传文件用哪个布局,每周总结20130821——android控件的尺寸、http文件上传...

    Android控件的尺寸 android开发中,可以通过编写XML格式的布局文件来实现布局,也可以用纯代码进行布局,通常都是选择XML文件布局.在XML布局文件中,与控件的尺寸有关的属性有androi ...

  6. PhoneGap在Android上的插件开发方法介绍

    http://www.ibm.com/developerworks/cn/opensource/os-cn-android-phonegap/ PhoneGap 简介 PhoneGap 是利用 HTM ...

  7. Android上百实例源码分析以及开源分析集合打包

    感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...

  8. 基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互

    基于TCP/IP协议的Java服务端与Android客户端的Socket通信及数据交互 一.前言 1.Java服务端程序代码的项目名为TcpSocketServerOfJava,包名为com.exam ...

  9. FFmpeg在Android上的移植优化步骤

    从事多媒体软件开发的人几乎没有不知道FFmpeg的,很多视频播放器都是基于FFmpeg开发的.如今最火的智能手机操作系统Android上的很多第三方视频播放器也是基于FFmpeg实现全格式支持.由于A ...

最新文章

  1. R语言使用ggplot2包使用geom_density()函数绘制分组密度图(改变图例位置、移除图例)实战(density plot)
  2. [转载]从12306谈起验证码的架构
  3. 普中开发仪 HC6800EM3-v22光盘资料
  4. 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...
  5. java 切面_Java笔试面试精心整理得到89道Spring 核心知识【收藏向】
  6. DAY06-Python入门学习-元组、字典、集合类型
  7. 阿里年薪80w数据总监分享:一张图了解数据分析完整流程
  8. rac one node在线relocation
  9. asp.net页面调用cs中的方法
  10. 【POJ 3062】Party(2-SAT、tarjan)
  11. Codejock Suite Pro _16.3.X.国内最新版来了!
  12. 序列号大全,装机必备
  13. 大数据量JSONObject.fromObject性能问题(大数据传给前台)
  14. 固态硬盘接口类型介绍
  15. 对数的matlab代码,Matlab的对数
  16. 【深入理解C++】析构函数
  17. 无线wifi盒子用不用拉网线?
  18. Android app设置字体大小和字体样式不随系统设置改变而改变
  19. Scala中List的步长by
  20. oracle当天八点,oracle实现动态查询前一天早八点到当天早八点的数据功能示例

热门文章

  1. contourArea函数
  2. BSD和云 – 不可错过的BSD聚会
  3. Python中简化的验证码功能实现
  4. 图解Nosql(hbase)与传统数据库的区别
  5. mysql数据库一些可能会用到的命令
  6. SQL Server 2000安装指南及数据创建
  7. SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具
  8. Linux硬链接 软链接
  9. python for
  10. UA MATH567 高维统计专题3 含L1-norm的凸优化4 Nesterov方法与Accelerate Proximal Gradient