Android学习六:Socket 使用
1socket的作用
通过http去获取服务器的数据在有些情况下是行不通的,所有使用socket与服务器通信也是必须掌握的
2.代码
好了上代码,代码中有解释,首先是简单的服务端代码
- package org.tonny;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class SockServer implements Runnable
- {
- private static final int PORT = 55555;
- @Override
- public void run()
- {
- //用于响应客户端
- Socket client = null;
- //服务端socket
- ServerSocket server = null;
- try
- {
- //绑定端口,准备接受客户端的连接
- server = new ServerSocket(PORT);
- while (true)
- {
- System.out.println("Wait for connecting...");
- //这个操作是阻塞的,有客户端连接才会进行下一步操作
- client = server.accept();
- //读取客户端发送的数据
- BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
- String msg = in.readLine();
- System.out.println("Client: " + msg);
- }
- }
- catch (Exception e)
- {
- System.out.println("Server Receive: Error");
- }
- finally
- {
- try
- {
- //关闭套接字
- server.close();
- client.close();
- }
- catch (IOException e)
- {
- System.out.println("Server Receive: Error" + e.getMessage());
- }
- }
- }
- public static void main(String[] args)
- {
- Thread thread = new Thread(new SockServer());
- thread.start();
- }
- }
接着是android客户端的代码
- package org.tonny.client;
- import java.io.BufferedWriter;
- import java.io.IOException;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.EditText;
- public class ClientActivity extends Activity
- {
- // 需要发送的信息写在这个控件中
- private EditText txtInfo = null;
- private static final int PORT = 55555;
- @Override
- protected void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_client);
- txtInfo = (EditText) this.findViewById(R.id.txtInfo);
- }
- public void onBtnSendClick(View view)
- {
- String msg = txtInfo.getText().toString();
- //不適用綫程通不过去,直接异常处理,这是因为android 3.0+以上 已经不建议在activity中添加耗时操作,要界面和数据脱离。4.0以上的通信都必须放到线程里去做 不能在UI线程。
- //解决办法,另起线程或Service处理socket。
- SockClient sock = new SockClient("192.168.1.106", PORT, msg);
- sock.start();
- }
- private final class SockClient extends Thread
- {
- private String ip;
- private int port;
- private String msg;
- public SockClient(String ip, int port, String msg)
- {
- this.ip = ip;
- this.port = port;
- this.msg = msg;
- }
- @Override
- public void run()
- {
- Socket client = null;
- try
- {
- Log.d("CLIENT", "Connecting...");
- // 与服务器获取连接
- client = new Socket(ip, port);
- // 获取 Client 端的输出流
- PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
- out.println(msg);
- }
- catch (UnknownHostException e)
- {
- Log.e("CLIENT", "Error", e);
- }
- catch (IOException e)
- {
- Log.e("CLIENT", "Error", e);
- }
- catch (Exception e)
- {
- Log.e("CLIENT", "Error", e);
- }
- finally
- {
- try
- {
- if (client != null && !client.isClosed())
- {
- client.close();
- }
- }
- catch (IOException e)
- {
- Log.e("TCP", "Error", e);
- }
- }
- }
- }
- }
要注意的是,socket操作一定要在单独的线程中进行,否则会产生异常。
3.总结
还是一点,android操作socket的时候,应该在线程中执行,否则会报异常,为了这个花了不少时间调试,还是没搞定,最后问的度娘。
Android学习六:Socket 使用的更多相关文章
- android 学习六 构建用户界面和使用控件
1.常用Android控件最终都会继承自View类 2.ViewGroup是一些布局类列表的基类,包括View和ViewGroup 3.构造界面的三种方法 a.完全使用代码(太灵活,而不好维护) ...
- Android学习六---OpenCV for android samples
搭建好OpenCV4Android环境后,就要着手开发自己的应用了.对于一个没有OpenCV基础的人来开发OpenCV应用确实有点难度,不过我们可以从samples里学起,结合javadoc和万能的网 ...
- openfire Android学习(六)----总结
Xmpp的一些方法整理到一个工具类中了 XmppConnection.java [java] view plaincopy [java] view plaincopy import java.io.B ...
- 六、Android学习第五天——Handler的使用(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...
- 二十六个月Android学习工作总结【转】
原文:二十六个月Android学习工作总结 1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该 ...
- 【Android】完善Android学习(六:API 4.0)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
- 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST
目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...
随机推荐
- swift混编oc碰到的问题
在swift中混编苹果官方的Reachability OC文件. 因为swift工程的target是生成framework而非app,framework中调用oc与app中使用桥接文件还不一样,参考: ...
- Python爬虫:一些常用的爬虫技巧总结
爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...
- C#窗体 LISTVIEW
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- HTML5的 2D SVG和SVG DOM的学习笔记(2)---SVG动画
SVG支持动画.可以通过以下几种方法获得动画效果: 使用SVG动画元素.SVG可以描述随时间变化的图形对象,使用不同的动画元素可以定义运动路径,淡入淡出效果和对象的膨胀.收缩.旋转和变换颜色. 使用S ...
- SSM框架学习之高并发秒杀业务--笔记3-- Service层
上一节中已经包DAO层编写完成了,所谓的DAO层就是所有和数据访问的部分都应该放在这个层里,它负责与数据库打交道.对于一个web项目来说,大概由这几部分组成: 1. 前台的显示层. 2. 分发处理请求 ...
- z-index、display、selector选择器优先级css优先级面试用到
z-index:控制元素叠放顺序,哪个z-index数值越大,那个优先被叠放在上面. relative.absolute.fixed这三种情况可以使用z-index. static不可以使用. dis ...
- 调用回调函数出现或者大循环出现has triggered a breakpoint
triggered a breakpoint 的意思是触发一个断点.这个问题一般发生在程序运行过程中.下面是错误发生显示的信息:Windows has triggered a breakpoint i ...
- 《Java中的单例模式--两种》
//单例模式:饿汉式和懒汉式 //单例模式 /* 设计模式:解决某一类问题行之有效的解决办法(思想). 单例(Singleton):设计模式: 学习设计模式必须先弄清楚它是解决什么问题的. 单例模式是 ...
- oracle 拼接一张表所有字段
declare t_name varchar2(100) := upper('dba_tab_columns'); cursor c_col is select column_name from db ...
- php大力力 [046节] 兄弟连高洛峰 PHP教程 2015年[最新最新最新最新最新]
兄弟连高洛峰老师新版PHP视频教程列表[每日更新] http://bbs.lampbrother.net/read-htm-tid-160506.html HTML部分1.[2015]兄弟连高洛峰 H ...