Android UDP通信 转自http://blog.csdn.net/wensefu/article/details/6089256
2012-08-03 12:48
274 查看
什么是UDP?
UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规范。在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
TCP和UDP在android中的使用和在Java里是完全一样的。
服务端:
[java] view plaincopyprint?
package com.cheerchip.core;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import android.util.Log;
/**
* @author jerry.lingchao.wensefu
* date: 2010-12-21
* android网络编程 UDP服务器类
*/
public class UDPServer implements Runnable {
private static final int PORT = 6000;
private byte[] msg = new byte[1024];
private boolean life = true;
public UDPServer() {
}
/**
* @return the life
*/
public boolean isLife() {
return life;
}
/**
* @param life
* the life to set
*/
public void setLife(boolean life) {
this.life = life;
}
@Override
public void run() {
DatagramSocket dSocket = null;
DatagramPacket dPacket = new DatagramPacket(msg, msg.length);
try {
dSocket = new DatagramSocket(PORT);
while (life) {
try {
dSocket.receive(dPacket);
Log.i("msg sever received", new String(dPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
主Activity:
[java] view plaincopyprint?
public class MainAct extends Activity {
EditText msg_et=null;
Button send_bt=null;
TextView info_tv=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
msg_et=(EditText)findViewById(R.id.msg_et);
send_bt=(Button)findViewById(R.id.send_bt);
info_tv=(TextView)findViewById(R.id.info_tv);
//开启服务器
ExecutorService exec=Executors.newCachedThreadPool();
UDPServer server=new UDPServer();
exec.execute(server);
//发送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UDPClient client=new UDPClient(msg_et.getText().toString());
info_tv.setText(client.send());
}
});
}
}
public class MainAct extends Activity {
EditText msg_et=null;
Button send_bt=null;
TextView info_tv=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
msg_et=(EditText)findViewById(R.id.msg_et);
send_bt=(Button)findViewById(R.id.send_bt);
info_tv=(TextView)findViewById(R.id.info_tv);
//开启服务器
ExecutorService exec=Executors.newCachedThreadPool();
UDPServer server=new UDPServer();
exec.execute(server);
//发送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UDPClient client=new UDPClient(msg_et.getText().toString());
info_tv.setText(client.send());
}
});
}
}
注意在配置文件中要加上<uses-permission android:name="android.permission.INTERNET" />
以获取相应的权限
效果图:
LogCat打印出来的服务器端信息:
UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规范。在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。
UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
TCP和UDP在android中的使用和在Java里是完全一样的。
服务端:
[java] view plaincopyprint?
package com.cheerchip.core;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import android.util.Log;
/**
* @author jerry.lingchao.wensefu
* date: 2010-12-21
* android网络编程 UDP服务器类
*/
public class UDPServer implements Runnable {
private static final int PORT = 6000;
private byte[] msg = new byte[1024];
private boolean life = true;
public UDPServer() {
}
/**
* @return the life
*/
public boolean isLife() {
return life;
}
/**
* @param life
* the life to set
*/
public void setLife(boolean life) {
this.life = life;
}
@Override
public void run() {
DatagramSocket dSocket = null;
DatagramPacket dPacket = new DatagramPacket(msg, msg.length);
try {
dSocket = new DatagramSocket(PORT);
while (life) {
try {
dSocket.receive(dPacket);
Log.i("msg sever received", new String(dPacket.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
[java] view plaincopyprint? package com.cheerchip.core; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /** * @author jerry.lingchao.wensefu date: 2010-12-21 android网络编程 UDP客户端类 */ public class UDPClient { private static final int SERVER_PORT = 6000; private DatagramSocket dSocket = null; private String msg; /** * @param msg */ public UDPClient(String msg) { super(); this.msg = msg; } /** * 发送信息到服务器 */ public String send(){ StringBuilder sb=new StringBuilder(); InetAddress local = null; try { local = InetAddress.getByName("localhost"); // 本机测试 sb.append("已找到服务器,连接中...").append("/n"); } catch (UnknownHostException e) { sb.append("未找到服务器.").append("/n"); e.printStackTrace(); } try { dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常 sb.append("正在连接服务器...").append("/n"); } catch (SocketException e) { e.printStackTrace(); sb.append("服务器连接失败.").append("/n"); } int msg_len = msg == null ? 0 : msg.length(); DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len, local, SERVER_PORT); try { dSocket.send(dPacket); sb.append("消息发送成功!").append("/n"); } catch (IOException e) { e.printStackTrace(); sb.append("消息发送失败.").append("/n"); } dSocket.close(); return sb.toString(); } } package com.cheerchip.core; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; /** * @author jerry.lingchao.wensefu date: 2010-12-21 android网络编程 UDP客户端类 */ public class UDPClient { private static final int SERVER_PORT = 6000; private DatagramSocket dSocket = null; private String msg; /** * @param msg */ public UDPClient(String msg) { super(); this.msg = msg; } /** * 发送信息到服务器 */ public String send(){ StringBuilder sb=new StringBuilder(); InetAddress local = null; try { local = InetAddress.getByName("localhost"); // 本机测试 sb.append("已找到服务器,连接中...").append("/n"); } catch (UnknownHostException e) { sb.append("未找到服务器.").append("/n"); e.printStackTrace(); } try { dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常 sb.append("正在连接服务器...").append("/n"); } catch (SocketException e) { e.printStackTrace(); sb.append("服务器连接失败.").append("/n"); } int msg_len = msg == null ? 0 : msg.length(); DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len, local, SERVER_PORT); try { dSocket.send(dPacket); sb.append("消息发送成功!").append("/n"); } catch (IOException e) { e.printStackTrace(); sb.append("消息发送失败.").append("/n"); } dSocket.close(); return sb.toString(); } }
主Activity:
[java] view plaincopyprint?
public class MainAct extends Activity {
EditText msg_et=null;
Button send_bt=null;
TextView info_tv=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
msg_et=(EditText)findViewById(R.id.msg_et);
send_bt=(Button)findViewById(R.id.send_bt);
info_tv=(TextView)findViewById(R.id.info_tv);
//开启服务器
ExecutorService exec=Executors.newCachedThreadPool();
UDPServer server=new UDPServer();
exec.execute(server);
//发送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UDPClient client=new UDPClient(msg_et.getText().toString());
info_tv.setText(client.send());
}
});
}
}
public class MainAct extends Activity {
EditText msg_et=null;
Button send_bt=null;
TextView info_tv=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
msg_et=(EditText)findViewById(R.id.msg_et);
send_bt=(Button)findViewById(R.id.send_bt);
info_tv=(TextView)findViewById(R.id.info_tv);
//开启服务器
ExecutorService exec=Executors.newCachedThreadPool();
UDPServer server=new UDPServer();
exec.execute(server);
//发送消息
send_bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
UDPClient client=new UDPClient(msg_et.getText().toString());
info_tv.setText(client.send());
}
});
}
}
注意在配置文件中要加上<uses-permission android:name="android.permission.INTERNET" />
以获取相应的权限
效果图:
LogCat打印出来的服务器端信息:
相关文章推荐
- android 与C# UDP通信 DatagramSocket
- androidhttp网络通信
- android asp.net HttpURLConnection通信 中文乱码
- Android网络编程之Http通信
- Android网络通信(2):HTTP通信
- [Android]Http通信,HttpService服务端通过getEntity获取HttpClient客户端Post上来的数据
- 【Cocos2dx网络通信(Http&Socket)编译到Android总结】编译加入curl关联lib与头文件等问题
- Android中Socket通信之TCP与UDP传输原理
- android 网络编程--socket tcp/ip udp http之间的关系
- android http 连接通信
- Android之Http通信——3.Android HTTP请求方式:HttpURLConnection
- android http通信之httpclient
- 程序员必备基础知识:通信协议——Http、TCP、UDP
- Android网络编程之Http通信
- 通信协议之:Http,Socket,UDP
- Socket 通信原理(Android客户端和服务器以TCP UDP方式互通)
- Android基于Http网络通信
- Android中基于HTTP通信技术之有道翻译API使用
- android UDP通信
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1