`
zhoujianghai
  • 浏览: 434326 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android实现TCP与UDP传输

阅读更多

 

关于TCPUDP协议的描述,可参考http://zhoujianghai.iteye.com/blog/1052970

 

下面是androidPC端使用TCPUDP协议通信的例子:

PC端作为服务器,android端使用TCP协议与服务器建立连接,使用UDP协议接受和发送数据。

服务器端代码:

ThunderServer.java

 

package com.zhoujh.thunder.server;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;

/**
 * 服务器端
 * @author 
 * zhoujianghai
 * 2011-5-15
 * 下午05:10:50
 */
public class ThunderServer{
	private static int ID = 1;
	
	/**TCP端口 */
	private static final int TCP_PORT = 8000;
	/**UDP端口 */
	private static final int UDP_PORT = 9999;
	
	
	/**与服务器已经建立链接的客户端数量 */
	private ArrayList<Client> clients = new ArrayList<Client>();
	
	public static void main(String args[]) {
		new ThunderServer().start();
	}

	private void start() {
		new UDPThread().start();
		ServerSocket serverSocket = null;

		try {
			serverSocket = new ServerSocket(TCP_PORT);
		} catch (IOException e) {
			e.printStackTrace();
		}
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				System.out.println("socket="+socket);
				
			
				String IP = socket.getInetAddress().getHostAddress();
				Client c = new Client(IP);	
				clients.add(c);
				
				DataOutputStream out = new DataOutputStream(socket.getOutputStream());
				out.writeInt(ID++);
				
				System.out.println("一个新的客户端已连接,IP:"+IP+";port="+socket.getPort()+"; ID="+(ID-1));
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(socket != null) {
					try {
						socket.close();
						socket = null;
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}
		
	}
	
	/**
	 * 客户端:ip地址和udp端口
	 * @author 
	 * zhoujianghai
	 * 2011-5-15
	 * 下午04:41:09
	 */
	private class Client {
		String IP;
		int udpPort;

		public Client(String IP) {
			this.IP = IP;
		}
		public void setUdpPort(int udpPort) {
			this.udpPort = udpPort;
		}
	}
	
	/**
	 * 接收客户端发送的数据,并把接收到的数据发送给所有客户端,使用UDP协议
	 * @author 
	 * zhoujianghai
	 * 2011-5-15
	 * 下午04:54:03
	 */
	private class UDPThread extends Thread {
		//服务器每次收发数据的缓冲区,大小是1024个字节
		byte[] buf = new byte[1024];
		
		public void run() {
			DatagramSocket ds = null;
			try {
				ds = new DatagramSocket(UDP_PORT);
			} catch (SocketException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			while(ds != null) {
				DatagramPacket packet = new DatagramPacket(buf, buf.length);

				try {
					//接收数据包
					ds.receive(packet);
					System.out.println("地址:"+packet.getAddress()+"  端口:"+packet.getPort()+"数据:"+new String(packet.getData()));
					String clientIp =  (packet.getAddress().toString().split("/")[1]);
					for(Client c:clients) {
						
						if(clientIp.trim().equals(c.IP) && c.udpPort == 0) {
							c.setUdpPort(packet.getPort());
						}
					}
					//把接收到的数据包发送给所有已连接的客户端
					System.out.println("clients.size="+clients.size());
					for(Client c:clients) {
						System.out.println("server send:IP="+c.IP+"; udpPort="+c.udpPort);
						//设置数据包要发送的客户端地址
						packet.setSocketAddress(new InetSocketAddress(c.IP, c.udpPort));
						ds.send(packet);
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
}
 

客户端的核心代码:

 

public void connectServer(String IP,int port) {

		this.IP = IP;
		
		try {
			socket = new DatagramSocket(udpPort);
		} catch (SocketException e) {
			e.printStackTrace();
		}
		
		Socket s = null;
		try {
			s = new Socket(IP,port);
			System.out.println("s="+s);
			
			DataInputStream dis = new DataInputStream(s.getInputStream());
			int id = dis.readInt();
			System.out.println("id="+id);
	
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(s != null) {
				try {
					s.close();
					s = null;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	
	}
 

 

客户端代码绑定的UDP端口”udpPort“跟服务器端接收到的不一样,为了避免了使用UDP通信时,android客户端接收不到server发送的数据的问题,server端根据接收到的数据得出发送数据包的客户端的ip地址和端口,不需要进行端口的转发,真机和模拟器一样。代码:

 

String clientIp =  (packet.getAddress().toString().split("/")[1]);
					for(Client c:clients) {
						
						if(clientIp.trim().equals(c.IP) && c.udpPort == 0) {
							c.setUdpPort(packet.getPort());
						}
					}
分享到:
评论

相关推荐

    Android中实现TCP和UDP传输实例

    主要介绍了Android中实现TCP和UDP传输实例,本文给出了TCP服务器端代码、TCP客户端代码、UDP服务器端代码、UDP客户端代码等代码实例,需要的朋友可以参考下

    Android中实现TCP和UDP传输的方法

    TCP和UDP在网络传输中非常重要,在Android开发中同样重要。

    tcp/udp的测试工具

    主要是用于TCP和UDP测试传输数据是否正常,最近在用android编写UDP传输,向大家分享下这个工具,很实用.

    提高UDP传输效率的实例

    大家都知道UDP相对于TCP速度要快,但是UDP很容易丢包,这个实例就会很好的解决UDP丢包的弊病,但是并不是100%解决丢包,只是减少了丢包的概率,希望对大家有用

    详解Android 基于TCP和UDP协议的Socket通信

    本来想讲一下基础的网络...而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。而UDP则是提供无连接的数据报

    Android实现局域网视频聊天功能(不用框架)

    通过tcp进行连接控制,通过udp进行数据传输,能聊天,发语音,发图片。后续可开发更多功能。

    在 rtmp 和 rtsp for Android 中流式传输的库 Java

    RTSP TCP/UDP。 从 mp4、webm、mp3 等视频和音频文件流式传输(受设备解码器限制)。更多信息 流设备显示 (API 21+)。 将图像、Gif 或文本设置为实时流式传输。 OpenGL 实时过滤器。更多信息 RTMPS 和 RTSPS。 RTSP ...

    Android网络编程之UDP通信模型实例

    在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层-传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的...

    Android项目源码本站第二款仿茄子快传的文件传输应用.zip

    本项目是一个仿茄子快传的一款文件传输应用, 涉及到Socket通信,包括TCP,UDP通信。 快传有两种方式可以传输文件: Android应用端发送到Android应用端(必须安装应用) 通过Web浏览器来实现文件的传送 (不必安装...

    UsbToUdpTcpClient.zip

    通过USB将读到的H264视频流解析成解码器需要显示的完整帧,再封装成标准的RTP打包格式,采用本地127.0.0.1回环地址,通过TCP/UDP通信,将数据流发送到QGroundControl进行视频解码显示,测试已经兼容Android 7.0以上...

    Android RTSP播放器源码

    本源码是一个RTSP播放器源码。目前只能播放标准的rtsp+H.264、 rtp支持tcp和udp传输,但是udp方式模拟器接收不到流,真机可以,模拟器可采用tcp方式,传输协议填554就是tcp,默认0为udp。

    附近:适用于Android的P2P库,可使用UDP在本地网络上进行发现,并通常使用TCP套接字进行传输

    近P2P库附近与Android NSD一样的发现,但具有更高的可靠性和更易于使用的NearDiscovery API 通过易于使用的NearConnect API在客户端之间进行转移样品用量 示例应用程序,与源代码是。即将发现NearDiscovery在构建器...

    socket的粘包处理

    TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务。在...

    Android-UDP3.11-master.rar

    支持文件浏览,支持连续上传,支持蒋勇直播的手机端给盒子端传源支持udp和tcp,支持蒋勇骆驼直播的传源,盒子是服务端,手机是客户端,又可以手机与手机的传输

    Android开发之Socket通信传输简单示例

    Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类)。要实现Socket的传输,需要构建客户端和服务器端。另外,传输的数据可以是字符串和字节。字符串传输主要用于简单的应用,比较复杂的...

    android网络性能测试方法及工具

    Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。测试过程...

    基于Android的模仿ftp的demo

    文件传输软件PC端,实现类似FTP的功能,支持中文文件名,可与Android客户端连接,实现目录查询,文件的上传和下载功能。 PC机远程控制手机端,通过TCP或UDP连接PC服务端,可查询PC端的目录,并将传回的文件、目录等...

    Android-一个用于Android的P2P库

    一个用于Android的P2P库,使用UDP在本地网络上进行发现,一般使用TCP套接字传输

    基于Android的无线节点式地震仪监控系统设计.pdf

    系统采用wifi无线通信技术,基于tcp或udp 协议实现Android移动设备与分布式采集节点的通讯,完成对采集节点的采集控制、实时数据传输、状态监测;通过引入第三方图标库实现采集数据的多种可视化显示;采用sqlite...

Global site tag (gtag.js) - Google Analytics