Android网络编程基础
Android网络编程只TCP通信
TCP 服务器端工作的主要步骤如下。
步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上。
步骤2 调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
步骤3 调用Socket 类的getOutputStream() 和getInputStream() 获取输出和输入流,开始网络数据的发送和接收。
步骤4 关闭通信套接字。
服务器端:
package com.jiao.socketdemo; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket; public class Main {
public static int TCP_SERVER_PORT = 5556; // 声明一个socket来接受客户端连接 public static void main(String[] args) { start();
} private static void start() {
ServerSocket serverSocket = null;
try {
// TCP_SERVER_PORT 为指定的绑定端口,为int 类型
serverSocket = new ServerSocket(TCP_SERVER_PORT);
// 监听连接请求
Socket socket = serverSocket.accept();
// 写入读Buffer 中 // 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream())); // 放到写Buffer 中 // 获取输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream())); // 读取接收信息,转换为字符串
String incomingMsg = in.readLine()
+ System.getProperty("line.separator"); System.out.println("接受到的信息:" + incomingMsg);
// 生成发送字符串
String outgoingMsg = "goodbye from port " + TCP_SERVER_PORT
+ System.getProperty("line.separator");
// 将发送字符串写入上面定义的BufferedWriter 中
out.write(outgoingMsg); System.out.println("发送出去的信息" + outgoingMsg);
// 刷新,发送
out.flush();
// 关闭
socket.close();
} catch (InterruptedIOException e) {
// 超时错误
e.printStackTrace();
// IO 异常
} catch (IOException e) {
// 打印错误
e.printStackTrace();
} finally {
// 判定是否初始化ServerSocket 对象,如果初始化则关闭serverSocket
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} } }
客户端:
package com.example.socketclient; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity {
public static int TCP_SERVER_PORT = 5556; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); new Thread() {
public void run() {
actStart();
};
}.start();
} private void actStart() {
try {
// 初始化Socket,TCP_SERVER_PORT 为指定的端口,int 类型r
Socket socket = new Socket("这里为服务器的ip", TCP_SERVER_PORT);
// 获取输入流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 生成输出流
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 生成输出内容
String outMsg = "Jiao_Test" + TCP_SERVER_PORT+ System.getProperty("line.separator");
// 写入
out.write(outMsg);
// 刷新,发送
out.flush();
// 获取输入流
String inMsg = in.readLine() + System.getProperty("line.separator");
// Log.i("TcpClient", "received: " + inMsg);
System.out.println("接收服务器返回:"+inMsg);
// 关闭连接
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
二:UDP传输方式
步骤1 调用DatagramSocket(int port) 创建一个数据报套接字,并绑定到指定端口上。
步骤2 调用DatagramPacket(byte[]buf,int length),建立一个字节数组以接收UDP 包。
步骤3 调用DatagramSocket 类的receive(),接受UDP 包。
步骤4 关闭数据报套接字。
服务端代码
package com.example.socketudp; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException; import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity {
private final static int MAX_UDP_DATAGRAM_LEN = 1024;
private final static int UDP_SERVER_PORT = 5556; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); new Thread() {
public void run() {
actStart();
}
}.start();
} private void actStart() {
// 接收的字节大小,客户端发送的数据不能超过MAX_UDP_DATAGRAM_LEN
byte[] lMsg = new byte[MAX_UDP_DATAGRAM_LEN];
// 实例化一个DatagramPacket 类
DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
// 新建一个DatagramSocket 类
DatagramSocket ds = null;
try {
// UDP 服务器监听的端口
ds = new DatagramSocket(UDP_SERVER_PORT);
// 准备接收数据
ds.receive(dp);
} catch (SocketException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace();
} finally {
// 如果ds 对象不为空,则关闭ds 对象
if (ds != null) {
ds.close();
} }
}
}
客户端代码:
package com.example.socketclient; import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity {
public static int UDP_SERVER_PORT = 5556; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); new Thread() {
public void run() {
actStart();
};
}.start();
} private void actStart() {
// 定义需要发送的信息
String udpMsg = "jiao udp test" + UDP_SERVER_PORT;
// 新建一个DatagramSocket 对象
DatagramSocket ds = null;
try {
// 初始化DatagramSocket 对象
ds = new DatagramSocket();
// 初始化InetAddress 对象
InetAddress serverAddr = InetAddress.getByName("服务器的ip");
DatagramPacket dp;
// 初始化DatagramPacket 对象
dp = new DatagramPacket(udpMsg.getBytes(), udpMsg.length(),serverAddr, UDP_SERVER_PORT);
// 发送
ds.send(dp);
}
// 异常处理
// Socket 连接异常
catch (SocketException e) {
e.printStackTrace();
// 不能连接到主机
} catch (UnknownHostException e) {
e.printStackTrace();
// 数据流异常
} catch (IOException e) {
e.printStackTrace();
// 其他异常
} catch (Exception e) {
e.printStackTrace();
} finally {
// 如果DatagramSocket 已经实例化,则需要将其关闭
if (ds != null) {
ds.close();
}
}
}
}
Android网络编程基础的更多相关文章
- Android 网络编程基础之简单聊天程序
前一篇讲了Android的网络编程基础,今天写了一个简单的聊天程序分享一下 首先是服务端代码: package com.jiao.socketdemo; import java.io.Buffered ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- C#网络编程基础知识
C#网络编程基础知识一 1.IPAddress类 用于表示一个IP地址.IPAddress默认构造函数 public IPAddress(long address);一般不用 其中Parse()方法最 ...
随机推荐
- 二叉平衡查找树AvlTree(C实现)
二叉平衡查找树即是一棵树中所有节点的左右子树高度差不超过1的查找树 头文件—————————————————————————————— #ifndef _AVLTREE_H_ #define _AVL ...
- http协议客户端向服务器端请求时一般需要发送的内容
out.println("GET /shopping/index.html HTTP/1.1");//请求行 包括请求方式,文件路径, http协议版本(必写)请求头.... ou ...
- AEM - Adobe CMS 扒坑记之始
AEM是Adobe公司所出的商业内容管理系统,全称阿豆比体验管理系统(Adobe Experience Manager),其前身叫CQ,分别有CQ5 CQ6两个大版本.它提供了整套的网站内容管理系统解 ...
- 基于Redis的BloomFilter算法去重
BloomFilter算法及其适用场景 BloomFilter是利用类似位图或者位集合数据结构来存储数据,利用位数组来简洁的表示一个集合,并且能够快速的判断一个元素是不是已经存在于这个集合.因为基于H ...
- Java 常用字符串操作总结
1. String转ASCII码 public static String stringToAscii(String value) { StringBuffer sbu = new StringBuf ...
- 资料下载:敏捷个人的成长思考.pptx(第1次线下活动2011.04)
本文挪至 http://www.zhoujingen.cn/blog/629.html PDF下载地址:http://down.51cto.com/data/207112 推荐:你可能需要的在线电子书 ...
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- HT图形组件设计之道(三)
上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更多的矢量应用场景,本篇我们先切换个话题, ...
- R语言简单实现聚类分析计算与分析(基于系统聚类法)
聚类分析计算与分析(基于系统聚类法) 下面以一个具体的例子来实现实证分析.2008年我国其中31个省.市和自治区的农村居民家庭平均每人全年消费性支出. 根据原始数据对我国省份进行归类统计. 原始数据如 ...
- AC自动机 - 多模式串的匹配运用 --- HDU 2896
病毒侵袭 Problem's Link:http://acm.hdu.edu.cn/showproblem.php?pid=2896 Mean: 略 analyse: AC自动机的运用,多模式串匹配. ...