Android网络应用之Socket(一)
socket编程是网络通信的一个基础应用。不管是手机端还是PC端都须要socket技术来建立网络通信。
在本章小编主要从下面几个方面来介绍socket的相关知识:
各自是“什么是socket?”,“socket有什么特点?”,“socket与Http以及TCP的差别”。“移动端socket的Demo”。写的不好的地方请大家批评指正。
一、何为socket?
用于在client和服务端之间建立一个通信管道,使得应用程序/client能够通过这个通信管道向server/还有一台主机发送请求,同一时候server也能够进行对应,建立两者之间的传输数据与交换。
在Android中,我们知道每一个应用程序都能够使用多线程来进行操作,用于网络传输的app的多个线程能够都建立一个socket连接。每一个线程维护自己的socket管道,从而实现并发的网络通信。
二、socket的特点及通信原理
TCP是可靠的而UDP是不可靠的,原因就是TCP建立时须要三次握手。两方建立通信管道才干够传输数据,且是双向的。
而UDP在传输数据时仅仅是把应用层发来的数据进行打包而且附上目的的地址,不负责对方是否接收到。
而client方面是先发送输出流,再接收到输入流。
三、socket与HTTP、TCP的差别
从上节已经了解到socket的连接是从server监听開始的,而在TCP方面,client与server的连接须要经过三次握手之后才正式開始数据的传输,而HTTP则是基于"请求-响应"才干建立传输数据,什么意思呢?仅仅有先请求,server才干对外发数据,不能主动建立传输。在HTTP经过了0.9、1.0和1.1时代,这样的连接模式能够在一次TCP连接建立时一直保持。响应多次请求。
四、Demo
我们的Demo主要功能是在编辑框中编写一段文字,然后按发送button。最后内部实现通过socket的通信方式。反馈到textview上进行显示编辑的内容。里面的细节重点会在末尾处分析。
- android:id="@+id/btn_conn"/>
- <EditText
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:hint="请在这里编辑要发送的内容"
- android:id="@+id/et_message"/>
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="发送"
- android:id="@+id/btn_sent"/>
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:id="@+id/tv"
- android:hint="接收发来的数据"/>
- </LinearLayout>
布局效果例如以下:
中文能够使用GB2312.
- package com.example.mysocketdemo;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.UnsupportedEncodingException;
- import java.net.Socket;
- import java.net.UnknownHostException;
- import android.app.Activity;
- import android.app.ActionBar;
- import android.app.Fragment;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.text.Editable;
- import android.view.LayoutInflater;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.os.Build;
- public class MainActivity extends Activity {
- private TextView tv;
- private Button btnsent,btnconn;
- private EditText ed_message;
- private OutputStream output;
- private Socket clientSocket;
- private Handler mHandler;
- private MyThread mythread;
- boolean stop = true;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- if (savedInstanceState == null) {
- getFragmentManager().beginTransaction()
- .add(R.id.container, new PlaceholderFragment())
- .commit();
- }
- init();
- //onClickEvent---connect
- btnconn.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- try {
- clientSocket = new Socket("127.0.0.1", 8888);
- } catch (UnknownHostException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Toast.makeText(getApplicationContext(), "connect ok", Toast.LENGTH_SHORT).show();
- //把socket绑定到自己的线程对象
- try {
- mythread = new MyThread(clientSocket);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- mythread.start();//启动线程
- //更新UI,大部分的数据工作已经交给了mythread对象
- btnsent.setEnabled(true);
- btnconn.setEnabled(false);
- stop = false;
- }
- });
- //sent Message
- btnsent.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- //当点击button时,会获取编辑框中的数据,然后提交给线程
- //先将发送内容进行打包
- byte[] msgBuffer = null;
- try {
- msgBuffer = ed_message.getText().toString().getBytes("GB2312");
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //打包完毕之后,加入socket的输出流对象
- try {
- output = clientSocket.getOutputStream();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- //输出流对象将字节写入
- //不管是输出流还是输入流。操作的都是字节,假设向变成字符串,须要自己构建String对象
- output.write(msgBuffer);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Toast.makeText(getApplicationContext(), "发送成功", Toast.LENGTH_SHORT).show();
- ed_message.setText("");
- }
- });
- //在连接和发送数据之后。接下来就是处理了,发送的数据会通过message的方式传递到消息队列,再由handl进行获取
- mHandler = new Handler(){
- public void handleMessage(android.os.Message msg) {
- tv.setText(msg.obj.toString());
- };
- };
- }
- public void init()
- {
- tv = (TextView) findViewById(R.id.tv);
- btnsent = (Button) findViewById(R.id.btn_sent);
- ed_message = (EditText) findViewById(R.id.et_message);
- btnconn = (Button) findViewById(R.id.btn_conn);
- btnconn.setEnabled(true);
- btnsent.setEnabled(false);
- }
- //自己定义线程类;
- private class MyThread extends Thread{
- //构建自己的socket对象,用来在线程内使用
- private Socket socket;
- private byte[] buf = null;
- private InputStream inputstream;
- String str = null;
- public MyThread(Socket socket) throws IOException
- {
- this.socket = socket;
- inputstream = this.socket.getInputStream();
- }
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(!stop)
- {
- buf = new byte[512];
- //将inputstream内的数据读到buf里
- try {
- this.inputstream.read(buf);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- try {
- //将buf里的字符流进行解析,得到
- this.str = new String(buf, "GB2312").trim();
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //线程内获取了来自socket的Inputstream字节流,而且转换成字符串后,线程就获取了消息的实体内容
- //此时线程将运行自己的一个使命。就是创建消息,并发送出去
- Message msg = new Message();
- msg.obj = this.str;
- mHandler.sendMessage(msg);
- }
- }
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- if (mythread!=null) {
- mythread.interrupt();
- }
- super.onDestroy();
- }
当socket的getOutputStream获取了outputstream对象之后,运行了write方法进行数据的写入,而此时线程依旧在运行,它突然发现连接的socket里有数据了,就使用getIupteStream获取了inputstream对象,採用了read方法读取了字节流,最后打包成字符串。
Android网络应用之Socket(一)的更多相关文章
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- Android中基于Socket的网络通信
1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...
- Android 网络编程 Socket Http
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- 在Android上使用Socket
原文地址:http://www.cnblogs.com/kross/p/3621952.html 考虑到以后可能要用到这方面的知识,就来写个Demo尝试下,其实以前学过,但不记得了……(用不到的东西各 ...
- Android 网络通信之Socket
Android 网络通信之Socket 应用软件的网络通信无非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的话就衍生出很多方式,基础的HTTP GET和POST请求,然 ...
- 【Android实战】Socket消息通信
这篇博客的内容是基于http://my.oschina.net/fengcunhan/blog/178155进行改造的.所以须要先看完这篇博客,然后再来看以下的内容. 1.须要完毕的功能是直播间的so ...
- Android进程间通信之socket通信
用Java中的socket编程. 通过socket实现两个应用之间的通信,可以接收和发送数据,同时将接收到的数据显示在activity界面上. Server端: ServerLastly.java p ...
- [Android] HttpURLConnection & HttpClient & Socket
Android的三种网络联接方式 1.标准Java接口:java.net.*提供相关的类//定义地址URL url = new URL("http://www.google.com" ...
- android中利用Socket实现手机客户端与PC端进行通信
1. 项目截图
随机推荐
- php-wamp环境搭建
wamp(Windows,Apache,Mysql,PHP) win8.1下搭建apache2.4(64位) php5.6.11(64位) mysql5.6.24(32位) d盘创建文件结构为: ...
- 无状态会话bean(1)---定义
无状态会话bean用于完毕在单个方法的生命周期内的操作.无状态bean能够实现很多业务操作,可是每一个方法都不能假定不论什么其它的方法会在它之前调用.后半句的意思是如今的你可能不是刚才的你.明天的你可 ...
- (转)iptables常用规则:屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链
转自:http://lesca.me/archives/iptables-examples.html 本文介绍25个常用的iptables用法.如果你对iptables还不甚了解,可以参考上一篇ipt ...
- 杭州"人才新政22条" 硕士来杭工作一次性补贴2万元
转载自原文杭州"人才新政22条" 硕士来杭工作一次性补贴2万元 2016-11-8 继去年1月推出“人才新政27条”后,杭州在引才上又将有新动作.在昨天举行的2016浙江·杭州国际 ...
- [React] Style a React component with styled-components
In this lesson, we remove the mapping between a React component and the styles applied to it via cla ...
- akka---Getting Started Tutorial (Java): First Chapter
原文地址:http://doc.akka.io/docs/akka/2.0.2/intro/getting-started-first-java.html Introduction Welcome t ...
- RISC-V评估系列
RISC-V评估系列 RISC-V工具链搭建 SiFive虚拟机分享--提取码:xe1c SiFive SDK函数结构 底层驱动 driver框架 操作系统FreeRTOS移植 FGPA评估 benc ...
- [TypeScript] Interface and Class
When to use Interface and when to use Class. Let's see one example: export interface Lesson { course ...
- MongoDB集群安装与配置2.4.3版本
mongoDB安装http://www.mongodb.org/downloads拷文件到# cp mongodb-linux-i686-2.4.1.tgz /usr/local/进入目录:# cd ...
- [Angular2 Animation] Delay and Ease Angular 2 Animations
By default, transitions will appear linearly over time, but proper animations have a bit more custom ...