A. 自己写了一个Android的APP,想用socket连接服务器
最近我在在写一个APP,用到了socket,在自己电脑上搭建的服务器,具体过程: 用eclipse写java代码,创建一个serversocket,用来监听客户端的请求; 客户端在发送数据前,首先创建一个Socket,然后直接请求服务器即可。自己写了一个Android的APP,想用socket连接服务器
B. android做客户端socket如何让点击按钮向服务器发送信息
使用基于TCP协议的Socket一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如192.168.1.1),也可以是主机名(example.com)。而在android 4.0 之后系统以后就禁止在主线程中进行网络访问了,原因是:主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。以下是一个android socket客户端的例子:———————————Java代码—————————————import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import java.io.UnsupportedEncodingException;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class TCPSocketActivity extends Activity {public static final String TAG = TCPSocketActivity.class.getSimpleName();/* 服务器地址 */private String host_ip = null;/* 服务器端口 */private int host_port = 0;private Button btnConnect;private Button btnSend;private EditText editSend;private EditText hostIP;private EditText hostPort;private Socket socket;private PrintStream output;private String buffer = "";private Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_socket_test);context = this;initView();btnConnect.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {host_ip = hostIP.getText().toString();host_port = Integer.parseInt(hostPort.getText().toString());new Thread(new ConnectThread()).start();}});btnSend.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new SendThread(editSend.getText().toString())).start();}});}private void toastText(String message) {Toast.makeText(context, message, Toast.LENGTH_LONG).show();}public void handleException(Exception e, String prefix) {e.printStackTrace();toastText(prefix + e.toString());}public void initView() {btnConnect = (Button) findViewById(R.id.btnConnect);btnSend = (Button) findViewById(R.id.btnSend);editSend = (EditText) findViewById(R.id.sendMsg);hostIP = (EditText) findViewById(R.id.hostIP);hostPort = (EditText) findViewById(R.id.hostPort);}private void closeSocket() {try {output.close();socket.close();} catch (IOException e) {handleException(e, "close exception: ");}}Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (0x123 == msg.what) {toastText("连接成功!");}}};/* 连接socket线程 */public class ConnectThread implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubMessage msg = Message.obtain();try {if (null == socket || socket.isClosed()) {socket = new Socket();socket.connect(new InetSocketAddress(host_ip,host_port),5000);output = new PrintStream(socket.getOutputStream(), true,"utf-8");}msg.what = 0x123;handler.sendMessage(msg);} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}/*发送信息线程*/public class SendThread implements Runnable {String msg;public SendThread(String msg) {super();this.msg = msg;}@Overridepublic void run() {// TODO Auto-generated method stubtry {output.print(msg);} catch (Exception e) {e.printStackTrace();}closeSocket();}}public class SocketThread implements Runnable {public String txt1;public SocketThread(String txt1) {super();this.txt1 = txt1;}@Overridepublic void run() {// TODO Auto-generated method stubMessage msg = Message.obtain();try {/* 连接服务器 并设置连接超时为5秒 */if (socket.isClosed() || null == socket) {socket = new Socket();socket.connect(new InetSocketAddress(host_ip,host_port),5000);}// 获取输入输出流PrintStream ou = new PrintStream(socket.getOutputStream(),true, "UTF-8");BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 读取发来服务器信息String line = null;buffer = "";while ((line = bff.readLine()) != null) {buffer = line + buffer;}// 向服务器发送信息ou.print(txt1);ou.flush();// 关闭各种输入输出流bff.close();ou.close();socket.close();msg.what = 0x123;handler.sendMessage(msg);} catch (UnknownHostException e) {} catch (IOException e) {}}}}—————————–布局文件activity_socket_test.xml————————————–<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:orientation="vertical" > <EditText android:id="@+id/hostIP" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="服务器ip" android:singleLine="true" android:inputType="text" /> <EditText android:id="@+id/hostPort" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="端口" android:singleLine="true" android:inputType="number" /> <Button android:id="@+id/btnConnect" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:background="@drawable/style_btn_shape" android:layout_margin="5dip" android:text="@string/connect" android:textColor="@color/white" /> <EditText android:id="@+id/sendMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="需要发送的内容" android:inputType="text" /> <Button android:id="@+id/btnSend" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:background="@drawable/style_btn_shape" android:layout_gravity="center_vertical|center_horizontal" android:text="@string/send" android:textColor="@color/white" /></LinearLayout>————————-样式文件style_btn_shape.xml———————————-<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!– 填充的颜色 –> <solid android:color="#0465b2" /> <!– 设置按钮的四个角为弧形 –> <!– android:radius 弧形的半径 –> <corners android:radius="15dip" /> <!– padding:Button里面的文字与Button边界的间隔 –> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape>——————————END—————————————
C. 苹果版本socket连接失败怎么办
第一种解决方法进入 iOS 设置 – 「iTunes 与 App Store」, 按下你的 Apple ID,然后登出,然后重新登入版,就不会出现「权无法连接 App Store」第二种解决方法修改DNS域名,设置-无线局域-信息(i),将DNS改为8.8.8.8,这是谷歌提供的DNS,它解析出的证书是正常的。但它也有一个缺陷,就是有可能会拖慢网速,此时只需要将DNS再修改回来即可。第三种解决方法(还原网络设置)依次点击设置、通用、还原、还原网络设置的路径按钮,进行还原一下即可。在还原后会需要你重新输入Wi-Fi的密码,请提前找到密码,另外就是之前登录过Wi-Fi的地方都是需要重新连接一次的,shu比如你在家、公司的Wi-Fi就不会自动连接了,在重新连接后又会自动连接。第四种解决方法PP助手上同样拥有海量的应用软件,并且全部免费无需多次输入Apple ID。绝对是喜欢下载各种应用的用户的福音。
D. app推送是怎么实现的
app推送的基本原理,其实就是通过手机和服务器之间的Socket维持一个TCP长连接,通过这个长连接来实现服务器和客户端之间的通信。所以推送服务的提供商都会同时提供一个库来供第三方引用,这个嵌入的库会帮助第三方应用维护和服务器之间的连接,包括权限校验,断开重连等的工作。这样暴露给第三方开发者的就是一个简单的接口了,开发人员不必关心网络的断开与重连,以及心跳检测等各种复杂的技术问题。当然,除此以外,这些潜入的库往往还会封装一些接口,比如帮助收到消息后显示在通知栏,展示页面,甚至激活应用,传递数据到应用并显示在应用中的某个界面等。这些功能都可以极大的简化app开发的工作,这些扩展的功能就是和短信最大的区别。因为HTTP请求最终其实还是通过TCP协议实现的,只不过它的TCP连接是短连接,握手非常频繁,所以自然就比较耗电,而且HTTP方式是基于文本方式进行通信的,因此协议冗余比较大,流量消耗自然就大了。而且轮询方式带来的问题是,在两次轮询之间的时间间隔内是没办法拿到服务器下发的消息的。app推送原原理可以到极光了解下,极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供移动消息推送服务。是多数人喜爱的推送消息的平台。
E. android socket请求数据怎么抓包
从网络上面搜索到的资料看,要抓取手机中app的网络包有下面几种方式:(1).将tcpmp移植到Android平台,然后在命令行下启动tcpmp进行抓包。Tcpmp程序实际上可以看作是wireshark的命令行版本,将该程序移植到Android平台直接抓包,这是一种最直接的抓包方式,然后将抓获的数据包文件,从手机传到windows系统上用wireshark打开进行分析,这种方式貌似不能用于苹果手机。(2).使用fiddler,在windows系统上打开fiddler软件,该软件会将我们的电脑变成一个代理,然后在手机上设置wifi网络,将代理指定为开启fiddler的那台电脑,并且端口设置为fiddler侦听的8888端口,这时候使用手机访问的数据,就会通过该代理,在fiddler中就可以看到http的数据包。这种方法我试了半天怎么都看不到数据包,不知道哪里出问题了,根据原理,这种方式支持可以通过代理访问网络的手机。所以从原理上说是支持Android和苹果手机的。(3).通过各种方式在pc电脑上建立wifi热点,然后使用wireshark在pc电脑上监视该wifi热点,通过手机连接该热点访问网络。这样wireshark会获取所有流经该热点的数据包这种方式适用于所有能够无线访问的手机,也就是说所有的Android和苹果手机。那么如何在pc电脑上建立wifi热点呢,有这么几种办法:(1).Win7电脑经过设置,可以将无线网卡设置为wifi热点,这种方法我以前用过,可以成功,但是步骤繁琐,而且不一定能够成功,其他的windows系统估计就没戏了。(2).使用软件自动建立wifi热点,不需要自己手工配置,这样的软件有Connectify Hotspot,猎豹免费wifi,360免费wifi软件,这几个软件我都使用过,比较好用,这种方式同样也只能针对有无线网卡的笔记本电脑,原理也是将笔记本电脑上的无线网卡建立热点了,只不过是软件自动的,不需要人工设置,比方法1要方便。注意:经过实验发现,手机连接这种方式建立的热点,所发送的数据,用wireshark去抓包,需要捕获电脑上本身联网的那个“网络连接”,例如我的笔记本上面有一个“本地连接”,该连接是使用有线网络的。我用猎豹免费wifi软件建立一个热点之后,我的电脑上多出一个“无线网络连接3”,可以看到该“无线网络连接3”是猎豹生成的,但是我抓包的时候,wireshark需要捕获“本地连接”上的包,也就是我的手机访问的数据实际上还是使用的“本地连接”,通信IP也是“本地连接”上的IP地址,而在手机的wifi连接设置中看到的ip地址,在我抓的包中也搜不到,也就是说手机通过该热点访问网络,实际上还是使用的“本地连接”的IP地址,至于是什么原理,我目前也不太清楚。但是下面要说的随身wifi硬件则与此不同,随身wifi是建立了网卡。(3).使用随身wifi硬件。这种也是很方便的方法,而且比较稳定,对笔记本电脑和台式机都可以使用。我之前买了一个360的随身wifi(不是打广告,本人对360公司不感冒,但是他的随身wifi做的确实还可以,同事中有买小米wifi的,不太稳定)。只要在360的官网上下载驱动,直接插上随身wifi就可以使用,我推荐使用这种方法。如果你用的是笔记本电脑可以使用方法2,如果是台式机器可以使用方法3。
F. app推送有哪些
手机里经常我们接触到的APP推送有很多。一般的如网络推送、手机浏览器推送、今日头条推送,在就是一些视频软件如爱奇艺 腾讯视频等。消息推送功能如今已经成为了app的必备功能,主要是通过推送(push)的方式将app相关的资讯和活动等消息发送给用户,能够有效的在app自身的生态内发挥推广营销的作用,也是维护用户关系、增强用户的重要工具。目前主流的第三方推送服务商主要有极光推送等公司。对于手机端APP来说,推送分APP在线推送还是离线推送,其实就是APP是否存活,APP存活情况下,有多种选择,如果APP通过Socket跟自家服务器建立了链接,则可以由自家服务器直接推送到APP端,也可以通过后端推送到第三方推送服务,借由第三方推送给APP端,也就是在线情况下,可以不用接入第三方SDK。但是在APP死亡的情况,只有一种方式:借由第三方推送服务,推送给手机端,消息推送推送可以到极光了解一下。极光推送提供了基于HTTP协议的推送API,API包含全部的推送功能,开发者完全可以基于此API开发独立的推送页面或者将推送功能集成到现有的管理系统内。