1. android socket 接收服务器返回数据,如何查找想要的数值
Android 客户端代码:
package com.ltb.SCActivity;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
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) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mRecvText = (TextView)findViewById(R.id.recvText);
mSentText = (EditText)findViewById(R.id.sentText);
mSendRecvButton = (Button)findViewById(R.id.sendRecvButton);
mSendRecvButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String sentMessage = mSentText.getText().toString() + "\r\n";
try {
mSocket = new Socket("10.126.38.155", 12577);
Log.i("------SCActivity---before send---", sentMessage);
PrintWriter send = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())));
send.println(sentMessage);
send.flush(); //Important!!!!!!
//send.write(sentMessage);
Log.i("------SCActivity---after send---", sentMessage);
BufferedReader recv = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
Log.i("------SCActivity---Before ---recv.readLine()---", sentMessage);
String recvMsg = recv.readLine();
Log.i("------SCActivity---after ---recv.readLine()---", recvMsg);
if (recvMsg != null) {
mRecvText.setText(recvMsg);
} else {
mRecvText.setText("Cannot receive data correctly.");
}
send.close();
recv.close();
mSocket.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}
服务器端代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server implements Runnable {
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(12577);
while (true) {
Socket client = serverSocket.accept();
System.out.println("accept");
try {
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("read:" + str);
PrintWriter pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
//pout.write("Server Received Message: " + str);
pout.println("Server Received Message: " + str);
System.out.println("after send in server");
/* BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("read:" + str);*/
pout.close();
in.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
client.close();
System.out.println("close");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void main(String argv[] ) {
Thread pcServerThread = new Thread(new Server());
pcServerThread.start();
}
}
2. android socket通信怎么处理客户端发来的消息
1、建立Socket(Tcp)连接
在Java中建立Socket连接是相当容易的事情,使用类库提供的Socket类就可以实现。
Socketclient=null;//表示客户端client=newSocket("localhost",5000);
2、发送数据
PrintStreamout=newPrintStream(socket.getOutputStream());//发送数据,PrintStream最方便
3、接收返回信息
buf=newBufferedReader(newInputStreamReader(socket.getInputStream()));;//一次性接收完成读取Socket的输入流,在其中读出返回信息
4、关闭Socket
Socket.close();
三、补充:
Socketsever端(非多线程实现)
ServerSocketserver=null;//定义ServerSocket类
Socketclient=null;//表示客户端
PrintStreamout=null;//打印流输出最方便
server=newServerSocket(8888);//服务器在8888端口上监听
System.out.println("服务器运行,等待客户端连接。");
client=server.accept();//得到连接,程序进入到阻塞状态
Stringstr="helloworld";//表示要输出的信息
out=newPrintStream(client.getOutputStream());out.println(str);//向客户端输出信息client.close();server.close();
3. android socket有几种方法
/***第一种:客户端Socket通过构造方法连接服务器***/
//客户端Socket可以通过指定IP地址或域名两种方式来连接服务器端,实际最终都是通过IP地址来连接服务器
//新建一个Socket,指定其IP地址及端口号
Socket socket = new Socket("192.168.0.7",80);
/***Socket 客户端 一些常用设置***/
//客户端socket在接收数据时,有两种超时:1.连接服务器超时,即连接超时;2.连接服务器成功后,接收服务器数据超时,即接收超时
//*设置socket 读取数据流的超时时间
socket.setSoTimeout(5000);
//发送数据包,默认为false,即客户端发送数据采用Nagle算法;
//但是对于实时交互性高的程序,建议其改为true,即关闭Nagle算法,客户端每发送一次数据,无论数据包大小都会将这些数据发送出去
socket.setTcpNoDelay(true);
//设置客户端socket关闭时,close()方法起作用时延迟1分钟关闭,如果1分钟内尽量将未发送的数据包发送出去
socket.setSoLinger(true, 60);
//设置输出流的发送缓冲区大小,默认是8KB,即8096字节
socket.setSendBufferSize(8096);
//设置输入流的接收缓冲区大小,默认是8KB,即8096字节
socket.setReceiveBufferSize(8096);
//作用:每隔一段时间检查服务器是否处于活动状态,如果服务器端长时间没响应,自动关闭客户端socket
//防止服务器端无效时,客户端长时间处于连接状态
socket.setKeepAlive(true);
/*** Socket客户端向服务器端发送数据 ****/
//客户端向服务器端发送数据,获取客户端向服务器端输出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//代表可以立即向服务器端发送单字节数据
socket.setOOBInline(true);
//数据不经过输出缓冲区,立即发送
socket.sendUrgentData(65);//"A"
//向服务器端写数据,写入一个缓冲区
//注:此处字符串最后必须包含“\r\n\r\n”,告诉服务器HTTP头已经结束,可以处理数据,否则会造成下面的读取数据出现阻塞
//在write()方法中可以定义规则,与后台匹配来识别相应的功能,例如登录Login()方法,可以写为write("Login|test,123 \r\n\r\n"),供后台识别;
bw.write("Login|test,123 \r\n\r\n");
//发送缓冲区中数据,必须有
bw.flush();
/*** Socket客户端读取服务器端响应数据 ****/
//socket.isConnected代表是否连接成功过
if((socket.isConnected() == true) && (socket.isClosed() == false)){//判断Socket是否处于连接状态
//客户端接收服务器端的响应,读取服务器端向客户端的输入流
InputStream is = socket.getInputStream();
//缓冲区
byte[] buffer = new byte[is.available()];
//读取缓冲区
is.read(buffer);
//转换为字符串
String responseInfo = new String(buffer);
//日志中输出
Log.i("TEST", responseInfo);
} //关闭网络
socket.close();
/***第二种:通过connect方法连接服务器***/
Socket socket_other = new Socket();
//使用默认的连接超时
socket_other.connect(new InetSocketAddress("192.168.0.7",80));
//连接超时2s
socket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);
//关闭socket
socket_other.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
4. Android socket 获得16进制数据
mDataOutputClient = new DataOutputStream(mSocketClient.getOutputStream());
//发送
mDataOutputClient.write(0XFF);
mDataOutputClient.flush();
//接收
DataInputStream dis = new DataInputStream(mSocketClient.getInputStream());
int r=dis.readInt(); //接收int
接收十六进制。==> byte r=dis.readByte();
发送十六进制。==> byte r= (byte) 0xFF; dos.writeByte(r);
BufferedReader不推荐使用,因为不适合。
5. Android socket通信能发数据但不能接收到数据
我C#项目中做过同样的Android移动Socket通信。
Android客户端:
SocketClient对象receive函数就调用读取函数,当然之前是打开了Socket连接。
publicStringreceive()throwsIOException{
BufferedReaderreader=newBufferedReader(
newInputStreamReader(client.getInputStream()));
Stringtxt=reader.readLine();
returntxt;
}
Activity页面使用任务不间断监听接收。
<Void,Void,Void>{
@Override
protectedVoiddoInBackground(Void...arg0){
SocketClientclient=SocketClient.getInstance();
while(true)
{
try{
Thread.sleep(5000);
Stringre=client.receive();
if(re==null||(re!=null&&re.equals(""))){
continue;
}
if(isCancelled())
returnnull;
//TODO:处理接收到消息
}catch(SocketExceptione){
//服务端断开,启动重连任务
if(e.getMessage().contains("ECONNRESET")){
reconnectTask=newReconnectServerTask();
reconnectTask.execute((Void)null);
}
returnnull;
}catch(IOExceptione){
e.printStackTrace();
}catch(InterruptedExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
6. 如何用socket实现android手机与手机之间的通信
参考一般的JAVA的socket编程,如果通过手机网络,就不要使用UDP即可。
7. 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。