- 浏览: 434811 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
qja:
Iterator.remove()这个方法也会出错的。
java.util.ConcurrentModificationException 出现的原因和解决办法 -
angeli:
List<String> save = new A ...
java.util.ConcurrentModificationException 出现的原因和解决办法 -
大峰子:
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
python学习笔记-Python交互模式下方向键出现乱码 -
anypwx:
牛哥,怎么找到的,解决了我的报错问题,谢谢
JSONObject NestableRuntimeException -
tp7300:
确实好很多了,谢谢博主。
Failed to install on device 'emulator-5554': timeout
关于TCP和UDP协议的描述,可参考http://zhoujianghai.iteye.com/blog/1052970
下面是android与PC端使用TCP和UDP协议通信的例子:
以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()); } }
发表评论
-
warning: libfmodex64.so, needed by ../../lib/linux/Debug/libcocosdenshion.so,
2012-03-13 01:20 1990linux环境下用cocos2d-x开发游戏时,遇到了 wa ... -
在工作线程中创建Toast
2011-10-14 18:11 3704在工作线程中创建Toast,代码如下: p ... -
GridView + ViewFlipper布局界面,模仿“机锋市场”
2011-10-09 18:22 2246源码在附件中,效果如图片 -
fedora14下连接android真机
2011-08-13 13:22 1364在fedora14下搭建好了andro ... -
fedora14下搭建Android开发环境
2011-07-12 23:59 2540一:下载linux版本的JDK,Eclipse,Andr ... -
简述android线程间消息处理机制(Looper、Handler和Message)
2011-06-17 21:51 7662作用:Android的线程间消息处理机制主要是用来处理主 ... -
Android中ImageButton实现“按下”效果
2011-06-16 12:26 7613使用Button的时候,实现“按下”的效果是很重要的,也 ... -
android textview改变部分文字的颜色和string.xml中文字的替换
2011-05-18 18:49 17261一:TextView组件改变部分文字的颜色: Text ... -
AndroiManifest.xml文件中android属性
2011-05-16 11:59 1419android:allowTaskReparentin ... -
windows系统上安装与使用Android NDK r5
2011-01-26 13:17 11326windows系统上安装与使用Android NDK r ... -
android获取屏幕分辨率
2011-01-15 17:05 2104获取屏幕分辨率的代码: ... -
Android编译出现Multiple substitutions specified in non-positional format
2010-12-31 13:28 3851前段时间更新了ADT和Android SDK 2.3, ... -
TextView设置中文粗体
2010-12-30 13:25 5485在xml布局文件中设置android:textStyle=“b ... -
Failed to install on device 'emulator-5554': timeout
2010-12-20 10:41 6171Failed to install on device ... -
解决android logcat不打印信息
2010-11-30 19:06 7890用eclipse进行android开发中经常遇到logcat无 ... -
关于android设备的分辨率
2010-11-29 12:27 1964HVGA (Half-size VGA) 即VGA ... -
Toast的用法
2010-11-18 13:28 4588Toast是android中用来显示快速显示短信息的一种机制, ... -
listview的美化和优化
2010-11-17 13:54 4310在android开发中,listview是比较常用的一个组件, ... -
activity切换特效(类似iphone的进入和退出时的效果)
2010-11-10 23:11 3880关于activity的切换,有很多挺好看的动画实现,最近在项目 ... -
美化listview时遇到的问题
2010-11-08 08:39 2521在android开发中,listview的默认背景颜 ...
相关推荐
主要介绍了Android中实现TCP和UDP传输实例,本文给出了TCP服务器端代码、TCP客户端代码、UDP服务器端代码、UDP客户端代码等代码实例,需要的朋友可以参考下
TCP和UDP在网络传输中非常重要,在Android开发中同样重要。
主要是用于TCP和UDP测试传输数据是否正常,最近在用android编写UDP传输,向大家分享下这个工具,很实用.
大家都知道UDP相对于TCP速度要快,但是UDP很容易丢包,这个实例就会很好的解决UDP丢包的弊病,但是并不是100%解决丢包,只是减少了丢包的概率,希望对大家有用
本来想讲一下基础的网络...而Socket通信中基于TCP/IP协议的通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。而UDP则是提供无连接的数据报
通过tcp进行连接控制,通过udp进行数据传输,能聊天,发语音,发图片。后续可开发更多功能。
RTSP TCP/UDP。 从 mp4、webm、mp3 等视频和音频文件流式传输(受设备解码器限制)。更多信息 流设备显示 (API 21+)。 将图像、Gif 或文本设置为实时流式传输。 OpenGL 实时过滤器。更多信息 RTMPS 和 RTSPS。 RTSP ...
在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层-传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的...
本项目是一个仿茄子快传的一款文件传输应用, 涉及到Socket通信,包括TCP,UDP通信。 快传有两种方式可以传输文件: Android应用端发送到Android应用端(必须安装应用) 通过Web浏览器来实现文件的传送 (不必安装...
通过USB将读到的H264视频流解析成解码器需要显示的完整帧,再封装成标准的RTP打包格式,采用本地127.0.0.1回环地址,通过TCP/UDP通信,将数据流发送到QGroundControl进行视频解码显示,测试已经兼容Android 7.0以上...
本源码是一个RTSP播放器源码。目前只能播放标准的rtsp+H.264、 rtp支持tcp和udp传输,但是udp方式模拟器接收不到流,真机可以,模拟器可采用tcp方式,传输协议填554就是tcp,默认0为udp。
近P2P库附近与Android NSD一样的发现,但具有更高的可靠性和更易于使用的NearDiscovery API 通过易于使用的NearConnect API在客户端之间进行转移样品用量 示例应用程序,与源代码是。即将发现NearDiscovery在构建器...
TCP/IP传输层有两个并列的协议:TCP和UDP。其中TCP(transport control protocol,传输控制协议)是面向连接的,提供高可靠性服务。UDP(user datagram protocol,用户数据报协议)是无连接的,提供高效率服务。在...
支持文件浏览,支持连续上传,支持蒋勇直播的手机端给盒子端传源支持udp和tcp,支持蒋勇骆驼直播的传源,盒子是服务端,手机是客户端,又可以手机与手机的传输
Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类)。要实现Socket的传输,需要构建客户端和服务器端。另外,传输的数据可以是字符串和字节。字符串传输主要用于简单的应用,比较复杂的...
Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输。Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。测试过程...
文件传输软件PC端,实现类似FTP的功能,支持中文文件名,可与Android客户端连接,实现目录查询,文件的上传和下载功能。 PC机远程控制手机端,通过TCP或UDP连接PC服务端,可查询PC端的目录,并将传回的文件、目录等...
一个用于Android的P2P库,使用UDP在本地网络上进行发现,一般使用TCP套接字传输
系统采用wifi无线通信技术,基于tcp或udp 协议实现Android移动设备与分布式采集节点的通讯,完成对采集节点的采集控制、实时数据传输、状态监测;通过引入第三方图标库实现采集数据的多种可视化显示;采用sqlite...