`

Android4.0 的Socket 简单的通讯实现

阅读更多

首先给大家解释下Socket
1.什么是TCP/IPUDP
2.Socket在哪里呢?
3.Socket是什么呢?
4.你会使用它们吗?

什么是TCP/IPUDP

TCP/IPTransmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDPUser Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系。



1

TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IPUDP的关系了吧。
Socket在哪里呢?
在图1中,我们没有看到Socket的影子,那么它到底在哪里呢?还是用图来说话,一目了然。

 



2

原来Socket在这里。
Socket是什么呢?
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
你会使用它们吗?
前人已经给我们做了好多的事了,网络间的通信也就简单了许多,但毕竟还是有挺多工作要做的。以前听到Socket编程,觉得它是比较高深的编程知识,但是只要弄清Socket编程的工作原理,神秘的面纱也就揭开了。
一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。生活中的场景就解释了这工作原理,也许TCP/IP协议族就是诞生于生活中,这也不一定。

3

先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

了解Socket , 看下服务端的 创建,建立一个Java工程。随便写一类

import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * @author Saidy 
 * @create 2014-9-29 下午23:45:19
 * @version 1.0
 * @see
 */
public class SocketServer {


	static ServerSocket aServerSocket = null; // Server Socet.
	DataInputStream aDataInput = null; // Server input Stream that to
	// receive msg from client.
	DataOutputStream aDataOutput = null; // Server output Stream that to
	static ArrayList list = new ArrayList();
	
	public SocketServer() {
		// TODO Auto-generated constructor stub
	}

	public static void main(String[] args) throws IOException {
		try {
			aServerSocket = new ServerSocket(9999); // listen 8888 port.
			System.out.println("already listen 9999 port.");
		} catch (Exception e) {
			e.printStackTrace();
		}
		while (true) {
			//这里就开始监听有没有客户端连接。因此你在debug的时候
			//它就在这里等 clint端 连接了。没有 它就死等。因为不连接它不知道去往哪里发?
			 Socket socket = aServerSocket.accept();
			 
			// 获取输出流
			 
			 BufferedWriter writer = new BufferedWriter(
				       new OutputStreamWriter(socket.getOutputStream()));
			 Scanner s=new Scanner(System.in);
			 
			System.out.println("请输入数字");
			 writer.write( s.next());
			 writer.flush();
		     writer.close();
			
		}
	}

	
}

 

 

 

 

写完了一个Java 的Server socket的类之后。我们要去写一个Android的project。弄一个socket client

1) 对清单文件添加网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

2)写一个Activity ,注意用的是子线程去连接Socket Server

package com.example.socketclientdemo;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

/**
 * @author Saidy
 * @create 2014-9-29 下午11:41:20
 * @version 1.0
 * @see
 */

public class SocketActivity extends Activity {
	EditText editText = null;
	Button sendButton = null;
	TextView display = null;
	Socket client = null;
	MyHandler myHandler;
	DataOutputStream dout;
	DataInputStream din;
	String sendText = "";
	private String line;

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		editText = (EditText) findViewById(R.id.message);
		sendButton = (Button) findViewById(R.id.send);
		display = (TextView) findViewById(R.id.display);
		sendButton.setOnClickListener(listener);
		display.setText(line);
		myHandler = new MyHandler();

	}

	class MyHandler extends Handler {

		// 子类必须重写此方法,接受数据
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			Log.d("MyHandler", "handleMessage......");
			display.setText(line);
			Log.i("PDA", "----->" + line);
			super.handleMessage(msg);
			// 此处可以更新UI
 
			if (client != null && client.isConnected()) {
				// 处理UI
				display.setText(line);
				Log.i("PDA", "----->" + line);
			}

		}
	}

//	class MyThread extends Thread {
//
//		public void run() {
//			try {
//				client = new Socket("192.168.1.100", 9999);
//				// 获得输入流
//				BufferedReader br = new BufferedReader(new InputStreamReader(
//						client.getInputStream()));
//				line = br.readLine();
//				br.close();
//			} catch (UnknownHostException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			} catch (IOException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			while (true) {
//				try {
//					Thread.sleep(1000);
//				} catch (InterruptedException e) {
//					// TODO Auto-generated catch block
//					e.printStackTrace();
//				}
//				Message msg = new Message();
//				SocketActivity.this.myHandler.sendMessage(msg);
//			}
//		}
//	}

	OnClickListener listener = new OnClickListener() {

		@Override
		public void onClick(View v) {

			// TODO Auto-generated method stub
			
			new Thread() {

				public void run() {
					try {
						client = new Socket("192.168.1.102", 9999);
						// 获得输入流
						BufferedReader br = new BufferedReader(new InputStreamReader(
								client.getInputStream()));
						line = br.readLine();
						br.close();
					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					while (true) {
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						myHandler.sendEmptyMessage(0);
					}
				}
			}.start();
		
			
			// try {
			// // din = new DataInputStream(client.getInputStream());
			//
			//
			// /*
			// * display.setText(display.getText().toString() + "\n" +
			// * "服务器发来的消息:" + din.readUTF());
			// */
			// /*
			// * display.setText(display.getText().toString() + "\n" +
			// * "服务器发来的消息--:" + din.readUTF());
			// */
			// } catch (UnknownHostException e) {
			// // TODO Auto-generated catch block
			// e.printStackTrace();
			// } catch (IOException e) {
			// // TODO Auto-generated catch block
			// e.printStackTrace();
			// }
		}
	};
	
	
}

 

分享到:
评论

相关推荐

    android手机和西门子s1200 PLC通讯socke通讯调试好源码

    本文将详细讨论如何使用Android手机通过Socket通信与西门子S1200 PLC进行交互,实现远程控制和数据交换。西门子S1200是一款先进的可编程逻辑控制器(PLC),支持开放式以太网通信,这使得它能够直接与网络中的其他设备...

    Android应用源码安卓源码包wifi蓝牙串口&Socket通讯窗口抖动Widget小组件等20个合集.zip

    Android应用源码安卓源码包wifi蓝牙串口&Socket通讯窗口抖动Widget小组件等20个合集: android Widget小组件开发.zip Android 开启指定名称和密码的 Wifi热点 demo.zip Android中禁止某软件的安装.zip Android小部件...

    蓝牙4.0传输文件Socket通信批量传输选取的若干图片并显示

    打开APP后自动开启Socket等待连接,与客户端连接上后,自动开始发送数据。 - 一台手机作为接收端,右上方顶部ActionBar有一个按钮,点击后从本地图库添加图片和拍照获取图片。底部有一个按钮,连接上服务端之后点击...

    Android 通过wifi进行p2p通讯和文件传送

    在Android平台上实现通过WiFi进行P2P(点对点)通信和文件传输是一项技术含量较高的任务,尤其适用于局域网内的聊天应用或游戏开发。在Android 4.0及以上版本,系统引入了Wi-Fi Direct功能,使得设备可以直接连接,...

    2013 Android应用设计大赛样题

    4. 无线网络通信:赛事要求参赛者通过WiFi自动连接至指定网络,并使用Socket通讯协议与嵌入式机器小车进行实时通信。对TCP/IP协议的理解和应用能力是完成这一任务的关键。 5. 应用界面设计:按照Android 4.0的UI...

    系统拓扑图和技术实现方案.docx

    技术实现上,手机端APP基于Android 4.0源生API开发,支持多种分辨率,通过HTTP协议与服务器接口通信。PC端系统采用.NET 4.0框架,结合Nhibernate和Spring.Net进行开发。人员定位方式包括GPS卫星定位和基站定位,GIS...

    系统拓扑图和技术实现方案.pdf

    - 系统组件:PC端和Android4.0 API开发的手机端APP,数据通讯方式与前两个系统相同。 - 地图应用:通过接入百度手机端API实现地图功能,GIS应用同样依赖百度地图API。 总结来说,这些系统都利用了现代信息技术,...

    手机可连接硬件蓝牙并通讯(AndroidStudio)

    在这个项目中,我们将深入探讨如何使用Android Studio实现手机通过蓝牙2.0(也称为经典蓝牙)或Bluetooth Low Energy (BLE,蓝牙低功耗)技术与硬件设备进行连接和通信。 首先,我们需要理解蓝牙2.0和BLE的区别。...

    Delphi XE5_android_蓝牙通讯传输.rar

    本资源“Delphi XE5_android_蓝牙通讯传输.rar”专注于在Android平台上使用Delphi XE5进行蓝牙通信的实现。 蓝牙通信是现代移动设备之间数据交换的重要手段,尤其是在需要设备间短距离无线交互的场景下。在Android...

    jnaCan:Java 的 CAN 总线,使用 JNA 访问 Linux SocketCan API

    包括 Netty 4.0 通道实现。 jnaCan 在 GNU LESSER GENERAL PUBLIC LICENSE Version 3 下获得许可,请参阅 LICENSE.txt jnaerator 开关 请注意,Linux C 头文件中定义的某些常量在您的平台上可能不同,因此生成的 ...

    abandoned-android-peer-discovery:在 Android 上进行 P2P 实验

    在Android平台上进行P2P(Peer-to-Peer)实验,主要涉及到的是设备之间的通信与协作,这在现代移动应用开发中具有广泛的应用场景,如文件共享、即时通讯等。Java作为Android的主要编程语言,提供了丰富的API和技术...

    智慧农业物联网、电商、农产品追溯、休闲农业平台建设方案(规划版).pdf

    4. 支持 Socket、HTTP 通讯协议。 5. 使用 JQuery 构建 Web 前端。 6. 使用 Android 和 iOS 构建移动应用终端。 该平台的建设将极大地提高农业生产的效率和质量,提高农业生产者的收益,提高产品的安全性和可追溯...

    智慧农业物联网、电商、农产品追溯、休闲农业平台建设方案(规划版).docx

    * 支持 Socket、HTTP 通讯协议 * 以 JQuery 构建 Web 前端 * 以 Android 和 iOS 构建移动应用终端 五、平台拓扑结构 * 支持 10000 个以上传感设备并发连接,每 1 秒一个心跳业务处理 * 支持中间层高性能分布式部署...

    智慧农业云平台解决方案.docx

    6. 系统架构与技术标准:平台基于.NET Framework 4.0构建,支持微软云部署,采用JSON数据格式,使用Socket和HTTP通讯协议,前端使用JQuery,移动端使用Android和iOS技术。设计上考虑了高并发处理能力、分布式部署和...

    仿QQ系统集合

    首先,"仿QQ聊天系统4.0.zip"可能是一个实现了基本即时通讯功能的系统,其核心是网络编程,通常采用TCP/IP协议栈进行数据传输,保证消息的可靠性和顺序性。在Java中,可以使用Socket编程或者NIO(非阻塞I/O)来实现...

    智慧农业物联网、电商、农产品追溯、休闲农业平台建设方案.docx

    系统设计遵循先进性和扩展性的原则,采用.NET Framework 4.0、JSON数据格式、Socket和HTTP通讯协议,以及Android和iOS的移动应用,确保了大规模并发连接和数据安全。 标准化生产管理系统则强调了任务管理、流程自动...

    智慧农业云平台项目解决方案.pdf

    使用JSON数据格式进行传输,采用Socket和HTTP通讯协议,并使用JQuery构建Web前端,Android和iOS构建移动应用。平台设计考虑了高并发处理能力(支持超过10000个传感器并发连接),分布式部署,跨域访问,Http和https...

    智慧农业系统平台实施方案.docx

    - 使用JQuery Web构建前端,JSON数据格式传输,支持Socket、HTTP通讯协议。 - 平台设计考虑了未来信息化发展和业务需求,能够处理大量并发连接(如10000个以上传感器设备)和高频率的业务处理。 6. **视频图像...

Global site tag (gtag.js) - Google Analytics