android x86模拟器和PC相互通信(socket)
Android手机通过socket与pc通信

Android手机通过socket与pc通信Android手机通过socket与pc通信标签:androidsocket手机layoutbuttonstring2012-07-12 23:3017312人阅读评论(30)收藏举报分类:Android(9)版权声明:本文为博主原创文章,未经博主允许不得转载。
在Android中可以直接利用java中的Socket与ServerSocket构建socket通信。
代码的运行环境:pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。
Android手机客户端:android2.3设备。
代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。
pc端代码:[java] view plaincopypackage test; importjava.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import .ServerSocket; import .Socket;public class Test implements Runnable{ /** * @param args */ int max=10; //最大开启线程数int i=0; //回复数字int temp; ServerSocket serverSocket; Socket socket[]; public Test(){ try{ serverSocket=new ServerSocket(5648); //在5648端口进行侦听} catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace(); System.out.println("can't initate ServerSocket!"); return; } socket=new Socket[max];System.out.println("waiting for connect"); try{ while((socket[i]=serverSocket.accept())!=null ){ temp=i; i++; new Thread(this).start(); //每侦听到一个客户端的连接,就会开启一个工作线程} } catch (IOException e) { // TODO Auto-generatedcatch blocke.printStackTrace(); } } public static void main(String[] args) { new Test(); }@Override public void run() { Socketsk=socket[temp];System.out.println("accept:"+sk.getInetAddress().getHostAddre ss()); InputStream is=null; OutputStream os=null; BufferedReader br=null;PrintWriter pw=null; try{ is=sk.getInputStream();os=sk.getOutputStream(); br=new BufferedReader(new InputStreamReader(is));pw=new PrintWriter(os); } catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace(); try{ sk.close(); } catch (IOException e1) { // TODOAuto-generated catch blocke1.printStackTrace(); }return; } String str; try{ int m=0;while((str=br.readLine())!=null){ System.out.println(str); pw.println(m);pw.flush();m++; } } catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace(); } } } android设备客户端代码:MainActivity.java代码:[java] view plaincopypackage com.tobacco.phonetest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import .Socket; import.UnknownHostException; importandroid.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; importandroid.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implementsOnClickListener,Runnable{ private Button button; private EditText editText; private Socket socket;private PrintWriter pw; private BufferedReader br;private Handler handler; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(yout.activity_main);handler=new Handler();button=(Button)findViewById(R.id.button);button.setOnClickListener(this);editText=(EditText)findViewById(R.id.edittext); try { socket=newSocket("",5648); //连接到的5648端口[java] viewplaincopy<span style="white-space:pre"></span>//是我申请的域名} catch (UnknownHostException e){ // TODO Auto-generated catch blocke.printStackTrace(); Log.e("socket","unknown host"); } catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace(); Log.e("socket","io execption"); }if(socket==null){ Log.e("socket","null");} else try{ pw=newPrintWriter(socket.getOutputStream()); br=new BufferedReader(newInputStreamReader(socket.getInputStream()));if(pw!=null&&br!=null){ new Thread(this).start(); } } catch (IOException e) { // TODO Auto-generated catch blocke.printStackTrace(); } } @Override public boolean onCreateOptionsMenu(Menu menu){ getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public void onClick(View view){ if(view==button){ String str;str=editText.getText().toString(); pw.println(str); pw.flush(); } } public void run() { try{ String str;while((str=br.readLine())!=null){ final String s=str; handler.post(newRunnable(){ public void run(){ Toast.makeText(MainActivity.this, s,Toast.LENGTH_LONG).show();}});} } catch (IOException e){ // TODO Auto-generated catch blocke.printStackTrace(); } }}activity_main.xml代码:[html] view plaincopy<LinearLayoutxmlns:android="/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" > <TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /><EditText android:id="@+id/edittext" android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="@string/message" /> <Button android:id="@+id/button"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello_world" /></LinearLayout>因为此客户端程序要用到网络,所以要在manifest文件中添加权限。
Android 模拟器 PC电脑通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。
要想实现PC电脑和Android模拟器系统以及Android模拟器之间相互通信必须借助端口重定向(redir)来实现。
先说说端口重定向所需要的telnet客户端安装:windows:安装telnet客户端。
如果没有安装,可以在windows程序管理中的打开或关闭系统功能下找到telnet客户端菜单项来启用telnet客户端功能。
linux:自行安装telnet客户端。
一、PC电脑不能直接访问Android模拟器系统的原因Android系统为实现通信将PC电脑IP设置为10.0.2.2,自身为10.0.2.15/127.0.0.1。
然而PC电脑并没有为Android模拟器系统指定IP,所以PC只能通过端口重定向来实现和Android模拟器的通信。
二、PC电脑和Android模拟器系统之间通信1、运行模拟器2、打开window 命令行,执行:[html]view plaincopy1.telnet localhost 55545554是模拟器的端口(位于Android模拟器窗口标题栏),执行之后会进入android console3、在console下执行:[html]view plaincopy1.格式:redir add <udp/tcp >:<pc端口>:<模拟器端口>2.例如:redir add udp:2888:28883. redir add tcp:2888:2888执行此命令之后,会把PC 2888 端口接收到的tcp/udp数据转到模拟器的2888端口。
三、多个Android模拟器系统之间通信1、启动模拟器emulator-5554和emulator-55562、打开dos窗口执行telnet localhost 5554连接到模拟器55543、成功连接后,继续执行:redir add tcp:5000:6000将PC端口5000绑定到模拟器5554的端口6000上。
android在wifi下手机与电脑的socket通信

android在wifi下手机与电脑的socket通信在wifi局域网下,手机可以和电脑通过socket通信。
手机做服务端,电脑做客户端;也可以反过来,电脑做服务端,手机做客户端。
下面介绍的是手机作为服务端,电脑使用MFC编程作为客户端,原理是,手机建立一个ServerSocket,并获取自己的ip地址和端口port;然后电脑通过socket连接手机的ip:port。
核心代码如下:代码下载地址:/detail/menghnhhuan/4050488 作者博客:/menghnhhuan手机建立socketServer代码[html]view plaincopyprint?1.private ServerSocket serverSocket = null;2.private Runnable mcreateRunnable = new Runnable()3.{4.public void run()5.{6.try {7.serverSocket = new ServerSocket(0);//系统分配端口8.getLocalIpAddress();//获得手机的ip地址9.//方法用于等待客服连接10.mSocketServer = serverSocket.accept();11.//接受客服端数据BufferedReader对象12.mBufferedReaderServer = new BufferedReader(new In putStreamReader(mSocketServer.getInputStream()));13.//给客服端发送数据14.mPrintWriterServer = new PrintWriter(mSocketServer. getOutputStream(),true);15.16.} catch (IOException e) {17.// TODO Auto-generated catch block18. e.printStackTrace();19.}20.}21.};手机上获取的ip地址代码[html]view plaincopyprint?1.public String getLocalIpAddress()2.{3.try {4.for (Enumeration<NetworkInterface> en=NetworkInterfa ce.getNetworkInterfaces(); en.hasMoreElements();)5.{workInterface intf = en.nextElement();7.for (Enumeration<InetAddress> enumIpAddr=intf.getInet Addresses();enumIpAddr.hasMoreElements();)8.{9.InetAddress inetAddress = enumIpAddr.nextElement();10.//if (!inetAddress.isLoopbackAddress())11.{12.//if(inetAddress.isSiteLocalAddress())13.{14.String ip = "请连接IP:"+inetAddress.getHostAddress()+":"15.+ serverSocket.getLocalPort()+ "\n";16.}17.}18.}19.}20.}21.catch (SocketException ex) {22.ex.printStackTrace(); }23.}电脑上使用的是MFC编程,socket代码如下[html]view plaincopyprint?1.DWORD clientThreadID;2.SOCKET clientSock;3.char server_address[50] = {0};4.char recv_message_client[256] = {0};5.struct sockaddr_in server_ip;6.BOOL clientThreadRun = false;7.//client8.BOOL InItClientSock()9.{10.//Define Variable11.WORD wVersionrequested;12.WSADATA wsaData;13.14.wVersionrequested = MAKEWORD(2,0);15.16.//Start Sock17.int err = WSAStartup(wVersionrequested,&wsaData);18.if (err == -1)19.{20.MessageBox(0,"WSAStartup err", "error",MB_OK);21.return FALSE;22.}23.return TRUE;24.}25.BOOL ConnectSock()26.{27.SOCKET clientSockConnect;28.u_short port;29.30.//Ini Sock31.clientSock = socket(AF_INET,SOCK_STREAM,0);32.if (ServerSock < 0)33.{34.MessageBox(0,"scoker err",35."err",MB_OK);36.return FALSE;37.}38.39.char *strPort = strstr(server_address, ":");40.41.if( (strPort!=NULL) && (strlen(strPort)>2) )42.{43.port = atoi(strPort+1);44.if(port==0)45.{46.MessageBox(0, "IP端口不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);47.return FALSE;48.}49.memset(strPort, 0, sizeof(strPort));50.}51.else52.{53.MessageBox(0, "IP地址不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);54.return FALSE;55.}56.57.//Connect58.server_ip.sin_family = AF_INET;59.server_ip.sin_port = ((port&0xff00)>>8)|((port&0x00ff )<<8);60.server_ip.sin_addr.S_un.S_addr = inet_addr(server_add ress);61.62.clientSockConnect = connect(clientSock,(struct socka ddr*)&server_ip,sizeof(server_ip));63.if (clientSockConnect!=0)64.{65.CString temp;66.temp.Format("系统拒绝连接,可能是输入IP地址或端口不对:\n%s:%d", server_address, server_ip.sin_port);67.SetDlgItemT ext( FindWindow(NULL, WINDOWNHAND LERNAME), IDC_STATIC_IP, temp);68.MessageBox(0, "系统拒绝连接,可能是输入IP地址或端口不对 ", "提示", MB_OK);69.return FALSE;70.}71.return TRUE;72.}73.74.DWORD WINAPI clientThreadFunc(LPVOID threadNu m)75.{76.int length;77.CString temp;78.79.if(!InItClientSock())80.return 0;81.if(!ConnectSock())82.return 0;83.84.//等待连接的时候,连接可能被取消。
android socket通信

android socket通信(上)今天我们介绍android下的socket通信,并编写一个小程序:android 作为客户端,通过socket发送数据到我们的pc机,pc机就是服务器。
分两个实验完成:我们先在模拟器上实现,然后在真实的手机上实现。
1.设置环境,两个实验均在ubuntu11.04下完成:第一个实验是android模拟器作为客户端,第二个实验是真实的android手机作为客户端,两个实验的服务器都是我们的pc机,并且服务器端用c++实现,客户端用java实现:第一个实验的ip配置:主机eth0:192.168.1.2pc服务器端口:9400第二个实验的ip配置:主机lwan0:192.168.1.100pc服务器端口:9500注意,第一个实验是android模拟器作为客户端,因此要设置主机的eth0的ip地址,而第二个实验是真实的android手机作为客户端,它和pc机(服务器)在一个无线路由器局域网里,因此我们要设置主机的lwan的ip地址,不过由于主机和真实手机的ip都是路由器dhcp自动分配的,因此无需额外的配置命令,你可以改成你自己的ip地址。
第一个实验的配置命令很简单:sudo ifconfig eth0 192.168.1.2首先介绍第一个实验:由于模拟器的特殊性,因此我们需要将模拟器的端口映射到主机的某个端口,这样才可以和模拟器相互通信。
1.端口映射:在android sdk的platform-tools下有一个adb可执行程序,我的路径是android-sdk-linux_x86/platform-tools/adb,运行如下命令进行端口映射:cd android-sdk-linux_x86/platform-tools./adb forward tcp:9400 tcp:9400上面命令的意思是将模拟器的9400端口映射到主机的9400端口,这样模拟器向192.168.1.2:9400发送的数据就会被映射到主机的9400端口(主机的ip地址是192.168.1.2),而我们的主机只要监听本地的9400端口即可。
本机两个Android模拟器之间的网络通信

【本机(PC)IP以及Android模拟器IP的说明】在本机上启动两个模拟器,本机(PC)和模拟器的信息如下:大家可以看到,两个模拟器的IP地址都是完全一样的,所以要实现两个模拟器之间的通信,使用模拟器的IP地址是办不到的。
获取模拟器名称:>adb devicesList of devices attachedemulator-5554 deviceemulator-5556 device模拟器提供了一个特殊的IP,此IP的地址为10.0.2.2,此IP地址可以说等同于PC本机的IP 地址127.0.0.1 。
所以,通过此特殊IP地址,实现PC本机与模拟器的通信是没有问题。
【PC-SERVER / 模拟器-CLIENT】目的:通过7100端口跟服务器进行通信。
实施方法比较简单,直接按照下面的方法就可以了。
方法1:PC-SERVER:ServerSocket server = new ServerSocket(7100);模拟器-CLIENT:Socket socket = new Socket("192.168.1.3", 7100);方法2:PC-SERVER:ServerSocket server = new ServerSocket(7100);模拟器-CLIENT:Socket socket = new Socket("10.0.2.2", 7100);【模拟器-SERVER / PC-CLIENT】目的:连接到服务器的7100端口。
实施操作稍微复杂一些,不能按照前面的方法来进行。
要达到此目的,先要进行端口映射。
把本机端口TCP/6100映射到模拟器TCP/7100端口(UDP也是一样)。
>adb –s emulator-5554 forward tcp:6100 tcp:7100端口映射成功后,再进行下面的实验。
方法1(正确):模拟器-SERVER:ServerSocket server = new ServerSocket(7100);PC-CLIENT:Socket socket = new Socket("127.0.0.1", 6100);方法2(错误):模拟器-SERVER:ServerSocket server = new ServerSocket(7100);PC-CLIENT:Socket socket = new Socket("192.168.1.3", 6100);错误原因是127.0.0.1是本机环路IP,跟本机IP没有映射关系,所以发送到本机IP的连接请求,无法映射到127.0.0.1的环路IP上。
Android的Socket通信

五、Socket 通信实例............................................................................6 六、Socket 通信过程中的常见问题及解决方案.............................8
1
引
言
Байду номын сангаас
随着 CES2012 在拉斯维加斯的落幕,我们可以清楚的看到,移动互联网决定着全 球移动市场的发展趋势,它将像 PC 机改变我们以前的生活一样,改变我们未来的生 活。移动互联的实现需要确保数据的可靠和有效传输。因此,数据通信是开发设计过 程中必不可少的一个重要环节。 在上一期指南中,我们介绍了如何利用控件来布局应用的 UI 界面,好的界面设 计是吸引用户的第一步,当然,这还远远不够,高效的数据传输,流畅的界面跳转, 才是高品质用户体验的最终归属。下面,我们来介绍 Android 与服务器的网络通信。 通信通常包含两个部分,一是应用程序的内部通信,一是客户端和服务器之间的网络 通信,本期指南我们主要介绍 Android 客户端与服务器之间的网络通信。
5
InetAddress serverAddress = InetAddress.getByName("192.168.1.104"); String str = "hello"; //这是要传输的数据 //把传输内容分解成字节 byte data [] = str.getBytes();
1.1 什么是 Socket
Socket 是一种抽象层,应用程序通过它来发送和接收数据,使用 Socket 可以将 应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说, Socket 提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。
Android Socket远程控制pc端数据通讯程序设计MFC+Socket+Android

二、 设计准备工作
本程序涉及到 Android,Java,C++,SQL Server 等。需要使用的编程工具包括 Visual Studio2012,eclipse+ADT,SQL Server2012。其中 vs2012 和 SQL Server2012 很容易安装,这 里主要讲解下 Android ADT 的安装。
Windows Sockets DLL,只有此函数调用成功后,应用程序才可以再调用其他 Windows Sockets DLL 中的 API 函数.
在程序中调用该函数的形式如下:WSAStartup((WORD)((1<<8|1),(LPWSADATA)&WSAData), 其中(1<<8|1)表示用的是 WinSocket1.1 版本,WSAata 用来存储系统传回的关于 WinSocket 的资料。
同样,读出输出流里面的东西,需要:
mBufferedReaderClient.read(recBuffer); //将输出流里面的东西存储到 recbuffer 中
String tempString=new String(recBuffer); //格式化成字符串
Android客户端与PC服务器实现Socket通信(wifi)

Android客户端与PC服务器实现Socket通信(wifi)本文介绍Android终端持续扫描AP信息并发送给服务器端的实现。
首先基于TCP协议在Android终端和PC两端之间形成网络虚拟链路。
使用ServerSocket创建TCP服务器端,然后在Android客户端使用Socket的构造器来连接服务器。
其中Android终端通过WIFI连接和PC处于同一局域网。
1. PC服务器启用ServerSocket两个通信实体在建立虚拟链路之前,需要有一方先准备好,主动接受来自其他通信实体的连接请求。
使用ServerSocket对象监听来自客户端的Socket连接//创建ServerSocket对象ServerSocket ss = new ServerSocket(30000);//监听来自客户端的请求while(true){Socket s = ss.accept();…}如果没有连接,则将一直处于等待状态。
当接收到连接请求后,获取消息到输入流,并保存到文件。
//接收客户端消息BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String str;BufferedWriter bw = new BufferedWriter(new FileWriter("D:/ApInfo"+ (i++) +".txt"));while ((str = in.readLine()) != null) {System.out.println(str);bw.write(str);bw.newLine();}2. Android终端使用Socket通信客户端使用Socket的构造器连接服务器,指定服务器IP和端口号就可以了。
Socket s = new Socket(“192.168.1.100”, 30000);这样服务器端的accept()方法就得到响应,从而向下执行,服务器端和客户端就形成了一对互相连接的Socket。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
android 模拟器和PC相互通信(IP +端口+ socket) 实现方法:android socket
①服务程序运行在PC端
②客户端程序运行在android模拟器
实现形式:由android 模拟器向服务程序发出消息,然后服务程序会送消息至模拟器。
注意要点:
一、服务程序在PC端,需要指定电脑的端口,以提供数据访问的渠道。
二、客户端程序需要同样的端口以及PC的ip地址进行socket联络
三、数据通信用进程方式实现,可以支持多个客户端访问
四、代码层面:
1、AndroidManifest.xml需要添加
<uses-permission android:name="android.permission.INTERNET" />以提供网络访问权限支持
2、部分模拟器版本和android-SDK版本不匹配,此时去掉AndroidManifest.xml中的
<uses-sdk android:minSdkVersion="15" />就不会报错。
3、PC的IP为实际上外网的IP,即,IPV4。
通过命令行cmd,ipconfig查询即可。
代码:
服务端:Java项目,运行于PC:
Package:com.android.server
name:ServerThread
客户端:android项目,运行于android模拟器
package :com.android.client
name:MyClientActivity
代码:
服务程序代码:
package com.android.server;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import .ServerSocket;
import .Socket;
public class PCServer {
public static void main(String a[]) {
new ServerThread(5554).start();
}
}
class ServerThread extends Thread {
private int Port;
private ServerSocket serversocket = null;
private Socket client;
ServerThread(int port) {
Port = port;
}
public void run() {
try {
serversocket = new ServerSocket(Port);
while (true) {
client = serversocket.accept();
System.out.println("server accept");
try {
// 接收客户端消息
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("read:" + str);
// 向服务器发送消息
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())),
true);
out.println("MSG from server:Your message(" + str + ")has been successfully sent!");
// 关闭输入输出流
out.close();
in.close();
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
} finally {
// 关闭客户端
client.close();
System.out.println("server close");
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
客户端程序代码:
package com.android.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import .Socket;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditT ext;
import android.widget.T extView;
public class MyClientActivity extends Activity {
private final String DEBUG_TAG = "Activity01";
private static String IpAddress = "10.141.31.85";
private static int Port = 5554;
private TextView mTextView = null;
private EditText mEditT ext = null;
private Button mButton = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yout.main);
mButton = (Button) findViewById(R.id.Button01);
mTextView = (TextView) findViewById(R.id.TextView01);
mEditText = (EditText) findViewById(R.id.EditText01);
// 登陆
mButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
sendMsg();
}
});
}
public void sendMsg() {
Socket socket = null;
String message = mEditText.getText().toString() + "\r\n";
try {
socket = new Socket(IpAddress, Port); // 创建Socket
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out.println(message); // 向服务器发送消息
String msg = in.readLine(); // 接收来自服务器的消息
if (msg != null)
mTextView.setT ext(msg);
else
mTextView.setT ext("数据错误!");
// 关闭流
out.close();
in.close();
// 关闭Socket
socket.close();
} catch (Exception e) {
// TODO: handle exception
Log.e(DEBUG_TAG, e.toString());
}
}
}。