Android连接服务器方法
由于刚接触android开发,故此想把学到的基础知识记录一下,以备查询,故此写的比较啰嗦:步骤如下:一、介绍:此文主要是介利用android网络通信功能把android客户端的数据传给web服务端进行操作此项目列举三个个传值方式:1、GET方式,2、POST方式,3、HttpClient 方式二、新建一个android工程——NewsManage工程目录:三、AndroidManifest.xml配置清单由于要访问网络,故需要添加网络访问权限,红色标注添加部分<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android" package="com.example.newsmanage"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="8" /><uses-permission android:name="android.permission.INTERNET"/><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><activityandroid:name=".NewsManageActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><categoryandroid:name="UNCHER" /></intent-filter></activity></application></manifest>四、main.xml配置:<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/title" /><EditTextandroid:id="@+id/title"android:layout_width="match_parent"android:layout_height="wrap_content" ><requestFocus /></EditText><TextViewandroid:id="@+id/textView1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/timelength" /><EditTextandroid:id="@+id/timelength"android:layout_width="match_parent"android:layout_height="wrap_content"android:numeric="integer"/><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/button" android:onClick="save"/></LinearLayout>五、string.xml配置:<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">Hello World, NewsManageActivity!</string> <string name="app_name">资讯管理</string><string name="title">视频标题</string><string name="timelength">播放时长</string><string name="button">保存</string><string name="success">保存成功</string><string name="fail">保存失败</string></resources>六、NewsManageActivity.java Activity源码:package com.example.newsmanage;import com.example.service.NewsService;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class NewsManageActivity extends Activity {/** Called when the activity is first created. */EditText titleText;EditText lengthText;Button button;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);titleText = (EditText) this.findViewById(R.id.title);lengthText = (EditText) this.findViewById(R.id.timelength); button = (Button) this.findViewById(R.id.button);}public void save(View v) throws Exception{String title = titleText.getText().toString();String timelength = lengthText.getText().toString();boolean result = NewsService.save(title,timelength);if(result){Toast.makeText(getApplicationContext(),R.string.success, Toast.LENGTH_LONG).show();} else {Toast.makeText(getApplicationContext(),R.string.fail,Toast.LENGTH_LONG).show();}}}七、NewsService .java 业务类源码:注:业务类提供三种发送请求的方式:get/post/httpClientpackage com.example.service;import java.io.OutputStream;import .HttpURLConnection;import .URL;import .URLEncoder;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;public class NewsService {/*** 保存数据,传递参数给web服务器端* @param title 标题* @param timelength 时长* @return*/public static boolean save(String title, String timelength) throws Exception {//119.119.228.105为本机IP地址,不能用localhost代替String path = "http://119.119.228.105:8080/web/ManageServlet";Map<String,String> params = new HashMap<String,String>();params.put("title", title);params.put("timelength", timelength);//get请求方式//return sendGETRequest(path,params,"UTF-8");//post请求方式//return sendPOSTRequest(path,params,"UTF-8");//httpClient请求方式,如果单纯传递参数的话建议使用GET或者POST请求方式return sendHttpClientPOSTRequest(path,params,"UTF-8");//httpclient 已经集成在android中}/*** 通过HttpClient发送post请求* @param path* @param params* @param encoding* @return* @throws Exception*/private static boolean sendHttpClientPOSTRequest(String path,Map<String, String> params, String encoding) throws Exception {List<NameValuePair> pairs = new ArrayList<NameValuePair>();//存放请求参数for(Map.Entry<String, String> entry:params.entrySet()){pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); }//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);HttpPost httpPost = new HttpPost(path);httpPost.setEntity(entity);DefaultHttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(httpPost);if(response.getStatusLine().getStatusCode() == 200){return true;}return false;}/*** 发送post请求* @param path 请求路径* @param params 请求参数* @param encoding 编码* @return 请求是否成功*/private static boolean sendPOSTRequest(String path,Map<String, String> params, String encoding) throws Exception{StringBuilder data = new StringBuilder(path);for(Map.Entry<String, String> entry:params.entrySet()){data.append(entry.getKey()).append("=");//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8data.append(URLEncoder.encode(entry.getValue(),encoding));data.append("&");}data.deleteCharAt(data.length() - 1);byte[] entity = data.toString().getBytes();//得到实体数据HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("POST");conn.setDoOutput(true);//设置为允许对外输出数据conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",String.valueOf(entity.length));OutputStream outStream = conn.getOutputStream();outStream.write(entity);//写到缓存if(conn.getResponseCode()==200){//只有取得服务器返回的http协议的任何一个属性时才能把请求发送出去return true;}return false;}/*** 发送GET请求* @param path 请求路径* @param params 请求参数* @return 请求是否成功* @throws Exception*/private static boolean sendGETRequest(String path,Map<String, String> params,String encoding) throws Exception {StringBuilder url = new StringBuilder(path);url.append("?");for(Map.Entry<String, String> entry:params.entrySet()){url.append(entry.getKey()).append("=");//get方式请求参数时对参数进行utf-8编码,URLEncoder//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8url.append(URLEncoder.encode(entry.getValue(), encoding));url.append("&");}url.deleteCharAt(url.length()-1);HttpURLConnection conn = (HttpURLConnection) new URL(url.toString()).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() == 200){return true;}return false;}}八、由于要把数据传递给web服务端,而web端传递过来的数据有两种格式,故需要新建一个web服务,使之能接收android客户端传递的参数;1、新建一个servlet可以接收传递的参数,源码如下:package com.example.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class ManageServlet*/public class ManageServlet extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public ManageServlet() {super();}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String title = request.getParameter("title");//把客户端传递过来的参数进行重新编码使之能支持中文//title = new String(title.getBytes("ISO8859-1"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作String timelength = request.getParameter("timelength");System.out.println("视频名称:"+title);System.out.println("播放时长:"+timelength);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String title = request.getParameter("title");//把客户端传递过来的参数进行重新编码使之能支持中文//title = new String(title.getBytes("ISO8859-1"),"UTF-8");//使用过滤器后就不需要每次都要进行此操作String timelength = request.getParameter("timelength");System.out.println("视频名称:"+title);System.out.println("播放时长:"+timelength);}}2、由于传递过来的参数默认编码为ISO8895-1,故打印后台的参数回事乱码故需要传递的过来的参数进行编码,但是如果每次都要对传递过来的参数都要进行编码转换,是比较麻烦的,故需要建立一个拦截器,对传递过来的参数进行统一在一起进行编码转换,当请求/*时拦截器先进行编码处理:拦截器代码如下:EncodingFilter .java 源码如下:package com.example.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;/*** Servlet Filter implementation class EncodingFilter*/public class EncodingFilter implements Filter {/*** Default constructor.*/public EncodingFilter() {}/*** @see Filter#destroy()*/public void destroy() {}/*** @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;if("GET".equals(req.getMethod())){EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(req);chain.doFilter(wrapper, response);} else {//postreq.setCharacterEncoding("UTF-8");chain.doFilter(request, response);}}/*** @see Filter#init(FilterConfig)*/public void init(FilterConfig fConfig) throws ServletException { }}EncodingHttpServletRequest .java源码如下:package com.example.filter;import java.io.UnsupportedEncodingException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;public class EncodingHttpServletRequest extends HttpServletRequestWrapper {private HttpServletRequest request;public EncodingHttpServletRequest(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {String value = request.getParameter(name);if(value!=null){try {value = new String(value.getBytes("ISO8859-1"),"UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}return value;}}注意:在运行android项目前必须先运行web服务九、先运行web服务器,然后运行android项目,发送参数后,web后台就可以打印出相应的信息十、注意事项以及相关知识点:1、由于涉及访问网络,故需要添加网络访问权限<uses-permissionandroid:name="android.permission.INTERNET"/>2、访问web服务时地址必须写网络的IP地址,否则会在本地服务上查找3、熟悉怎么向web服务端发送请求以及方式(http协议)GET方式:HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");conn.getResponseCode() == 200 来判断是否请求成功POST方式:byte[] entity = data.toString().getBytes();//得到实体数据HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("POST");conn.setDoOutput(true);//设置为允许对外输出数据conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");conn.setRequestProperty("Content-Length",String.valueOf(entity.length));OutputStream outStream = conn.getOutputStream();outStream.write(entity);//写到缓存if(conn.getResponseCode()==200){//只有取得服务器返回的http协议的任何一个属性时才能把请求发送出去return true;}HttpClient方式:List<NameValuePair> pairs = new ArrayList<NameValuePair>();//存放请求参数for(Map.Entry<String, String> entry:params.entrySet()){pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}//防止客户端传递过去的参数发生乱码,需要对此重新编码成UTF-8UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,encoding);HttpPost httpPost = new HttpPost(path);httpPost.setEntity(entity);DefaultHttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(httpPost);if(response.getStatusLine().getStatusCode() == 200){return true;}4、乱码产生的原因:(1)、通过get方式提交请求参数时,没有对中文进行URL编码(2)、 Tomcat服务器默认采用ISO8895-1编码得到的参数如果乱码表示为--> -->,则说明是由于客户端传递参数没有编码的原因如果乱码表示为,则说明是由于服务器端的默认编码不一致或者不支持中文的原因5、熟悉拦截器的使用以及原理。
Android搭建HTTP服务器--AndServer
Android搭建HTTP服务器--AndServerAndroid 搭建HTTP服务器--AndServer概述AndServer是Android平台的Web Server和Web Framework。
它基于编译时注解提供了类似SpringMVC的注解和功能,如果您熟悉SpringMVC,则可以⾮常快速地掌握它。
特性部署静态⽹站使⽤注解开发Http Api全局请求拦截器,使⽤注解,全局多个全局异常处理器,使⽤注解,全局唯⼀全局消息转换器,使⽤注解,全局唯⼀依赖添加依赖时请替换下述 {version} 字段为上公开的最新版本号。
dependencies {implementation 'com.yanzhenjie.andserver:api:{version}'annotationProcessor 'com.yanzhenjie.andserver:processor:{version}'}服务器(Server)⼀个WebServer必须要涉及到的点是启动、停⽌、⽹络地址与端⼝监听、连接超时配置、SSL、状态监听、Socket的⼀些优化配置等,AndServer也提供了这些能⼒。
在AndServer中,只需要启动服务器即可,其它组件AndServer会⾃动加载。
AndServer的服务器的启动是在⼦线程中进⾏的,因此服务器的启动成功与否,必须使⽤监听器下⾯是针对AndServer的服务器管理⽰例代码:public class ServerManager {private static final String TAG = "ServerManager";private Server mServer;/*** Create server.*/public ServerManager(Context context) {InetAddress inetAddress = null;try {inetAddress = InetAddress.getByName(NetInfo.getIpAddress(context)); //获取IP地址Log.d(TAG, "ServerManager: getIpAddress ="+NetInfo.getIpAddress(context));} catch (UnknownHostException e) {e.printStackTrace();}mServer = AndServer.serverBuilder(context).inetAddress(inetAddress) //地址.port(8080) //端⼝.timeout(10, TimeUnit.SECONDS) //延迟10s.listener(new Server.ServerListener() { //监听Server@Overridepublic void onStarted() {// TODO The server started successfully.Log.d(TAG, "onStarted: ");}@Overridepublic void onStopped() {// TODO The server has stopped.Log.d(TAG, "onStarted: ");}@Overridepublic void onException(Exception e) {Log.e(TAG, "onException: ",e );// TODO An exception occurred while the server was starting.}}).build();}/*** Start server.*/public void startServer() {if (mServer.isRunning()) {// TODO The server is already up.} else {mServer.startup();}}/*** Stop server.*/public void stopServer() {if (mServer.isRunning()) {mServer.shutdown();} else {Log.w("AndServer", "The server has not started yet.");}}}上⽂中有⼀段伪代码,作⽤是⽣成⼀个⽹络地址,⼀般我们都绑定本机在局域⽹中的IP地址。
Android设备上的VPN设置教程(九)
Android设备上的VPN设置教程随着互联网的普及和应用的广泛使用,网络安全问题也愈加突出。
为了保护个人隐私和数据安全,越来越多的人开始使用VPN(虚拟专用网络)来加密网络连接。
而对于Android设备用户来说,设置VPN可以说是一项非常重要的任务。
下面我们将介绍一些简单易行的步骤,帮助Android设备用户正确地设置VPN。
1. 了解VPN的基本原理VPN是一种通过互联网建立加密和安全连接的技术。
它可以隐藏用户的真实IP地址,让用户的网络活动更加隐私和安全。
VPN的原理是通过在用户和互联网之间建立一个加密隧道,将用户的数据传输经过加密后再发送到互联网,从而保护用户的隐私。
2. 下载合适的VPN应用在Android设备上设置VPN,首先要下载一个合适的VPN应用。
可以通过在应用商店中搜索“VPN”,找到一些受信任并且评价较高的VPN应用。
下载并安装这些应用后,就可以开始设置VPN了。
3. 打开VPN应用并创建一个新的VPN连接在安装好VPN应用后,打开应用并按照应用的指引创建一个新的VPN连接。
通常情况下,你需要提供一些必要的信息,例如服务器地址、用户名和密码等。
这些信息可以从你的VPN服务提供商那里获取。
4. 配置VPN连接在创建新的VPN连接后,你可以对连接进行一些配置。
一般来说,你可以选择连接的协议(如OpenVPN、IKEv2等),设置连接断开时是否自动重新连接,选择通信加密方式等等。
这些设置可以根据个人的需求和VPN服务提供商的要求进行调整。
5. 连接到VPN服务器在完成VPN配置后,你就可以连接到VPN服务器了。
在VPN应用的主界面上,你通常会看到一个“连接”或者“开启VPN”按钮。
点击该按钮,VPN应用会尝试连接到服务器。
连接成功后,你的设备将会通过VPN隧道进行网络通信。
6. 检查VPN连接连接到VPN服务器后,你可以进行一些简单的检查来确保VPN连接已经成功建立。
例如,在浏览器中打开一个IP地址定位网站,查看显示的IP地址是否是你选择的VPN服务器的地址。
详解ABB机器人SOCKET通讯
详解ABB机器⼈SOCKET通讯⼀、Socket通信简介Android与服务器的通信⽅式主要有两种,⼀是Http通信,⼀是Socket通信。
两者的最⼤差异在于,http连接使⽤的是“请求—响应⽅式”,即在请求时建⽴连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。
⽽Socket通信则是在双⽅建⽴起连接后就可以直接进⾏数据的传输,在连接时可实现信息的主动推送,⽽不需要每次由客户端想服务器发送请求。
那么,什么是socket?Socket⼜称套接字,在程序内部提供了与外界通信的端⼝,即端⼝通信。
通过建⽴socket连接,可为通信双⽅的数据传输传提供通道。
socket的主要特点有数据丢失率低,使⽤简单且易于移植。
1 什么是Socket Socket是⼀种抽象层,应⽤程序通过它来发送和接收数据,使⽤Socket可以将应⽤程序添加到⽹络中,与处于同⼀⽹络中的其他应⽤程序进⾏通信。
简单来说,Socket提供了程序内部与外界通信的端⼝并为通信双⽅的提供了数据传输通道。
2 Socket的分类根据不同的的底层协议,Socket的实现是多样化的。
本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。
流套接字将TCP作为其端对端协议,提供了⼀个可信赖的字节流服务。
数据报套接字使⽤UDP协议,提供数据打包发送服务。
下⾯,我们来认识⼀下这两种Socket类型的基本实现模型。
⼆、Socket 基本通信模型三、Socket基本实现原理3.1基于TCP协议的Socket服务器端⾸先声明⼀个ServerSocket对象并且指定端⼝号,然后调⽤Serversocket的accept()⽅法接收客户端的数据。
accept()⽅法在没有数据进⾏接收的处于堵塞状态。
(Socketsocket=serversocket.accept()),⼀旦接收到数据,通过inputstream读取接收的数据。
Android手机访问服务器的一种数据交互方法
3、接收数据
3、接收数据
接收服务器响应的数据是数据交互的另一个关键步骤。Android应用程序可以 通过解析HTTP响应来获取服务器返回的数据。常见的数据格式包括JSON、XML和 纯文本等。在解析数据时,需要遵循服务器端返回的数据格式,以便正确解析和 显示数据。
四、优点
本节将分析Android手机访问服 务器的方法的优点。
本节将分析Android手机访问服务器的方法的优点。
1、提高效率:通过访问服务器,Android应用程序可以实时获取最新的数据, 从而提高用户体验和应用程序的效率。
本节将分析Android手机访问服务器的方法的优点。
2、降低成本:与本地存储相比,访问服务器可以减少存储空间的需求,降低 应用程序的成本。
一、引言
一、引言
Android操作系统是目前市场份额最大的移动操作系统之一,拥有庞大的用户 群体和丰富的应用生态。对于Android手机用户来说,访问服务器已成为应用程 序的基本需求。本次演示将介绍一种简单易行的方法,帮助Android手机应用程 序实现与服务器之间的数据交互。
二、背景
二、背景
三、方法
1、打开服务器端口
1、打开服务器端口
首先,需要打开服务器的网络端口,以供手机应用程序访问。服务器端口可 以使用防火墙进行保护,确保只有授权的设备或应用程序可以访问。在Android 应用程序中,可以使用HTTP或HTTPS协议,通过URL访问输数据
数据传输是手机应用程序与服务器之间的重要环节。在HTTP协议下,可以通 过请求和响应的方式进行数据传输。Android应用程序可以使用各种网络库,如 OkHttp、Volley或Retrofit等,向服务器发送请求并接收响应。数据传输通常 包括GET和POST两种方式,其中GET请求适用于获取数据,而POST请求适用于上传 数据。
Android使用HttpURLConnection调用WebService接口
Android使用HttpURLConnection调用WebService接口在Android中,可以使用HttpURLConnection类来调用WebService接口。
HttpURLConnection是Java中用于发送和接收HTTP请求的基本类,而WebService是一种支持跨网络的远程调用技术,可以在不同平台之间进行通信。
HttpURLConnection可以通过HTTP协议与WebService接口进行通信。
下面是使用HttpURLConnection调用WebService接口的步骤:1. 创建URL对象:首先,需要创建一个URL对象,将WebService的URL地址作为参数传递给URL构造函数。
例如:``````2. 打开连接:通过URL对象的openConnection方法打开与WebService的连接。
该方法会返回一个HttpURLConnection对象,可以通过类型转换来获取具体的对象。
```HttpURLConnection connection = (HttpURLConnection)url.openConnection(;```3. 设置请求方法:使用setRequestMethod方法设置请求的方法,常用的方法有GET和POST。
GET方法用于获取WebService返回的数据,而POST方法用于向WebService发送数据。
```connection.setRequestMethod("POST");```4. 设置请求参数:如果使用POST方法发送数据,需要设置请求的参数。
可以通过设置connection的OutputStream来发送数据。
```connection.setDoOutput(true);DataOutputStream outputStream = newDataOutputStream(connection.getOutputStream();outputStream.writeBytes("param1=value1¶m2=value2");outputStream.flush(;outputStream.close(;```5. 获取响应数据:使用getInputStream方法获取WebService的响应数据。
android sock5代理 原理
android sock5代理原理Android Socks5代理的原理Socks5是一种网络代理协议,它允许应用程序通过代理服务器进行网络通信。
在Android中实现Socks5代理的原理可以分为以下几个步骤:1. 配置代理服务器:首先,需要配置一个Socks5代理服务器的地址和端口。
这个代理服务器将作为中间人,负责转发Android设备与互联网之间的通信。
2. 建立连接:Android设备上的应用程序将会尝试与目标服务器建立连接。
在建立连接之前,应用程序必须先与Socks5代理服务器建立连接。
3. 握手协议:建立连接后,Android设备会发送一个握手请求给Socks5代理服务器。
握手请求中包含了支持的认证方法列表,如无需认证、用户名密码认证等。
4. 选择认证方法:Socks5代理服务器会从客户端发送的认证方法列表中选择一个合适的认证方法,并将其作为响应发送回给客户端。
5. 发送认证信息:如果选择的认证方法需要认证信息,Android设备将会发送相应的认证信息给Socks5代理服务器,以便进行身份验证。
6. 建立代理隧道:认证成功后,Socks5代理服务器与目标服务器之间将会建立一个代理隧道。
此时,所有来自Android设备的网络请求将会通过代理服务器转发到目标服务器。
7. 数据传输:一旦代理隧道建立,Android设备上的应用程序可以将网络请求发送到代理服务器。
代理服务器会将请求转发到目标服务器,并将响应返回给Android设备。
通过上述步骤,Android设备上的应用程序可以通过Socks5代理实现与目标服务器的网络通信。
这种方式可以用于绕过某些网络限制或保护用户隐私等需求。
需要注意的是,使用Socks5代理可能会导致网络连接速度的下降,因为所有的网络请求都需要经过代理服务器转发。
android avd 连接外部服务器的方法
android avd 连接外部服务器的方法开发android程序,通常会有网络连接,当我们使用模拟器(avd)运行需要网络权限的app时候,需要注意以下两点。
1、组网avd连接到外部网络,通常存在两种情况:avd与服务在同一台机器上;avd与服务在不同的机器上。
1)avd与服务在同一台机器上。
这时候avd要连接服务器,该用哪个IP地址呢?可能有人会想到127.0.0.1(localhost)。
但是仔细想一想,avd是一个模拟器,相当于一个虚拟机,localhost就连到了自己,这个是行不通的。
avd是一个虚拟机,相当于一台独立的机器,因此有自己独立的网络IP 地址。
所以就常用的就是连接服务器的外网(在这个局域网或internet上的)IP地址。
有人会问,我的服务器是通过DHCP动态获取IP地址的,且我得avd与服务器在同一机器上,每次服务器启动得IP地址都不一致,那我每次都得修改app配置文件中的IP地址?这个确实是一个麻烦事情,不过还好,avd提供了类似127.0.0.1的环回IP地址,其实是一个桥接地址更准确,他让你能够连接到运行avd的服务器,这个IP地址就是10.0.2.22)avd与服务器在不同的机器上。
这种组网下只能连接服务器的外网IP地址。
2、android app配置网络通了之后,可能会遇到app连接服务器失败的问题,其错误是 ConnectionRefused,这种错误一般是IP能够连通,但是连接某个特定的端口被拒绝了。
仔细查看其异常信息,会发现有这么一个信息:socket failed :EACCES (Permission denied)没有权限。
这个是app没有申请网络权限,在app的 AndroidManifest.xml 文件中,需要申请网络访问权限:...uses-permission android:name="android.permission.INTERNET"...加上权限申请之后,就可以工作了。
Android手机静态IP连接局域网访问局域网电脑Web服务器
Android 手机静态IP 连接局域网访问局域网电脑Web服务器 移动网页网站编程需要进行测试。测试手段可以采用模拟器,也可以采用真实设备测试。本文给出采用真实设备的网页网站编 程测试方法。 移动设备连接网络一般有移动蜂窝网和WIFI2中方式。移动蜂窝网络连接方式不易实现。无线路由器192.168.0.1 1.电脑设置 1)安装启动Tomcat Web Server 2)网络设置 关闭防火墙,否则不能进入Tomcat管理员页面
设置IP地址、网关、DNS等
3) 通过WIFI 连接路由器 2. 手机端设置 1)Android 安装wifi static 1.3 2)设置Android 静态IP 启动wifi static
DNS1 192.168.0.1
打开网
android利用websocket协议与服务器通信
android利⽤websocket协议与服务器通信最近做⼀个项⽬,需求中需要服务器主动推送消息到客户端。
这样的话⼀般的http连接就不能使⽤了。
博主问了个朋友,向我推荐websocket协议,特此测试了⼀下,发现效果很好。
android本⾝没有websocket的库,需要⾃⼰下载,。
客户端代码:界⾯布局⾃⼰写,很简单的两个buttonpackage com.example.test;import com.example.test.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import de.tavendo.autobahn.WebSocketConnection;import de.tavendo.autobahn.WebSocketConnectionHandler;import de.tavendo.autobahn.WebSocketException;public class MainActivity extends Activity implements OnClickListener {private Button bt;private EditText ed_name;private EditText ed_text;private Button bt1;WebSocketConnection wsc;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);bt = (Button) findViewById(R.id.bt);ed_name = (EditText) findViewById(R.id.ed_name);ed_text = (EditText) findViewById(R.id.ed_text);bt1 = (Button) findViewById(R.id.bt1);bt.setOnClickListener(this);bt1.setOnClickListener(this);wsc = new WebSocketConnection();}private void connect() {System.out.println("开始连接websocket///");try {wsc.connect("ws://192.168.1.245:8080/DriveServer/mainservlet",new WebSocketConnectionHandler() {@Overridepublic void onBinaryMessage(byte[] payload) {System.out.println("onBinaryMessage size="+ payload.length);}@Overridepublic void onClose(int code, String reason) {System.out.println("onClose reason=" + reason);}@Overridepublic void onOpen() {System.out.println("onOpen");showtext("连接成功");// wsc.sendTextMessage("Hello!");// wsc.disconnect();}@Overridepublic void onRawTextMessage(byte[] payload) {System.out.println("onRawTextMessage size="+ payload.length);}@Overridepublic void onTextMessage(String payload) {System.out.println("onTextMessage" + payload);showtext(payload);}});} catch (WebSocketException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubint id = v.getId();switch (id) {case R.id.bt :wsc.sendTextMessage("我是客户端,我通过ws往服务器发数据"); break;case R.id.bt1 :connect();break;default :break;}}private void showtext(String msg) {Toast.makeText(this, msg, 0).show();}}下⾯是服务器代码:⽤的是jetty7⾃带的websocket库package com.websocket;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.eclipse.jetty.websocket.WebSocket;import org.eclipse.jetty.websocket.WebSocket.OnTextMessage; import org.eclipse.jetty.websocket.WebSocketServlet;public class ChatWebSocketServlet extends WebSocketServlet {private static final long serialVersionUID = 911879078000755859L; private List<MyWebSocket> list = new ArrayList<MyWebSocket>(); class MyWebSocket implements OnTextMessage {private String userName = "匿名⽤户";public MyWebSocket(String userName) {if (userName != null && userName.length() > 0) {erName = userName;}}private Connection conn;public void onClose(int arg0, String arg1) {// TODO Auto-generated method stubSystem.out.println("onOpen 断开连接了。
Android客户端Socket连接PC服务器端
Android客户端Socket连接PC服务器端(转载加评论)文章分类:JavaEye先上代码:1. SocketConnect.java文件Java代码1.package ;2.3.import java.io.BufferedReader;4.import java.io.BufferedWriter;5.import java.io.InputStreamReader;6.import java.io.OutputStreamWriter;7.import java.io.PrintWriter;8.import .Socket;9.10.import android.app.Activity;11.import android.os.Bundle;12.import android.util.Log;13.import android.view.View;14.import android.view.View.OnClickListener;15.import android.widget.Button;16.import android.widget.EditText;17.import android.widget.TextView;18.19.public class SocketConnect extends Activity {20.21. private TextView mTextView = null;22. private EditText mEditText = null;23. private Button mButton = null;24.25. /** Called when the activity is first created. */26. @Override27. public void onCreate(Bundle savedInstanceState) {28. super.onCreate(savedInstanceState);29. setContentView(yout.main);30.31. mButton = (Button) findViewById(R.id.Button01);32. mTextView = (TextView) findViewById(R.id.TextView01);33. mEditText = (EditText) findViewById(R.id.EditText01);34.35. // 登陆36. mButton.setOnClickListener(new OnClickListener() {38. Socket socket = null;39. String message = mEditText.getText().toString() + "\r\n";40. try {41. // 创建Socket42. socket = new Socket("192.168.1.100", 5554); // 查看本机IP,每次开机都不同43. // 向服务器发送消息44. PrintWriter out = new PrintWriter(new BufferedWriter(45. new OutputStreamWriter(socket.getOutputStream())),46. true);47. out.println(message);48.49. // 接收来自服务器的消息50. BufferedReader br = new BufferedReader(51. new InputStreamReader(socket.getInputStream()));52. String msg = br.readLine();53.54. if (msg != null) {55. mTextView.setText(msg);56. } else {57. mTextView.setText("数据错误!");58. }59. // 关闭流60. out.close();61. br.close();62. // 关闭Socket63. socket.close();64. } catch (Exception e) {65. // TODO: handle exception66. Log.e("", e.toString());67. }68. }69. });70. }71.}Java代码1.<?xml version="1.0" encoding="utf-8"?>2.<LinearLayout xmlns:android="/apk/res/android"3.android:orientation="vertical" android:layout_width="fill_parent"4.android:layout_height="fill_parent">5.<Button android:text="Button01" android:id="@+id/Button01"6.android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>7.<TextView android:text="TextView01" android:id="@+id/TextView01"8.android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>9.<EditText android:text="EditText01" android:id="@+id/EditText01"10. android:layout_width="wrap_content" android:layout_height="wrap_content"></EditText>11.</LinearLayout>3.注意添加AndroidMenifest.xml的权限Java代码1.<uses-permission android:name="android.permission.INTERNET" />4.服务器端,就是建立一个简单的java文件,运行起来就可以了Java代码1.package ;2.3.import java.io.BufferedReader;4.import java.io.BufferedWriter;5.import java.io.InputStreamReader;6.import java.io.OutputStreamWriter;7.import java.io.PrintWriter;8.import .ServerSocket;9.import .Socket;10.11.public class Server implements Runnable {12. public void run() {13. try {14. // 创建ServerSocket15. ServerSocket serverSocket = new ServerSocket(16. while (true) {17. // 接受客户端请求18. Socket client = serverSocket.accept();19. System.out.println("accept");20. try {21. // 接收客户端消息22. BufferedReader in = new BufferedReader(23. new InputStreamReader(client.getInputStream()));24. String str = in.readLine();25. System.out.println("read:" + str);26. // 向服务器发送消息27. PrintWriter out = new PrintWriter(new BufferedWriter(28. new OutputStreamWriter(client.getOutputStream())),29. true);30. out.println("server message");31. // 关闭流32. out.close();33. in.close();34. } catch (Exception e) {35. System.out.println(e.getMessage());36. e.printStackTrace();37. } finally {38. // 关闭39. client.close();40. System.out.println("close");41. }42. }43. } catch (Exception e) {44. System.out.println(e.getMessage());45. }46. }47.48. // main函数,开启服务器49. public static void main(String a[]) {50. Thread desktopServerThread = new Thread(new Server());51. desktopServerThread.start();53.}以上即为所以代码,希望大家有所收获...感谢志毅的blog啊,之前写过差不多的代码没有调试成功还....呵呵[其他难题] Android客户端连接PC服务器端(Socket连接) [复制链接]客户端代码:package ;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .Socket;import android.app.Activity;import android.os.Bundle;import android.widget.Button;import android.widget.TextView;import android.view.View;import android.view.View.OnClickListener;public class SocketClient extends Activity implements OnClickListener{DataInputStream dis;DataOutputStream dos;private TextView mTextView1;private Button Button01;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.main);mTextView1 = (TextView) findViewById(R.id.rec);Button01 = (Button) findViewById(R.id.Button01); Button01.setOnClickListener(this);Client("127.0.0.1");//WriteInt(25);//WriteString("client");//ReadInt();}public void Client(String IP) {try {// specified by the parameters dstName and dstPort.// 创建一个socket流连接到目标主机,socket = new Socket(IP, 10000);// 输入流读出数据输出流写数据dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException ioe) {ioe.printStackTrace();}}// 写数据到socketpublic void WriteInt(int i) {try {dos.writeInt(i);dos.flush();} catch (IOException ioe) {ioe.printStackTrace();}}StringBuffer message = new StringBuffer(); message.append(str);byte[] b = new byte[6];try {dos.write(12);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}// 显示从socket返回的数据public void ReadInt() {try {mTextView1.setText(dis.readInt()); System.out.println(dis.readInt());} catch (IOException ioe) {ioe.printStackTrace();}}@Overridepublic void onClick(View v) {// TODO Auto-generated method stub WriteInt(25);}}复制代码服务器端代码:package ;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import .ServerSocket;import .Socket;public class Server {ServerSocket serversocket;Socket socket;DataInputStream dis; DataOutputStream dos;public Server() {try {serversocket = new ServerSocket(10000);System.out.println("等待Client 連接");socket = serversocket.accept();System.out.println("Client 已連接");dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException ioe) {ioe.printStackTrace();}}public void WriteInt(int i) {try {dos.writeInt(i);dos.flush();} catch (IOException ioe) {ioe.printStackTrace();}}public void ReadInt() {try {System.out.println(dis.readInt());} catch (IOException ioe) {}}public static void main(String args[]) { Server theServer = new Server(); theServer.WriteInt(10); theServer.ReadInt();}}成功解决问题服务器端代码package wsq.study;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException;import .ServerSocket;import .Socket;public class Server {ServerSocket serversocket;Socket socket;DataInputStream dis; DataOutputStream dos;public Server() {try {serversocket = new ServerSocket(1900);System.out.println("等待Client 连接");// 侦听套接字上的连接socket = serversocket.accept();System.out.println("Client 已连接");dis = new DataInputStream(socket.getInputStream()); dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException ioe) {ioe.printStackTrace();}}public void WriteInt(int i) {try {// 向socket的输出流写入Int(32位integer)数据// 如果是4个字节,则从高到底写入dos.writeInt(i);dos.flush();} catch (IOException ioe) {ioe.printStackTrace();}}// 从socket的输入流读出int(32位integer)数据public void ReadInt() {try {System.out.println(dis.readInt());} catch (IOException ioe) {ioe.printStackTrace();}}public void readString(){try{System.out.println(dis.readUTF());}catch(IOException e){e.printStackTrace();}}public static void main(String args[]) {Server theServer = new Server();// 接收服务器端已经成功,获取客户端发送来的25 theServer.ReadInt();theServer.readString();theServer.WriteInt(10);}}。
