`

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();
			// }
		}
	};
	
	
}

 

分享到:
评论

相关推荐

    android4.0 socket 例程 例子 源代码

    android4.0 socket 例程 例子 源代码 一个整理之后的socket源代码,专门针对于android 4.0以上版本的操作系统。

    Android 4.0 Socket调试工具制作教程及源码

    Android 4.0以后版本的网络连接必须在非主线程中调用 特此教程 制作教程参考博客 http://coder.beitown.com/archives/757

    androidstudio实现socket通讯

    Android通过socket套接字实现网络连接,通过ip地址和ip端口实现访问服务器,从而实现客户端和服务器的连接,然后实现两者数据的互连

    android4.0_Socket和PC通信

    刚刚结束android这两天从网上找了很多关于Socket通信的例子,结果都是不成功,自己查了很多资料,发现android4.0不能再主线程中穿件socket实例,最后只能创建一个新的线程创建socket实例了。测试成功,特来分享

    Android中socket通信简单实现

    Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。 先上个图: 这里以一个APP作为服务器跟客户端为示例 1、添加网络访问权限 2、写...

    Android 4.0网络编程详解

    《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载上传,Socket编程,浏览器开发,Android中软件界面设计新大陆——采用HTML设计软件界面,Android应用程序的...

    Android用socket实现TCP通讯

    Android用socket技术实现的TCP通讯实例,代码中包括了服务端和客户端。代码完整清晰,功能仅为socket通讯。一般的资源只有客户端或服务端其中一种,这个工程里两个都有。

    android studio Socket客户端服务器通信 TCP/IP通信

    android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信

    java服务端+android socket 子线程+handler实现4.0版本后socket

    3分也不高,主要是码不错,解决了android4.0以后socket无法在主线程中实现网络连接,当然暴力的方法也有,既存在即合理,暴力方法在主线程中网络连接会导致很多问题,很适合初学者来看的代码,带注释;

    android3.0socket通讯实现代码.pdf

    android3.0socket通讯实现代码.pdf

    安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip

    安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 内容概要:安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 适合人群:具备一定编程基础,准备毕业设计的同学 能学到什么:①如何...

    Android4.0网络编程详解

    资源名称:Android 4.0网络编程详解 内容简介:《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载/上传,Socket编程,浏览器开发,Android中软件界面设计新...

    android4.0网络编程详解——源码

    第1章:Android4.0开发环境搭建和测试到第7章:Android中的Socket编程

    Android实现基于socket的聊天

    实现了基于socket的Android聊天开发 同时实现了本地的消息存储

    Android 通过Socket 和服务器通讯

    Android 通过Socket 和服务器通讯,是一种比较常用的通讯方式,时间比较紧,说下大致的思路,希望能帮到使用socket 进行通信的人 (1)开启一个线程发送消息 SocketOutputThread 消息是放在队列里的,当有消息后...

    android实现socket通讯

    Android 实现网络通讯源码,有客户端和服务器端的代码!下载就可以用

    android socket通讯例子

    android socket通讯例子 android socket通讯例子 android socket通讯例子 android socket通讯例子

    《Android4.0网络编程详解》 高清扫描 完整版 PDF电子书 详细书签

    《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载/上传,Socket编程,浏览器开发,Android中软件界面设计新大陆——采用HTML设计软件界面,Android应用程序的...

    android3.0socket通讯实现代码[定义].pdf

    android3.0socket通讯实现代码[定义].pdf

    android4.0网络编程

    android4.0上网络编程的学习代码,socket xml,平台搭建

Global site tag (gtag.js) - Google Analytics