思路超简单的Android Socket 通信 Demo 注释详细

原创 2015年11月18日 19:26:01

思路超简单的Android Socket 通信  Demo 注释详细

demo下载  http://download.csdn.net/detail/menglele1314/9280379

服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。

Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。

Socket基本实现原理

TCP与UDP
1基于TCP协议的Socket
服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。
客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket("172.168.10.108",8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。
2基于UDP协议的数据传输
服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。
客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName("172.168.1.120")).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。*(Stringstr="hello";bytedata[]=str.getByte();DatagramPacketpacket=new DatagramPacket(data,data.length,serveraddress,4567);socket.send(packet);)
TCP使用的是流的方式发送,UDP是以包的形式发送。

上点代码

添加权限
<!--允许应用程序改变网络状态-->    
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>    
    
<!--允许应用程序改变WIFI连接状态-->    
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>    
    
<!--允许应用程序访问有关的网络信息-->    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>    
    
<!--允许应用程序访问WIFI网卡的网络信息-->    
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>    
    
<!--允许应用程序完全使用网络-->    
<uses-permission android:name="android.permission.INTERNET"/> 

客户端

package com.client;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

import org.apache.commons.io.IOUtils;

public class AbsClient {

	public static void main(String[] args) {
		request("registered");// login
	}

	public static String request(String params) {
		Socket socket = null;
		String object = null;
		try {
			// 1.连接服务器
			String ip = InetAddress.getLocalHost().getHostAddress();// 服务器Ip地址
			System.out.println("AbsClient*****连接服务器");
			socket = new Socket("127.0.0.1", 8485);
			System.out.println("AbsClient*****已经建立连接");
			// 2.发送请求数据
			System.out.println("AbsClient*****发送请求");
			sendRequest(socket.getOutputStream(), params);
			socket.isInputShutdown();
			System.out.println("AbsClient*****请求发送成功*****接收响应");
			// 3.接收并解析响应数据
			object = receiveResponse(socket.getInputStream());
			System.out.println("AbsClient*****响应接收完成*****服务器返回结果");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (null != socket) {
				try {
					// 4.断开连接
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 5.返回接收的数据
		return object;
	}

	/******** 生成并发送请求数据 ***************************************************/
	public static void sendRequest(OutputStream out, String params) throws Exception {
		out.write(params.getBytes());
		out.flush();
		System.out.println("AbsClient我发送到服务端去》》》" + params);
	}

	/*********** 接收并解析响应数据 ***********************************/
	public static String receiveResponse(InputStream in) throws Exception {
		String data = IOUtils.toString(in);// 保存从服务器响应的结果
		System.out.println("AbsClient我是收到服务端的》》》" + data);
		return data;
	}

}

服务端

package com.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class AbsServer {

	public static void main(String[] args) {
		thread.start();
	}

	static Thread thread = new Thread() {
		private ServerSocket ss;

		public void run() {
			try {
				ss = new ServerSocket(8485);
				System.out.println("AbsServer服务器已经启动");
				while (true) {
					Socket socket = ss.accept();
					try {
						socket.setSoTimeout(5 * 1000);
						// 1.接收并解析请求数据
						String type = receiveRequest(socket.getInputStream());
						String result = null;
						if ("login".equals(type)) {
							result = "AbsServer恭喜你注册成功,我是服务端返回的消息";
						} else {
							result = "AbsServer我是服务端返回的登录信息";
						}
						// 2.生成并发送响应数据
						sendRespnose(socket.getOutputStream(), result);
					} catch (Exception e) {
						System.out.println("AbsServer通信失败");
						e.printStackTrace();
					} finally {
						try {
							// 3.断开连接
							socket.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
			System.out.println("AbsServer服务器已经停止");
		}

		/********** 接收请求信息 ***************************************/
		public String receiveRequest(InputStream in) throws Exception {
			// 接收,解析请求
			byte[] buf = new byte[4096];
			in.read(buf);
			String type = new String(buf);
			System.out.println("AbsServer我从客户端来《《《" + type);
			return type;
		}

		/********** 返回请求要的信息 **************************************************/
		public void sendRespnose(OutputStream out, String result) throws Exception {
			out.write(result.getBytes());
			out.flush();
			System.out.println("AbsServer我发客户端去》》》" + result);
		}

	};

}


android之socket编程实例

注意点:注册访问的网络权限;android中UI线程不能有访问网络的操作,否则会报android.os.NetworkOnMainThreadException的异常 客户端 packa...
  • x605940745
  • x605940745
  • 2013年11月28日 10:23
  • 130807

android socket通信(上)

android socket通信(上) 今天我们介绍android下的socket通信,并编写一个小程序:android作为客户端,通过socket发送数据到我们的pc机,pc机就是服务器。...
  • htttw
  • htttw
  • 2012年05月16日 22:37
  • 91821

Android Socket源码实现与PC通讯

  • 2012年07月15日 08:54
  • 44KB
  • 下载

Android:这是一份很详细的Socket使用攻略

前言 Socket的使用在Android的网络编程中非常重要 今天我将带大家全面了解Socket及其使用方法 目录1.网络基础1.1 计算机网络分层计算机网络分为五层:物理层、数据链路层、网络层、运输...
  • carson_ho
  • carson_ho
  • 2016年11月27日 21:09
  • 24548

Android Socket 编程简单实现

网络通信基本有Socket和HTTP协议两种,其中Socket可以用TCP或UDP;而HTTP可以用HTTP GET或POST请求,HTTP Webservice的SOAP等方式。这里重点介绍Sock...
  • mojieke
  • mojieke
  • 2013年03月20日 13:40
  • 7078

【Android Socket专题】: UDP通信服务器端app的demo的实现

Android Socket 专题:本期介绍Android 下udp Server端实现 UDP Client客户端 UDP Server服务器 TCP Client客户端 TCP Server服务器...
  • shankezh
  • shankezh
  • 2016年05月19日 12:14
  • 5881

Android 基于TCP的 Socket 编程实现(结合 okio)

两个进程如果要进行通讯最基本的一个前提就是能够唯一的标识一个进程,在本地进程通讯中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地是唯一的,网络中两个进程 PID 冲突几率很大,这时我们...
  • yhaolpz
  • yhaolpz
  • 2017年03月31日 16:35
  • 4451

用Eclipse开发第一个Android应用程序HelloWorld

用Eclipse开发第一个Android应用程序HelloWorld(上篇)   2011-05-09 14:29:10|  分类:android开发 |  标签:|字号大中小 订阅 ...
  • wenhui_
  • wenhui_
  • 2011年10月09日 21:41
  • 84842

Android开发之Socket编程以及注意事项

注意:以下文字部分为转载部分,程序部分为原创。 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年03月23日 10:54
  • 11136

基于android的Socket通信

有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教。 一、Socket通信简介  Android与服务器的通信方式主要有两种,一是Htt...
  • maoxiao1229
  • maoxiao1229
  • 2014年04月03日 17:32
  • 58642
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:思路超简单的Android Socket 通信 Demo 注释详细
举报原因:
原因补充:

(最多只允许输入30个字)