安卓实验14.docx
- 文档编号:30654060
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:22
- 大小:109.85KB
安卓实验14.docx
《安卓实验14.docx》由会员分享,可在线阅读,更多相关《安卓实验14.docx(22页珍藏版)》请在冰豆网上搜索。
安卓实验14
实验14Android的网络应用
一、实验目的
1、使用ServerSocket、Socket进行通信,尤其是加入多线程进行通信的方式。
2、使用URL、HTTP,WebView访问指定的网络资源。
3、Android网络应用,都必须在配置文件中配置相应的权限
二、实验步骤
1、一个简单的C/S聊天室的应用,采用了多线程进行通信,给出实验运行结果。
服务器端程序(普通的JAVA项目):
MyServer.java程序如下,请补充所缺的代码。
import.*;
importjava.io.*;
importjava.util.*;
publicclassMyServer{
//定义保存所有Socket的ArrayList
publicstaticArrayList
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketss=newServerSocket(40000);
while(true){
//此行代码会阻塞,将一直等待别人的连接
Sockets=ss.;
socketList.;
//每当客户端连接后启动一条ServerThread线程为该客户端服务
newThread(newServerThread(s)).start();
}
}
}
服务器端多线程程序ServerThread.java代码如下,请进行分析实现过程
importjava.io.*;
import.*;
//负责处理每个线程通信的线程类
publicclassServerThreadimplementsRunnable{
//定义当前线程所处理的Socket
Sockets=null;
//该线程所处理的Socket所对应的输入流
BufferedReaderbr=null;
publicServerThread(Sockets)throwsIOException{
this.s=s;
//初始化该Socket对应的输入流
br=newBufferedReader(newInputStreamReader(s.getInputStream(),"utf-8"));
}
publicvoidrun(){
try{
Stringcontent=null;
//采用循环不断从Socket中读取客户端发送过来的数据
while((content=readFromClient())!
=null){
//遍历socketList中的每个Socket,
//将读到的内容向每个Socket发送一次
for(Sockets:
MyServer.socketList){
OutputStreamos=s.getOutputStream();
os.write((content+"\n").getBytes("utf-8"));
}
}
}catch(IOExceptione){
e.printStackTrace();
}
}
//定义读取客户端数据的方法
privateStringreadFromClient(){
try{
returnbr.readLine();
}
//如果捕捉到异常,表明该Socket对应的客户端已经关闭
catch(IOExceptione){
//删除该Socket。
MyServer.socketList.remove(s);//①
}
returnnull;
}
}
客户端程序(Android项目):
MultiThreadClient.java代码如下,请补充所缺代码。
importjava.io.OutputStream;
import.Socket;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
publicclassMultiThreadClientextendsActivity{
//定义界面上的两个文本框
EditTextinput,show;
//定义界面上的一个按钮
Buttonsend;
OutputStreamos;
Handlerhandler;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input=(EditText)findViewById(R.id.input);
send=(Button)findViewById(R.id.send);
show=(EditText)findViewById(R.id.show);
Sockets;
handler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
//如果消息来自于子线程
if(msg.what==0x123){
//将读取的内容追加显示在文本框中
show.append("\n"+msg.obj.toString());
}
}
};
try{
s=newSocket("",40000);
//客户端启动ClientThread线程不断读取来自服务器的数据
newThread(newClientThread(s,handler)).;//①
os=s.getOutputStream();
}catch(Exceptione){
e.printStackTrace();
}
send.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
try{
//将用户在文本框内输入的内容写入网络
os.write((input.getText().toString()+"\r\n")
.getBytes("utf-8"));
//清空input文本框
input.setText("");
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
}
客户端线程ClientThread.java程序,请分析其实现的过程。
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.Socket;
importandroid.os.Handler;
importandroid.os.Message;
publicclassClientThreadimplementsRunnable{
//该线程负责处理的Socket
privateSockets;
privateHandlerhandler;
//该线程所处理的Socket所对应的输入流
BufferedReaderbr=null;
publicClientThread(Sockets,Handlerhandler)throwsIOException{
this.s=s;
this.handler=handler;
br=newBufferedReader(
newInputStreamReader(s.getInputStream()));
}
publicvoidrun(){
try{
Stringcontent=null;
//不断读取Socket输入流中的内容。
while((content=br.readLine())!
=null){
//每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
Messagemsg=newMessage();
msg.what=0x123;
msg.obj=content;
handler.sendMessage(msg);
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
2、通过HttpClient来访问受保护的资源,给出实验运行结果。
在本实验文件夹中的Foo目录下,有两个JSP文件。
在myeclipse中,创建一个webProject,将这两个文件部署到服务器上(如Tomcat)。
HttpClientTest.java程序如下所示,请补充程序所缺代码:
importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.NameValuePair;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.entity.UrlEncodedFormEntity;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpPost;
importorg.apache.http.impl.client.DefaultHttpClient;
importorg.apache.http.message.BasicNameValuePair;
importorg.apache.http.protocol.HTTP;
importorg.apache.http.util.EntityUtils;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.content.DialogInterface;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassHttpClientTestextendsActivity{
Buttonget;
Buttonlogin;
EditTextresponse;
HttpClienthttpClient;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//创建DefaultHttpClient对象
httpClient=newDefaultHttpClient();
get=(Button)findViewById(R.id.get);
login=(Button)findViewById(R.id.login);
response=(EditText)findViewById(R.id.response);
get.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
//创建一个HttpGet对象
//改成你们自己所部署的JSP文件的路径
HttpGetget=newHttpGet("http:
//172.16.28.220:
8080/foo/secret.jsp");
try{
//发送GET请求
HttpResponsehttpResponse=httpClient.execute(get);
HttpEntityentity=httpResponse.getEntity();
if(entity!
=null){
//读取服务器响应
BufferedReaderbr=newBufferedReader(
newInputStreamReader(entity.getContent()));
Stringline=null;
response.setText("");
while((line=br.readLine())!
=null){
//使用response文本框显示服务器响应
response.append(line+"\n");
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
});
login.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
finalViewloginDialog=getLayoutInflater().inflate(
R.layout.login,null);
newAlertDialog.Builder(HttpClientTest.this)
.setTitle("登录系统")
.setView(loginDialog)
.setPositiveButton("登录",
newDialogInterface.OnClickListener(){
@Override
publicvoidonClick(DialogInterfacedialog,
intwhich){
Stringname=((EditText)loginDialog
.findViewById(R.id.name))
.getText().toString();
Stringpass=((EditText)loginDialog
.findViewById(R.id.pass))
.getText().toString();
//改成你们自己所部署的JSP文件的路径
HttpPostpost=newHttpPost("http:
//172.16.28.220:
8080/foo/login.jsp");
//如果传递参数个数比较多的话可以对传递的参数进行封装
List
params.add(newBasicNameValuePair(
"name",name));
params.add(newBasicNameValuePair(
"pass",pass));
try{//设置请求参数
post.setEntity(newUrlEncodedFormEntity(
params,HTTP.UTF_8));
//发送POST请求
HttpResponseresponse=httpClient
.execute(post);
//如果服务器成功地返回响应
if(response.getStatusLine()
.getStatusCode()==200){
Stringmsg=EntityUtils.toString(response.getEntity());
//提示登录成功
Toast.makeText(
HttpClientTest.this,
msg,5000).show();
}
}catch(Exceptione){
e.printStackTrace();
}
}
}).setNegativeButton("取消",null).show();
}
});
}
}
main.xml文件代码:
xmlversion="1.0"encoding="utf-8"?
>
android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > android: orientation="horizontal" android: layout_width="fill_parent" android: layout_height="wrap_content" android: gravity="center_horizontal" > android: id="@+id/response" android: layout_width="fill_parent" android: layout_height="fill_parent" android: gravity="top" android: editable="false" android: cursorVisible="false" /> login.xml代码如下: xmlversion="1.0"encoding="utf-8"? > android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > android: orientation="horizontal" android: layout_width="fill_parent" android: layout_height="wrap_content" > android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="@string/name" /> android: id="@+id/name" android: layout_width="fill_parent" android: layout_height="wrap_content" /> android: orientation=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 14