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. Redis Sentinel机制与用法

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都 ...

  2. 转载:看c++ primer 学习心得

    学习C++ Primer时遇到的问题及解释 chenm91 感觉: l          啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...

  3. 如何解决Rally模板提示angular js加载错误

    [前言] Rally是一个开源测试工具,用于测试openstack各个组件的性能 在使用Rally测试完毕后,一般会生成测试报告,这点很重要.但是原生态的Rally报告模板angular js框架是从 ...

  4. 动态执行linq 语句 NLinq

    using Evaluant.NLinq.Memory;using System.Collections.Generic;using Evaluant.NLinq;using System.Colle ...

  5. 【Linux学习】 包含子目录的makefile简单应用

    1 .目录结构 practice6 / ui / ui.h   ui.c practice6 / dal / dal.h dal.c practice6 / bll / bll.h  bll.c pr ...

  6. Azure终于支持大容量虚拟机了-最高32核,448G内存

    Azure终于支持大容量虚拟机了-最高32核,448G内存 最近微软Azure虚拟机旗下的大容量G系列虚拟机通用版本正式上线.G系列虚拟机方案提供公有云领域最大的内存容量.最强处理能力以及空间可观的本 ...

  7. 开源软交换系统 FreeSwitch 与 Asterisk 比较

    Asterisk 与freeswitch都是流行的开源软交换服务器,Asterisk出现的比较早,大概在1999年开始此项目,应该是最流行的开源软交换服务器,整个社区上下游都已经很成熟. freesw ...

  8. 关于scrollTop的那些事

    大家在实际项目中,应该是要经常用到scrollTop的,它表示的是可视窗口距离页面顶部的距离,这个scrollTop是可读写的,所以可以用来做页面滚动. 但是大家或多或少遇到一些浏览器兼容问题,为什么 ...

  9. Cognos报表打开参数

    查看门户页面 http://localhost:9300/p2pd/servlet/dispatch? b_action=xts.run &m=portal/cc.xts &gohom ...

  10. ASP.NET(C#)中的try catch异常处理机制

    在开发一个Umbraco平台系统的过程中,遇到了问题. 写的代码如下 fileUrl = MediaHelper.GetMediaUrl(Convert.ToInt32(publishedConten ...