1socket的作用

通过http去获取服务器的数据在有些情况下是行不通的,所有使用socket与服务器通信也是必须掌握的

2.代码

好了上代码,代码中有解释,首先是简单的服务端代码

  1. package org.tonny;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8.  
  9. public class SockServer implements Runnable
  10. {
  11. private static final int PORT = 55555;
  12.  
  13. @Override
  14. public void run()
  15. {
  16. //用于响应客户端
  17. Socket client = null;
  18.  
  19. //服务端socket
  20. ServerSocket server = null;
  21. try
  22. {
  23. //绑定端口,准备接受客户端的连接
  24. server = new ServerSocket(PORT);
  25. while (true)
  26. {
  27. System.out.println("Wait for connecting...");
  28.  
  29. //这个操作是阻塞的,有客户端连接才会进行下一步操作
  30. client = server.accept();
  31.  
  32. //读取客户端发送的数据
  33. BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
  34. String msg = in.readLine();
  35. System.out.println("Client: " + msg);
  36. }
  37. }
  38. catch (Exception e)
  39. {
  40. System.out.println("Server Receive: Error");
  41. }
  42. finally
  43. {
  44. try
  45. {
  46. //关闭套接字
  47. server.close();
  48. client.close();
  49. }
  50. catch (IOException e)
  51. {
  52. System.out.println("Server Receive: Error" + e.getMessage());
  53. }
  54. }
  55. }
  56.  
  57. public static void main(String[] args)
  58. {
  59. Thread thread = new Thread(new SockServer());
  60. thread.start();
  61. }
  62. }

接着是android客户端的代码

  1. package org.tonny.client;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.IOException;
  5. import java.io.OutputStreamWriter;
  6. import java.io.PrintWriter;
  7. import java.net.Socket;
  8. import java.net.UnknownHostException;
  9.  
  10. import android.app.Activity;
  11. import android.os.Bundle;
  12. import android.util.Log;
  13. import android.view.View;
  14. import android.widget.EditText;
  15.  
  16. public class ClientActivity extends Activity
  17. {
  18. // 需要发送的信息写在这个控件中
  19. private EditText txtInfo = null;
  20. private static final int PORT = 55555;
  21.  
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState)
  24. {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_client);
  27. txtInfo = (EditText) this.findViewById(R.id.txtInfo);
  28. }
  29.  
  30. public void onBtnSendClick(View view)
  31. {
  32. String msg = txtInfo.getText().toString();
  33.  
  34. //不適用綫程通不过去,直接异常处理,这是因为android 3.0+以上 已经不建议在activity中添加耗时操作,要界面和数据脱离。4.0以上的通信都必须放到线程里去做 不能在UI线程。
  35. //解决办法,另起线程或Service处理socket。
  36. SockClient sock = new SockClient("192.168.1.106", PORT, msg);
  37. sock.start();
  38. }
  39.  
  40. private final class SockClient extends Thread
  41. {
  42. private String ip;
  43. private int port;
  44. private String msg;
  45.  
  46. public SockClient(String ip, int port, String msg)
  47. {
  48. this.ip = ip;
  49. this.port = port;
  50. this.msg = msg;
  51. }
  52.  
  53. @Override
  54. public void run()
  55. {
  56. Socket client = null;
  57. try
  58. {
  59. Log.d("CLIENT", "Connecting...");
  60. // 与服务器获取连接
  61. client = new Socket(ip, port);
  62. // 获取 Client 端的输出流
  63. PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
  64. out.println(msg);
  65. }
  66. catch (UnknownHostException e)
  67. {
  68. Log.e("CLIENT", "Error", e);
  69. }
  70. catch (IOException e)
  71. {
  72. Log.e("CLIENT", "Error", e);
  73. }
  74. catch (Exception e)
  75. {
  76. Log.e("CLIENT", "Error", e);
  77. }
  78. finally
  79. {
  80. try
  81. {
  82. if (client != null && !client.isClosed())
  83. {
  84. client.close();
  85. }
  86.  
  87. }
  88. catch (IOException e)
  89. {
  90. Log.e("TCP", "Error", e);
  91. }
  92. }
  93. }
  94. }
  95. }

要注意的是,socket操作一定要在单独的线程中进行,否则会产生异常。

3.总结

还是一点,android操作socket的时候,应该在线程中执行,否则会报异常,为了这个花了不少时间调试,还是没搞定,最后问的度娘。

Android学习六:Socket 使用的更多相关文章

  1. android 学习六 构建用户界面和使用控件

    1.常用Android控件最终都会继承自View类 2.ViewGroup是一些布局类列表的基类,包括View和ViewGroup 3.构造界面的三种方法    a.完全使用代码(太灵活,而不好维护) ...

  2. Android学习六---OpenCV for android samples

    搭建好OpenCV4Android环境后,就要着手开发自己的应用了.对于一个没有OpenCV基础的人来开发OpenCV应用确实有点难度,不过我们可以从samples里学起,结合javadoc和万能的网 ...

  3. openfire Android学习(六)----总结

    Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...

  4. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  5. 二十六个月Android学习工作总结【转】

    原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍.     2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...

  6. 【Android】完善Android学习(六:API 4.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  7. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  8. 【转】 Pro Android学习笔记(七六):服务(1):local和remote

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...

  9. 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

    目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...

随机推荐

  1. swift混编oc碰到的问题

    在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: ...

  2. Python爬虫:一些常用的爬虫技巧总结

    爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...

  3. C#窗体 LISTVIEW

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. HTML5的 2D SVG和SVG DOM的学习笔记(2)---SVG动画

    SVG支持动画.可以通过以下几种方法获得动画效果: 使用SVG动画元素.SVG可以描述随时间变化的图形对象,使用不同的动画元素可以定义运动路径,淡入淡出效果和对象的膨胀.收缩.旋转和变换颜色. 使用S ...

  5. SSM框架学习之高并发秒杀业务--笔记3-- Service层

    上一节中已经包DAO层编写完成了,所谓的DAO层就是所有和数据访问的部分都应该放在这个层里,它负责与数据库打交道.对于一个web项目来说,大概由这几部分组成: 1. 前台的显示层. 2. 分发处理请求 ...

  6. z-index、display、selector选择器优先级css优先级面试用到

    z-index:控制元素叠放顺序,哪个z-index数值越大,那个优先被叠放在上面. relative.absolute.fixed这三种情况可以使用z-index. static不可以使用. dis ...

  7. 调用回调函数出现或者大循环出现has triggered a breakpoint

    triggered a breakpoint 的意思是触发一个断点.这个问题一般发生在程序运行过程中.下面是错误发生显示的信息:Windows has triggered a breakpoint i ...

  8. 《Java中的单例模式--两种》

    //单例模式:饿汉式和懒汉式 //单例模式 /* 设计模式:解决某一类问题行之有效的解决办法(思想). 单例(Singleton):设计模式: 学习设计模式必须先弄清楚它是解决什么问题的. 单例模式是 ...

  9. oracle 拼接一张表所有字段

    declare t_name varchar2(100) := upper('dba_tab_columns'); cursor c_col is select column_name from db ...

  10. php大力力 [046节] 兄弟连高洛峰 PHP教程 2015年[最新最新最新最新最新]

    兄弟连高洛峰老师新版PHP视频教程列表[每日更新] http://bbs.lampbrother.net/read-htm-tid-160506.html HTML部分1.[2015]兄弟连高洛峰 H ...