思路超简单的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专题】: TCP通信客户端app的demo的实现

UDP Client客户端  http://blog.csdn.net/shankezh/article/details/50731287 UDP Server服务器 http://blog.csd...

Android简单的socket网络通信例子--群聊

Android的网络通信很多都是基于socket,在这里说一下简单的Android的socket通信的例子。

android网络应用入门demo——Socket方式与获得服务器数据

android网络应用入门demo——Socket方式与获得服务器数据

关注CSDN程序人生公众号,轻松获得下载积分

关注公众号 在公众号里回复“”秘密“”两个字 返回 http://task.csdn.net/m/task/home?task_id=398 领取奖励 提示:根据公众号里的自动回复,完成...

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

UDP Client客户端  http://blog.csdn.net/shankezh/article/details/50731287 UDP Server服务器 http://blog.csd...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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