http://blog.csdn.net/eyu8874521/article/details/8847173

度娘给出的描述:
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

在java中,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

下面通过一个极为简单的客户端和服务端的连接例子演示下最基本的android socket通信:

服务端的代码,在服务端特定的端口9999监听客户端请求,一旦有请求,便会执行,而后继续监听。使用accept()这个阻塞函数,就是该方法被调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket。本例中很简单,服务端不断监听,一旦有请求就输出一段信息:

  1. <span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;
  2. import java.io.IOException;
  3. import java.io.OutputStreamWriter;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. public class Main {
  7. private static final int PORT = 9999;
  8. public static void main(String[] args) {
  9. try {
  10. // 实例化服务器套接字 设置端口号9999
  11. ServerSocket server = new ServerSocket(PORT);
  12. while (true) {
  13. Socket socket = server.accept();
  14. // 获取输出流
  15. BufferedWriter writer = new BufferedWriter(
  16. new OutputStreamWriter(socket.getOutputStream()));
  17. // 写字符串
  18. writer.write("这是一段来自服务器的问候:Hello沃德!");
  19. writer.flush();
  20. writer.close();
  21. }
  22. } catch (IOException e) {
  23. // TODO Auto-generated catch block
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. </span>

下面是android客户端的相关内容,界面有一个按钮,点击后请求服务端的制定端口,然后显示服务端的内容,值得注意的是在android4.0以上的系统中,是不允许在主线程里面去执行网络相关的请求,否则会报错:NetworkOnMainThreadException,所以本例中新开辟一个线程初始化socket的内容:

  1. <span style="font-family:Comic Sans MS;font-size:18px;">package com.example.socketdemo;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. import java.net.UnknownHostException;
  7. import android.annotation.SuppressLint;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.os.Handler;
  11. import android.os.Message;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.TextView;
  17. @SuppressLint("HandlerLeak")
  18. public class SocketDemo extends Activity {
  19. /** Called when the activity is first created. */
  20. private Button btn_receive;
  21. private TextView txt;
  22. private String line;
  23. private static final String HOST = "192.168.1.101";
  24. private static final int PORT = 9999;
  25. @Override
  26. public void onCreate(Bundle savedInstanceState) {
  27. super.onCreate(savedInstanceState);
  28. setContentView(R.layout.activity_main);
  29. initControl();
  30. }
  31. private void initControl() {
  32. btn_receive = (Button) findViewById(R.id.btn_receive);
  33. txt = (TextView) findViewById(R.id.txt);
  34. btn_receive.setOnClickListener(new ReceiverListener());
  35. }
  36. @SuppressLint("HandlerLeak")
  37. class ReceiverListener implements OnClickListener {
  38. @Override
  39. public void onClick(View v) {
  40. // TODO Auto-generated method stub
  41. new Thread() {
  42. @Override
  43. public void run() {
  44. // 执行完毕后给handler发送一个空消息
  45. try {
  46. // 实例化Socket
  47. Socket socket = new Socket(HOST, PORT);
  48. // 获得输入流
  49. BufferedReader br = new BufferedReader(
  50. new InputStreamReader(socket.getInputStream()));
  51. line = br.readLine();
  52. br.close();
  53. } catch (UnknownHostException e) {
  54. // TODO Auto-generated catch block
  55. e.printStackTrace();
  56. } catch (IOException e) {
  57. // TODO Auto-generated catch block
  58. e.printStackTrace();
  59. }
  60. handler.sendEmptyMessage(0);
  61. }
  62. }.start();
  63. }
  64. }
  65. // 定义Handler对象
  66. private Handler handler = new Handler() {
  67. @Override
  68. // 当有消息发送出来的时候就执行Handler的这个方法
  69. public void handleMessage(Message msg) {
  70. super.handleMessage(msg);
  71. // 处理UI
  72. txt.setText(line);
  73. Log.i("PDA", "----->" + line);
  74. }
  75. };
  76. }
  77. </span>

效果图如下:

                       

另外在配置文件中记得加上权限:<uses-permission android:name="android.permission.INTERNET">

测试的时候先启动服务端,然后启动客户端,点击按钮就可获取到服务端信息。这是在是一个灰常简单的有关android socket的小例子,可以初步对socket有个简单的了解,这个笔记就先记到这里!

参考文章:

http://blog.sina.com.cn/s/blog_685790700100xjuo.html

http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html

Android Socket编程学习笔记的更多相关文章

  1. JAVA Socket 编程学习笔记(二)

    在上一篇中,使用了 java Socket+Tcp/IP  协议来实现应用程序或客户端--服务器间的实时双向通信,本篇中,将使用 UDP 协议来实现 Socket 的通信. 1. 关于UDP UDP协 ...

  2. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  3. LInux下socket编程学习笔记

    1.socket套接字: socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模 ...

  4. python socket编程学习笔记2

     server.py: [服务端步骤]: 1.创建socket对象 2.将socket绑定到指定地址(bind) 3.监听连接请求(listen) 4.等待客户请求(accept) 5.处理请求(服务 ...

  5. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  6. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  7. Python--网络编程学习笔记系列02 附:tcp服务端,tcp客户端

    Python--网络编程学习笔记系列02 TCP和UDP的概述: udp通信模型类似于写信,不需要建立相关链接,只需要发送数据即可(现在几乎不用:不稳定,不安全) tcp通信模型类似于打电话,一定要建 ...

  8. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  9. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

随机推荐

  1. Android之布局属性

    1) 布局的相关属性 ① android:layout_weight="1.0",layout_weight 用于给一个线性布局中的诸多视图重要度赋值.所有的视图都有一个layou ...

  2. acdream 1044

    题意:有你一个草坪,草的初始高度都是100,让你用割草机割,割草机只能横着或竖着割,每次割的高度一定,问你能不能割出给定的草坪出来. 考虑任意一个草被割要么是横着要么竖着,所以任意一个草必然是它所在行 ...

  3. Android应用启动时间及启动日志获取方法

    1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:

  4. duilib入门之贴图描述、类html文本描述、动态换肤、Dll插件、资源打包

    转载自duilib入门文档 贴图描述: Duilib的表现力丰富很大程度上得益于贴图描述的简单强大.Duilib的贴图描述分为简单模式和复杂模式两种. 简单模式使用文件名做为贴图描述内容,在这种方式下 ...

  5. 基于wke封装的duilib的webkit浏览器控件,可以c++与js互交,源码及demo下载地址

    转载请说明原出处,谢谢~~ 前些日子用wke内核封装了duilib的webkit浏览器控件,好多群里朋友私聊我希望可以我公布源码,今天把这个控件的源码和使用demo公布.其实这个控件封装起来没什么难度 ...

  6. CentOS 7 安装 PyCharm for python

    下载链接:http://www.jetbrains.com/pycharm/ 如果只是为了开发python,这个免费版的应该已经够了. 今天讲的是怎么在CentOS7下面安装 pycharm: 下载完 ...

  7. 使用PHP绘制统计图

    使用PHP画统计图的方法 第一种方法 <?php //最后一次修改:2004-6-21 //一个生成矩形图,曲线图的图形分析类 //作者:tonera //说明: //任何人可在任何场合自由使用 ...

  8. Language Basics:语言基础

    Java包含多种变量类型:Instance Variables (Non-Static Fields)(实例变量):是每个对象特有的,可以用来区分各个实例Class Variables (Static ...

  9. Java——观察者模式实例

    观察者模式(订阅/发布模式) 作者: 代码大湿 代码大湿 Java中观察者模式中主要是Observerable类(被观察者),和Observer接口(观察者).下面是个简单的demo //被观察者 p ...

  10. erlang局域网内节点通信——艰难四步曲 (转)

    http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通 ...