`
zhoujianghai
  • 浏览: 439773 次
  • 性别: 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(用户数据报协议)是两种最常用的协议。本文将深入探讨这两种协议在Android环境下的应用,并基于提供的文件名,介绍相关的源码示例和通信工具。 首先,...

    Android TCP/UDP Demo

    总的来说,理解并掌握Android环境下的TCP和UDP通信是移动开发中的重要技能,这有助于实现各种网络功能,如即时通讯、文件传输等。通过`TCPUtil`这样的工具类,开发者可以更方便地进行网络编程,提高代码的复用性和可...

    android屏幕分享助手源码(udp传输)

    本项目"android屏幕分享助手源码(udp传输)"提供了这样一个解决方案,它专为Android 5.0及以上版本的设备设计,允许在同一局域网内的其他设备上实时共享屏幕内容。下面将详细介绍其核心技术点和工作原理。 1. **...

    Android Tcp&Udp; demo

    实现TCP和UDP通信时,Android开发者需要关注权限问题。由于网络访问涉及用户隐私,Android系统要求在`AndroidManifest.xml`文件中声明`INTERNET`权限: ```xml &lt;uses-permission android:name="android.permission....

    Android与服务器通信(TCP&UDP

    本教程将详细探讨Android应用如何使用TCP和UDP这两种常用网络传输协议与服务器进行通信。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输协议。在Android中,我们通常使用Socket类来实现...

    Android中实现TCP和UDP传输实例

    在Android中,实现TCP和UDP通信的基本步骤与Java标准库中的方法相同。开发者需要创建相应的套接字对象,如`ServerSocket`或`DatagramSocket`,并使用输入输出流进行数据的读写。对于TCP,使用`Socket`类进行连接,而...

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

    总结来说,在Android开发中,TCP和UDP是两种基本的网络传输协议。TCP适合对数据传输可靠性要求很高的场景,而UDP适用于对传输性能要求更高的场合。根据实际应用需求选择合适的协议,是开发高质量网络应用的关键。

    基于QT实现TCP,UDP测试工具

    UDP(User Datagram Protocol)是另一种传输层协议,与TCP相比,UDP是无连接的、不可靠的。它不保证数据的顺序、完整性或到达,而是以尽可能快的速度发送数据,适合实时性要求高的应用,如视频会议、在线游戏等。 ...

    Android programming TCP,UDP document

    在Android平台上进行网络通信开发时,TCP(传输控制协议)和UDP(用户数据报协议)是两种常用的数据传输协议。TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP则是一种无连接的、不可靠的、基于...

    android基于局域网的UDP传输

    在Android平台上进行基于局域网的UDP(User ...总之,基于局域网的Android UDP传输涉及了网络编程基础、Android权限管理和特定API的使用。通过掌握这些知识点,开发者可以构建出能够在设备之间进行快速数据交换的应用。

    android UDP/TCP混用

    在Android平台上进行网络编程时,有时会遇到需要同时使用UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)的情况。这两种协议各有特点,UDP是无连接的、不可靠的数据传输协议,而TCP则是一种...

    android串口、TCP,UDP socket编程实现

    串口通信主要涉及设备间的本地连接,而TCP和UDP则是网络通信的基础协议,用于实现设备间的远程通信。以下将详细介绍这些知识点。 首先,**Android串口通信** 是指Android设备通过串行接口与其他硬件设备(如传感器...

    非常好用的tcp/udp有人网络调试助手apk,android安卓应用

    标题中的“非常好用的tcp/udp有人网络调试助手apk,android安卓应用”表明这是一个专为Android设备设计的应用程序,主要用于TCP和UDP网络协议的调试。这类工具在开发、测试或维护网络应用程序时非常有用,可以帮助...

    TCP_UDP 测试Demo Android 手机以及window

    在TCPUDP_Demo中,你可能会看到以下关键代码片段: 1. TCP客户端: - 创建QTcpSocket对象并连接到服务器的IP和端口。 - 实现readyRead()信号处理函数,读取接收到的数据。 - 使用write()函数发送数据。 2. TCP...

    Android应用源码http、udp、tcp网络交互组件

    在Android应用开发中,网络交互是至关重要的组成部分,它使得应用程序能够与远程服务器进行数据交换,从而实现各种功能,如获取在线数据、上传用户信息、实时通信等。本项目"Android应用源码http、udp、tcp网络交互...

    Android tcp-udp socket.zip

    在Android开发中,TCP和UDP Socket是两种常用的网络通信协议,它们允许设备间进行数据传输。这个`Android tcp-udp socket.zip`文件包含了实现这两种协议的客户端和服务器端的示例代码,帮助开发者理解如何在Android...

    TCP/UDP Socket调试工具

    - **协议验证**:开发者可以验证自己的应用程序是否正确地实现了TCP或UDP协议。 - **性能测试**:通过模拟大量并发连接,评估网络应用在高负载下的表现。 - **安全分析**:监控数据流,检查是否有潜在的安全风险,如...

    android UDP和TCP的封装

    本篇将详细介绍Android中如何封装和使用TCP与UDP,以及它们的区别。 首先,TCP是一种面向连接的、可靠的传输协议,它保证了数据包的顺序和完整性。在发送数据前,TCP需要建立连接,通过三次握手确保双方的通信能力...

    基于同一个局域网TCP和UDP数据传输

    本项目"基于同一个局域网TCP和UDP数据传输"是用Java编程语言实现的,旨在探讨如何在相同局域网环境下通过TCP(传输控制协议)和UDP(用户数据报协议)进行数据的发送与接收。 TCP是一种面向连接的、可靠的传输协议...

Global site tag (gtag.js) - Google Analytics