如何实现android和服务器长连接

如何实现android和服务器长连接,第1张

我们有时候有这种需求,即我们的android客户端要始终保持与服务端的连接,当服务端有任务或消息发送到android客户端的时候就发送,没有任务或消息的时候不发送但要保持这个连接,一旦有任务则开发发送,而我们的android客户端则要保持一个时刻接收任务或消息的状态。。。这个时候我们通过socket来实现这种需求当然你也可以采用>建议你再确认一下:
1,防火墙确实已经关闭了。
2,代码里面设置的服务器ip地址修改为连接wifi的那个网卡的地址了。(用模拟器时和用真机时服务器地址应该不一样吧。)
要是都是对的,那只能再找高人了。

android客户端和java服务端之间可以用socket来传输。
服务器端代码:
import javaioDataInputStream;
import javaioDataOutputStream;
import javaioFileInputStream;
import javaioIOException;
import javanetInetSocketAddress;
import javanetServerSocket;
import javanetSocket;

public class Server02 {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(40000);
Socket socket = serveraccept();
DataInputStream dos = new DataInputStream(socketgetInputStream());
int len = dosavailable();
Systemoutprintln("len = "+len);
byte[] data = new byte[len];
dosread(data);

Systemoutprintln("data = "+data);
dosclose();
socketclose();
serverclose();
} catch (IOException e) {
eprintStackTrace();
}
}
}
客户端代码:
[java] view plaincopy
imageView02 = (ImageView)findViewById(Ridimage02);
button02 = (Button)findViewById(RidButton02);
button02setOnClickListener(new OnClickListener(){
public void onClick(View arg0) {
Socket socket;
try {
socket = new Socket("1921681203",40000);
DataOutputStream out = new DataOutputStream(socketgetOutputStream());

Bitmap bitmap = BitmapFactorydecodeResource(getResources(), Rdrawableqt);
imageView02setImageBitmap(bitmap);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//读取到ByteArrayOutputStream
bitmapcompress(BitmapCompressFormatPNG, 100, baos);
byte[] bytes = baostoByteArray();
outwrite(bytes);

Systemoutprintln("bytes--->"+bytes);
outclose();
socketclose();
} catch (UnknownHostException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
});

}

Android使用的仅仅使用了PC 里边的一个端口IP自然就是127001了,或者是localhost吧关于5037口和5555口,找到了一个看起来合理的解释:adb(Android Debug Bridge)包括三个部分:1)adb client, 运行在PC上(为DDMS,即IDE工作)2)adb daemon(守护进程), 运行于Emulator(为与Emulator中的VM交互工作);3)adb server(服务进程), 运行在PC(任务管理器上有),管理着adb client和adb daemon的通信server与client通信的端口是是5037,adb server会与emulator交互的,使用的端口有两个,一个是5554专门用于与Emulator实例的连接,那么数据可以从Emulator转发给IDE控制台了,另一个则是5555,专门与adb daemon连接为后面调试使用。

一、消息推送基础
消息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息
当我们开发需要和服务器交互的移动应用时,基本上都需要和服务器进行交互,包括上传数据到服务器,同时从服务器上获取数据。
一般情况下,客户端与服务器之间通讯客户端是主动的,但这就存在一个问题就是一旦服务器数据有更新或者服务器要下发通知给客户端只能等客户端连接的时候才能实现。这种方式使消息失去了实时性。
如何使客户端能够实时的收到服务器的消息和通知,总体来说有两种方式,第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。 
虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push方式比Pull方式更优越。因为Pull方式更费客户端的网络流量,更主要的是费电量,还需要我们的程序不停地去监测服务端的变化。  
二、几种常见的解决方案实现原理
1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10233241.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存