首先给大家解释下Socket
1.什么是TCP/IP、UDP?
2.Socket在哪里呢?
3.Socket是什么呢?
4.你会使用它们吗?
什么是TCP/IP、UDP?
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种。
这里有一张图,表明了这些协议的关系。
图1
TCP/IP协议族包括运输层、网络层、链路层。现在你知道TCP/IP与UDP的关系了吧。
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 例程 例子 源代码 一个整理之后的socket源代码,专门针对于android 4.0以上版本的操作系统。
Android 4.0以后版本的网络连接必须在非主线程中调用 特此教程 制作教程参考博客 http://coder.beitown.com/archives/757
Android通过socket套接字实现网络连接,通过ip地址和ip端口实现访问服务器,从而实现客户端和服务器的连接,然后实现两者数据的互连
刚刚结束android这两天从网上找了很多关于Socket通信的例子,结果都是不成功,自己查了很多资料,发现android4.0不能再主线程中穿件socket实例,最后只能创建一个新的线程创建socket实例了。测试成功,特来分享
Android中socket通信简单实现 socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。 先上个图: 这里以一个APP作为服务器跟客户端为示例 1、添加网络访问权限 2、写...
《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载上传,Socket编程,浏览器开发,Android中软件界面设计新大陆——采用HTML设计软件界面,Android应用程序的...
Android用socket技术实现的TCP通讯实例,代码中包括了服务端和客户端。代码完整清晰,功能仅为socket通讯。一般的资源只有客户端或服务端其中一种,这个工程里两个都有。
android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信android studio Socket客户端服务器通信 TCP/IP通信
3分也不高,主要是码不错,解决了android4.0以后socket无法在主线程中实现网络连接,当然暴力的方法也有,既存在即合理,暴力方法在主线程中网络连接会导致很多问题,很适合初学者来看的代码,带注释;
android3.0socket通讯实现代码.pdf
安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 内容概要:安卓Android基于Socket简易聊天项目开发(源码+运行截图+视频).zip 适合人群:具备一定编程基础,准备毕业设计的同学 能学到什么:①如何...
资源名称:Android 4.0网络编程详解 内容简介:《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载/上传,Socket编程,浏览器开发,Android中软件界面设计新...
第1章:Android4.0开发环境搭建和测试到第7章:Android中的Socket编程
实现了基于socket的Android聊天开发 同时实现了本地的消息存储
Android 通过Socket 和服务器通讯,是一种比较常用的通讯方式,时间比较紧,说下大致的思路,希望能帮到使用socket 进行通信的人 (1)开启一个线程发送消息 SocketOutputThread 消息是放在队列里的,当有消息后...
Android 实现网络通讯源码,有客户端和服务器端的代码!下载就可以用
android socket通讯例子 android socket通讯例子 android socket通讯例子 android socket通讯例子
《Android 4.0网络编程详解》对Android 4.0网络编程中的XML形式,JSON操作,需要掌握的HTTP知识,数据下载/上传,Socket编程,浏览器开发,Android中软件界面设计新大陆——采用HTML设计软件界面,Android应用程序的...
android3.0socket通讯实现代码[定义].pdf
android4.0上网络编程的学习代码,socket xml,平台搭建