文档章节

Android网络通信Socket使用

俪文
 俪文
发布于 2014/03/31 19:47
字数 868
阅读 106
收藏 6

      前一段时间做项目,涉及到TCP和UDP的使用,长期做单机的东西,一下跳到网络真的不适应,记录一下这些东西的入门级使用。

      总体来说,TCP和UDP的使用流程分三步,只是TCP和UDP使用的类有所不同

图一 总体流程

        具体使用的类在表一中列出,TCP是使用流传输,而UDP将数据打包发送。


TCP/IP UDP
Socket Scoket DatagramSocket
Outputstream DataOutputStream/PrintWirter DatagramPacket
send Outputstrem.flush(); DatagramPacket.send
        其中有些地方还是比较困惑的:DataOutputStream/PrintWirter有什么区别呢?

  客户端-TCP使用方法

                Socket socket = null;
		DataOutputStream out = null;
		//DataInputStream in = null;

		try {
			//Socket实例化
			socket = new Socket();
			//IP地址对象构造
			InetAddress addr = Inet4Address.getByName(ip);
			//1)Socket链接服务器(指明端口和IP)
			socket.connect(new InetSocketAddress(addr, port));
			////设置超时限制(未使用)
			// socket.setSoTimeout(2000);
			//2)获取Socket对象的OutputStream
			out = new DataOutputStream(socket.getOutputStream());
			//in = new DataInputStream(socket.getInputStream());
			if (out != null) {
				//特殊格式(可以忽略)
				String value = msg;
				byte[] data = value.getBytes();
				int size = data.length;

				byte[] bt = new byte[4];
				bt[0] = (byte) size;
				bt[1] = (byte) (size >> 8);
				bt[2] = (byte) (size >> 16);
				bt[3] = (byte) (size >> 24);
				//写入数据
				out.write(bt);
				out.write(data);
				//3)传输数据
				out.flush();

			}
		} catch (Exception e) {
			// System.out.println(e.getMessage());
		} finally {
			try {
				if (out != null)
					out.close();
				//if (in != null)
					//in.close();
				if (socket != null)
					socket.close();
			} catch (IOException e) {
			}
		}

   客户端-UDP使用方法

DatagramSocket socket;
		try {
			//特殊格式(可以忽略)
			byte[] data = msg.getBytes(charset);
			int size = data.length;

			byte[] bt = new byte[4];
			bt[0] = (byte) size;
			bt[1] = (byte) (size >> 8);
			bt[2] = (byte) (size >> 16);
			bt[3] = (byte) (size >> 24);

			//1)DatagramSocket对象实例化
			socket = new DatagramSocket();
			//IP地址对象实例化
			InetAddress ipAdress = InetAddress.getByName(ip);
			//2)构造DatagramPacket对象,用于封装和发送数据
			DatagramPacket packet = new DatagramPacket(data, data.length,
					ipAdress, port);
			//3)数据发送
			socket.send(packet);
			socket.close();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

  服务器接收端TCP需要通过ServerSocket与设备端口进行链接,接收Socket利用InputStream获取数据;UDP依然利用DatagramSocket与端口链接,DatagramPacket获取数据。

   服务器端 - TCP

ServerSocket serverSocket=new ServerSocket(12345);
System.out.println("Create Serversocket");
////设置超时(未使用)
//serverSocket.setSoTimeout(5000);
//2>接受Socket
Socket socket=serverSocket.accept();
System.out.println("accept");
//3>获取Socket的InoutStream
InputStream input=socket.getInputStream();
byte[] buffer=new byte[1024*4];
//4>读取数据
input.read(buffer);
System.out.print(new String(buffer).trim());
//5>关闭Socket
socket.close();
serverSocket.close();
serverSocket=null;

   服务器端-UDP

//1>构建DatagramSocket链接端口
DatagramSocket socket=new DatagramSocket(12345);
byte[] buffer=new byte[1024];
//2>构建DatagramPacket用于接收数据
DatagramPacket packet=new DatagramPacket(buffer, buffer.length);
//3>获取数据
socket.receive(packet);
System.out.println("Receive");
//4>设置偏移量的方法,解决了传输数据中的乱码问题
System.out.println(new String(packet.getData(),packet.getOffset(),packet.getLength()));
//5>一定要关闭,否则影响下次使用
socket.close();

常见问题:

    1>ECONNREFUSED 问题 :这个问题困扰了我好久,其实处理起来比较容易,产生的原因是端口被占,或者ip错误,需要仔细检查IP和端口号,端口号可以设置大一些,1024一下的端口号容易被占用。

    2>程序在socket创建或连接的时候程序崩溃 :我出现这种情况大多是服务器没有开,并且使用的TCP协议,打开就好了

    3>服务器端接收不到数据 :我使用的是校园网和实验室的无线网,只有两种情况可以接受到数据,第一种,服务器和手机终端连接在同一个路由器上;第二种服务器连接在校园网上,手机连接没有限制。原因暂时还不太清除


© 著作权归作者所有

俪文
粉丝 0
博文 3
码字总数 2650
作品 0
徐州
私信 提问
android网络通信之socket教程实例汇总

一、socket基础 1、Socket通讯机制(详细),如何将socket通信的客户端与服务器 http://www.eoeandroid.com/thread-61727-1-1.html 2、Http和Socket区别 http://www.eoeandroid.com/thread-9...

程序袁_绪龙
2014/12/11
0
0
TCP/UDP协议与Socket

> Socket的TCP UDP通信,TCP、UDP网路协议; TCP使用的是流的方式发送,UDP是以包的形式发送。 1.构建tcp客户端的关键类: Socket; PrintWriter;InputStream;DataInputStream; Socket socke...

desaco
02/21
0
0
android的NDK和java进行本地socket通信

关于Android应用与Framework的socket通信,相信关心这个问题的朋友们已经看过《android使用socket使底层和framework通信》这篇文章,美中不足的是作者只贴出一些关键的代码片段而并没有放出源...

shouyong
2012/12/21
0
0
Android必备:Android Socket编程的了解与学习整理

看这里:Android必备:Android Socket编程的了解与学习整理 最近学习Android的过程中,由于项目、业务等因素影响,服务端通过Socket进行通信,于是开始学习Socket编程,之前的开发中,很少涉...

Realfighter
2015/03/02
0
0
android socket各种通信

我已经试验成功: ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。 PC访问模拟器用localhost即127.0.0.1, 模拟器 访问 模拟器用10.0.2.2 本人已成功运...

buleberry
2014/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代码持续自动发布

需求: 自动更新私人gitbook项目代码 如果代码没更新,不做务必要的构建操作 思路 定时任务加shell脚本,无论更新没更新都执行git pull。 优点:能满足需求 资源浪费,代码仓库不更新也执行p...

阿dai学长
29分钟前
6
0
sparkstreaming原理

Spark Streaming是Spark生态系统当中一个重要的框架,它建立在Spark Core之上,下面这幅图也可以看出Sparking Streaming在Spark生态系统中地位。 Spark Streaming是Spark Core的扩展应用,它...

七旬少女
48分钟前
1
0
springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
今天
4
0
HDFS-原理

1. 写操作 客户端要向HDFS写数据,首先要跟Namenode通信以确认可以写文件并获得接收文件block的Datanode,然后,客户端按顺序将文件逐个block传递给相应Datanode,并由接收到block的Datanod...

叶枫啦啦
今天
3
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部