ClientA.java
Server.java
Android网络编程几大方法
HttpURLConnection、HttpClient都是使用HTTP协议,是B/S模式。Socket是C/S模型
HttpURLConnection方法
这是JAVA本身提供的。
首先需要明确,Http通信中POST和GET请求方式的不同。
GET可以获得静态页面(即不需要传递参数的页面),也可以吧参数放在URL字符串之后,
POST参数只能放在HTTP请求。
创建链接方法:
对请求的属性进行一些设置:
在Manifest文件中,设置网络访问权限:
HttpURLConection默认使用的是GET方式。
Get方法使用如下:
//打开连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//得到读取的内容(流)
InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
// 为输出创建BufferedReader
BufferedReader buffer = new BufferedReader(in);
String inputLine = null;
//使用循环来读取获得的数据
while (((inputLine = buffer.readLine()) != null))
{
//我们在每一行后面加上一个”\n”来换行
resultData += inputLine + “\n”;
}
//关闭InputStreamReader
in.close();
//关闭http连接
urlConn.disconnect();
POST方法使用如下:
概括为:
openConnection()建立连接,
set*设置参数,
发送请求getOutputStream.wrteBytes(String)发送请求,
获取请求结果getInputStream.readBytes()
// 使用HttpURLConnection打开连接
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//设置参数,因为这个是post请求,设立需要设置为true
urlConn.setDoOutput(true);
urlConn.setDoInput(true);
// 设置以POST方式
urlConn.setRequestMethod(“POST”);
// Post 请求不能使用缓存
urlConn.setUseCaches(false);
urlConn.setInstanceFollowRedirects(true);
// 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 urlConn.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded”);
// 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,
// 要注意的是connection.getOutputStream会隐含的进行connect。
urlConn.connect();
//DataOutputStream流
DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
//要上传的参数
String content = “par=” + URLEncoder.encode(“ABCDEFG”, “gb2312”);
//将要上传的内容写入流中
out.writeBytes(content);
//刷新、关闭
out.flush();
out.close();
//获取数据
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
HttpClient
是Apache的一个开源子项目,对JAVA网络操作相关的方法进行了封装,使网络操作更加简单。
GET方法(HttpClient.execute(HttpGet))
String httpUrl = “http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get“;
//HttpGet连接对象
HttpGet httpRequest = new HttpGet(httpUrl);
try
{
//取得HttpClient对象
HttpClient httpclient = new DefaultHttpClient();
//请求HttpClient,取得HttpResponse
HttpResponse httpResponse = httpclient.execute(httpRequest);
//请求成功
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
{
//取得返回的字符串
String strResult = EntityUtils.toString(httpResponse.getEntity());
mTextView.setText(strResult);
}
POST方法
使用NameValuePair保存参数,还需要设置字符集。
//新建一个HttpPost
new HttpPost(url);
//准备好参数
List
//设置字符集
HttpEntity = new UrlEncodeFormEntity(List
//加入httpPost中
HttpPost.setEntity(HttpEntity)
//发送HttpPost请求。
HttpClient.execute(HttpPost);
Socket
Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
//服务端
public class SocketServer {
// 服务端口类引用
private static ServerSocket mServer;
private static boolean flag = true;
public static void main(String[] args) {
try {
// 创建服务端及端口
mServer = new ServerSocket(8888);
System.out.println(“正在监听8888端口….”);
while(flag) {
// 创建Socket对象 监听服务端端口的访问
Socket socket = mServer.accept();
// 双向流创建
DataInputStream dis=new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
System.out.println(“客户端信息:”+ dis.readUTF());// 读取客户端请求
dos.writeUTF(“成功连接到服务器!”);
dis.close();// 关闭输入输出流及端口
dos.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端
private void connectToServer() {
String serverIP = “192.168.1.6”;// 本机的IP设定
try {
Socket socket = new Socket(serverIP,8888);// 创建Socket套接字 并发出连接请求
DataInputStream dis = new DataInputStream(socket.getInputStream());// 双向流创建
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
String strInput = connectEdt.getText().toString();// 获取发送到服务端的信息
dos.writeUTF(strInput);// 写信息到输出流
connectText.setText(dis.readUTF()); // 从输入流中获得信息
dis.close();
dos.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}