您的位置:首页 > 移动开发

Android使用webView和ServerSocket模拟客户端和服务端通讯

2016-02-21 10:10 489 查看
功能介绍:

1、服务端:手机端新建线程,创建serverSocket监听8080端口;

2、客户端:使用webView的方法loadURl(“http://172.0.0.1:8080“)访问本地;

下载地址:http://download.csdn.net/detail/youngwm/9438042

一、在布局文件xml创建webView对象:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<EditText
android:id="@+id/edit_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hint_str"
android:layout_margin="10dp"/>
<EditText
android:id="@+id/edit_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/hint_str1"
android:layout_margin="10dp"/>
<Button
android:id="@+id/btn_change_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:layout_margin="10dp"
android:text="@string/btn_str"/>

<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

</LinearLayout>

public class MainActivity extends Activity {

Button mBtn ;
WebView mWebView ;
WebSettings mWebSetting ;
EditText server, appendUrl;

//    String url = "http://www.baidu.com/";
String url = "http://127.0.0.1:8080/";
String TAG = getClass().getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initActivity();
startServer();
}

/**
* 开启监听线程*/
private void startServer(){
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
socketServer();
}
});
thread.start();
}

private DataInputStream reader;
private DataOutputStream writer;
/**
* 创建socketServer监听webView的访问,并返回html页面*/
private void socketServer(){
try{
ServerSocket serverSocket = new ServerSocket(8080);
while(true){
Socket socket = serverSocket.accept();
reader=new DataInputStream(socket.getInputStream() );
if (reader.readLine() != null ){
writer=new DataOutputStream(socket.getOutputStream());

String html = "<!doctype html><html><head><meta charset=\"utf-8\"><title>" +
"错误页面</title><style>.htext{font-family:\"微软雅黑\"; " +
"text-align:center; margin-top:5em; line-height:1.5em;font-size:20px;" +
"}a.retry{font-family:\"微软雅黑\"; text-align:center; display:block; " +
"background:#00aaee; border:#3D6E96; border-radius:4px; height:1.7em; " +
"width:4em; line-height:1.7em; margin:0 auto; text-decoration:none; " +
"color:#FFF;}a.retry:hover,a.retry:active{background:#069dd9;" +
"font-size:24px;}</style></head><body><p class=\"htext\">" +
"请求失败,引起原因:</br>1、网络异常</br>2、信号中断</p>" +
"<a class=\"retry\" href=\"#\">重试</a></body></html>";

byte[] bytes = html.getBytes();
int len = bytes.length;
Log.i(TAG, "socketServer: len =" + len);
writer.write(("HTTP/1.0 200 OK\r\nContent-Length:"+len+"\r\n\r\n").getBytes());
writer.write(bytes);
writer.close();
}
}
}catch (Exception e){
e.printStackTrace();
}
}

private void initActivity(){
mWebView = (WebView) findViewById(R.id.web_view);
mWebSetting = mWebView.getSettings();

server = (EditText) findViewById(R.id.edit_text);
server.setVisibility(View.GONE);
appendUrl = (EditText) findViewById(R.id.edit_url);
appendUrl.setVisibility(View.GONE);

//------------------------------------------------------
mBtn = (Button) findViewById(R.id.btn_change_url);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadWebPage();
//                if (server.getText().toString().equals(""))
//                    server.setText("http://www.baidu.com/");
//                url = server.getText().toString() + appendUrl.getText().toString();
initActivity();
}
});

//------------------------------------------------------------
//启用触控缩放
mWebSetting.setBuiltInZoomControls(true);
//启用支持视窗meta标记(可实现双击缩放)
mWebSetting.setUseWideViewPort(true);
//以缩略图模式加载页面
mWebSetting.setLoadWithOverviewMode(true);
//启用JavaScript支持
mWebSetting.setJavaScriptEnabled(true);
//设置将接收各种通知和请求的WebViewClient(在WebView加载所有的链接)
mWebView.setWebViewClient(new WebViewClient());
//设置默认加载的网页
//        loadWebPage();
receivedError();

}
/**
* 访问网页
* */
private void loadWebPage(){
// 方式1:
mWebView.loadUrl(url);
// 方式2:
//        useLoadData();
// 方式3:加载本地assets里的html网页
//        mWebView.loadUrl("file:///android_asset/tet.html");
}

/**
* 使用loadData /loadDataWithBaseURL方法处理网页
**/
private void useLoadData(){
String data = "<!DOCTYPE html>";
data += "<html>";
data += "<head><title>出错页面</title>";
data += "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\"></head>";
data += "<body><style>body{ text-align:center;background:#efefef; color:#6f6f6f;margin: 0;";
data += "padding: 0;width:100%;}#center{ MARGIN-RIGHT: auto;MARGIN-LEFT: auto;height:200px;";
data += "width:400px;vertical-align:middle;line-height:200px;}</style>";
data += "<div id=\"center\">";
data += "<a style=\"font-size:24px;color:#333333\" href='http://baidu.com'>请求失败,重试</a>";
data += "</div></body></html>";

//        mWebView.loadData(data,"text/html", "utf-8" );
mWebView.loadDataWithBaseURL("",data,"text/html", "utf-8", "" );
}

/**
* 接收错误信息,http error无妨接收
**/
private void receivedError(){
mWebView.setWebViewClient(new WebViewClient(){

@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
Log.i(TAG, "onReceivedError: " );
}

@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.i(TAG, "onReceivedError: errorCode:" +errorCode + " 描述:" + description );
Toast.makeText(MainActivity.this, "errorCode:"+errorCode, Toast.LENGTH_SHORT).show();
}

@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
Log.i(TAG, "onReceivedHttpError:接收到错误"  );
Toast.makeText(MainActivity.this, "接收到错误", Toast.LENGTH_SHORT).show();
}
});
}

/**
* 返回键的处理
**/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {

switch (keyCode){
case KeyEvent.KEYCODE_BACK :
if (mWebView.canGoBack()){
mWebView.goBack();
return  true;
}else{
finish();
}
break;
default:
break;
}
return false;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: