安卓开发 监听端口,获取服务器发送过来的数据。

安卓开发 监听端口,获取服务器发送过来的数据。,第1张

不明白发送消息的客户端为什么还要监听端口,sokect是双向的,另外在Android上实现监听的话不是跟pc上一样吗?

ServerSocket ss = new ServerSocket(10000);

Socket socket = ssaccept();

Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。

两种使用方式:

用设备号/设备mac地址作为Token(推荐)

客户端:客户端在登录的时候获取设备的设备号/mac地址,并将其作为参数传递到服务端。

服务端:服务端接收到该参数后,便用一个变量来接收同时将其作为Token保存在数据库,并将该Token设置到session中,客户端每次请求的时候都要统一拦截,并将客户端传递的token和服务器端session中的token进行对比,如果相同则放行,不同则拒绝。

分析:此刻客户端和服务器端就统一了一个唯一的标识Token,而且保证了每一个设备拥有了一个唯一的会话。该方法的缺点是客户端需要带设备号/mac地址作为参数传递,而且服务器端还需要保存;优点是客户端不需重新登录,只要登录一次以后一直可以使用,至于超时的问题是有服务器这边来处理,如何处理?若服务器的Token超时后,服务器只需将客户端传递的Token向数据库中查询,同时并赋值给变量Token,如此,Token的超时又重新计时。

用session值作为Token

客户端:客户端只需携带用户名和密码登陆即可。

客户端:客户端接收到用户名和密码后并判断,如果正确了就将本地获取sessionID作为Token返回给客户端,客户端以后只需带上请求数据即可。

分析:这种方式使用的好处是方便,不用存储数据,但是缺点就是当session过期后,客户端必须重新登录才能进行访问数据。

Android 客户端代码:

package comltbSCActivity;

import javaioBufferedReader;

import javaioBufferedWriter;

import javaioIOException;

import javaioInputStreamReader;

import javaioOutputStreamWriter;

import javaioPrintWriter;

import javanetSocket;

import androidappActivity;

import androidosBundle;

import androidosHandler;

import androidosMessage;

import androidutilLog;

import androidviewView;

import androidviewViewOnClickListener;

import androidwidgetButton;

import androidwidgetEditText;

import androidwidgetTextView;

public class SCActivity extends Activity {

private TextView mRecvText = null;

private EditText mSentText = null;

private Button mSendRecvButton = null;

private Socket mSocket = null;

/ Called when the activity is first created /

@Override

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

mRecvText = (TextView)findViewById(RidrecvText);

mSentText = (EditText)findViewById(RidsentText);

mSendRecvButton = (Button)findViewById(RidsendRecvButton);

mSendRecvButtonsetOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

String sentMessage = mSentTextgetText()toString() + "\r\n";

try {

mSocket = new Socket("1012638155", 12577);

Logi("------SCActivity---before send---", sentMessage);

PrintWriter send = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocketgetOutputStream())));

sendprintln(sentMessage);

sendflush(); //Important!!!!!!

//sendwrite(sentMessage);

Logi("------SCActivity---after send---", sentMessage);

BufferedReader recv = new BufferedReader(new InputStreamReader(mSocketgetInputStream()));

Logi("------SCActivity---Before ---recvreadLine()---", sentMessage);

String recvMsg = recvreadLine();

Logi("------SCActivity---after ---recvreadLine()---", recvMsg);

if (recvMsg != null) {

mRecvTextsetText(recvMsg);

} else {

mRecvTextsetText("Cannot receive data correctly");

}

sendclose();

recvclose();

mSocketclose();

} catch (Exception ex) {

exprintStackTrace();

}

}

});

}

服务器端代码:

import javaioBufferedReader;

import javaioBufferedWriter;

import javaioInputStreamReader;

import javaioOutputStreamWriter;

import javaioPrintWriter;

import javanetServerSocket;

import javanetSocket;

public class Server implements Runnable {

public void run() {

try {

ServerSocket serverSocket = new ServerSocket(12577);

while (true) {

Socket client = serverSocketaccept();

Systemoutprintln("accept");

try {

BufferedReader in = new BufferedReader(new InputStreamReader(clientgetInputStream()));

String str = inreadLine();

Systemoutprintln("read:" + str);

PrintWriter pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(clientgetOutputStream())), true);

//poutwrite("Server Received Message: " + str);

poutprintln("Server Received Message: " + str);

Systemoutprintln("after send in server");

/ BufferedReader in = new BufferedReader(new InputStreamReader(clientgetInputStream()));

String str = inreadLine();

Systemoutprintln("read:" + str);/

poutclose();

inclose();

} catch (Exception e) {

Systemoutprintln(egetMessage());

eprintStackTrace();

} finally {

clientclose();

Systemoutprintln("close");

}

}

} catch (Exception e) {

Systemoutprintln(egetMessage());

}

}

public static void main(String argv[] ) {

Thread pcServerThread = new Thread(new Server());

pcServerThreadstart();

}

}

android里面,通过json数据是不会直接返回的,只会返回的url地址。

步骤: 1,通过解析json数据,获取到的地址。

2,通过的地址,再一次的请求网络(用异步任务或者hangdler里面请求网络:比如:

URL url = new URL(urlStr);

HttpURLConnection conn = (HttpURLConnection) urlopenConnection();

BufferedInputStream is = new BufferedInputStream(conngetInputStream());

3 通过BitmapFactorydecodeStream(里面的参数是一个字节流),该方法返回的是一个bitmap ,直接用imageviewsetimagebitmap()就能展示了。

说明: 在BitmapFactorydecodeStream这里返回的bitmap可以做进一步的优化,比如二次采样,把获取的bitmap存sd卡等等。。

android手机端用http通信的机制来访问服务器端的SERVLET程序。客户端发送数据 比如书得编号 SERVLET接收并响应 调用JDBC的增删改查方法 并获得数据 返回客户端 其实我也不知道在说什么 因为这个东西不是几句话就能说得清楚地 呵呵

这种错误可能有几种情况:

1,你链接服务端的代码可能有问题;

2,看看你手机和电脑是否在同一局域网下;

3,看看代码的URL 的地址是否争取(IP地址是否和电脑的Ip相同);

4,看看的服务器是否启动;

5,手机可能有问题(红米1s在调试android程序时就会出现这种情况,)

解决办法:

1,查看是否有以上错误,有则改之,

2,换台手机试试,

3,用模拟器代替真机测试一下

android读取数据库可以使用sqlite一些api进行读取,实例如下:

  / 

      查找一条数据 

      @param uid 

     /  

    public User find(Integer uid){  

        SQLiteDatabase db=dbOpenHelpergetReadableDatabase();  //创建数据库辅助类

        Cursor cursor =dbrawQuery("select  from user where uid=", new String[]{uidtoString()});  //创建一个游标

        if(cursormoveToFirst()){  //循环遍历查找数组

            int uid2=cursorgetInt(cursorgetColumnIndex("uid"));  

            String uname=cursorgetString(cursorgetColumnIndex("uname"));  

            String uaddress=cursorgetString(cursorgetColumnIndex("uaddress"));  

            User user=new User();  

            usersetUid(uid2);  

            usersetUname(uname);  

            usersetUaddress(uaddress);  

            return user;  

        }  

        cursorclose();  

        return null;  

    }

不能与数据库连接的

Android客户端不能直接与服务器数据库连接。数据库是需要非常大的内存,安装之后有好几G,连接数据库要有一个像SQLServer里的webservice,这样的一个桥梁来间接访问。就是在服务器运行一个服务端程序,该服务端程序通过接收来自android客户端的指令,对数据库进行操作。

客户端的http请求可以通过 HttpClient类实现,在anddroid 40之后,客户端的网络请求已经不被允许在主线程中运行,所以还需注意另开启一个子线程进行网络请求。

扩展资料:

Android安全权限机制:

Android默认设置下,所有应用都没有权限对其他应用、系统或用户进行较大影响的操作。这其中包括读写用户隐私数据(联系人或电子邮件),读写其他应用文件,访问网络或阻止设备待机等。安装应用时,在检查程序签名提及的权限,且经过用户确认后,软件包安装器会给予应用权限。

下载一款Android应用通常会要求如下的权限:拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、

还有对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄等。

——Android

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 安卓开发 监听端口,获取服务器发送过来的数据。

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情