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。
基于android的Socket通信
基于android的Socket通信⼀、Socket通信简介Android与服务器的通信⽅式主要有两种,⼀是Http通信,⼀是Socket通信。
两者的最⼤差异在于,http连接使⽤的是“请求—响应⽅式”,即在请求时建⽴连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。
⽽Socket通信则是在双⽅建⽴起连接后就可以直接进⾏数据的传输,在连接时可实现信息的主动推送,⽽不需要每次由客户端想服务器发送请求。
那么,什么是socket?Socket⼜称套接字,在程序内部提供了与外界通信的端⼝,即端⼝通信。
通过建⽴socket连接,可为通信双⽅的数据传输传提供通道。
socket的主要特点有数据丢失率低,使⽤简单且易于移植。
1.1什么是Socket Socket是⼀种抽象层,应⽤程序通过它来发送和接收数据,使⽤Socket可以将应⽤程序添加到⽹络中,与处于同⼀⽹络中的其他应⽤程序进⾏通信。
简单来说,Socket提供了程序内部与外界通信的端⼝并为通信双⽅的提供了数据传输通道。
1.2Socket的分类根据不同的的底层协议,Socket的实现是多样化的。
本指南中只介绍TCP/IP协议族的内容,在这个协议族当中主要的Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。
流套接字将TCP作为其端对端协议,提供了⼀个可信赖的字节流服务。
数据报套接字使⽤UDP协议,提供数据打包发送服务。
下⾯,我们来认识⼀下这两种Socket类型的基本实现模型。
⼆、Socket 基本通信模型三、Socket基本实现原理3.1基于TCP协议的Socket服务器端⾸先声明⼀个ServerSocket对象并且指定端⼝号,然后调⽤Serversocket的accept()⽅法接收客户端的数据。
accept()⽅法在没有数据进⾏接收的处于堵塞状态。
(Socketsocket=serversocket.accept()),⼀旦接收到数据,通过inputstream读取接收的数据。
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文件中添加权限。
PC客户端与Android服务端的Socket同步通信
PC客户端与Android服务端的Socket同步通信需求:1.一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client 端发来的命令,来处理数据后,把结果发给PC client2.PC端程序,作为socket的客户端,用于给android手机端发操作命令难点分析:1.手机一定要有adb模式,即插上USB线时马上提示的对话框选adb。
好多对手机的操作都可以用adb直接作。
不过,我发现LG GW880就没有,要去下载个2.android默认手机端的IP为“127.0.0.1”3.要想联通PC与android手机的sokcet,一定要用adb forward 来作下端口转发才能连上socket.view plaincopy to clipboardprint?Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");Thread.sleep(3000);Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086");Thread.sleep(3000);4.android端的service程序Install到手机上容易,但是还要有方法来从PC的client 端来启动手机上的service ,这个办法可以通过PC端adb命令来发一个Broastcast ,手机端再写个接收BroastcastReceive来接收这个Broastcast,在这个BroastcastReceive来启动servicepc端命令:view plaincopy to clipboardprint?Runtime.getRuntime().exec("adb shell am broadcast -a NotifyServiceStart");Runtime.getRuntime().exec("adb shell am broadcast -a NotifyServiceStart");android端的代码:ServiceBroadcastReceiver.javaview plaincopy to clipboardprint?package com.otheri.service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class ServiceBroadcastReceiver extends BroadcastReceiver {private static String START_ACTION = "NotifyServiceStart";private static String STOP_ACTION = "NotifyServiceStop";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive");String action = intent.getAction();if (START_ACTION.equalsIgnoreCase(action)) {context.startService(new Intent(context, androidService.class));Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive start end");} else if (STOP_ACTION.equalsIgnoreCase(action)) {context.stopService(new Intent(context, androidService.class));Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive stop end");}}}package com.otheri.service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class ServiceBroadcastReceiver extends BroadcastReceiver {private static String START_ACTION = "NotifyServiceStart";private static String STOP_ACTION = "NotifyServiceStop";@Overridepublic void onReceive(Context context, Intent intent) {Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive");String action = intent.getAction();if (START_ACTION.equalsIgnoreCase(action)) {context.startService(new Intent(context, androidService.class));Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive start end");} else if (STOP_ACTION.equalsIgnoreCase(action)) {context.stopService(new Intent(context, androidService.class));Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "ServiceBroadcastReceiver onReceive stop end");}}}5.由于是USB连接,所以socket就可以设计为一但连接就一直联通,即在new socket和开完out,in流后,就用个while(true){}来循环PC端和android端的读和写android的代码:view plaincopy to clipboardprint?public void run() {Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "a client has connected to server!");BufferedOutputStream out;BufferedInputStream in;try {/* PC端发来的数据msg */String currCMD = "";out = new BufferedOutputStream(client.getOutputStream());in = new BufferedInputStream(client.getInputStream());// testSocket();// 测试socket方法androidService.ioThreadFlag = true;while (androidService.ioThreadFlag) {try {if (!client.isConnected()) {break;}/* 接收PC发来的数据*/Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "will read......");/* 读操作命令*/currCMD = readCMDFromSocket(in);Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "**currCMD ==== " + currCMD);/* 根据命令分别处理数据*/if (currCMD.equals("1")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("2")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("3")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("4")) {/* 准备接收文件数据*/try {out.write("service receive OK".getBytes());out.flush();} catch (IOException e) {e.printStackTrace();}/* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据*/byte[] filelength = new byte[4];byte[] fileformat = new byte[4];byte[] filebytes = null;/* 从socket流中读取完整文件数据*/filebytes = receiveFileFromSocket(in, out, filelength,fileformat);// Log.v(Service139.TAG, "receive data =" + new// String(filebytes));try {/* 生成文件*/File file = FileHelper.newFile("R0013340.JPG");FileHelper.writeFile(file, filebytes, 0,filebytes.length);} catch (IOException e) {e.printStackTrace();}} else if (currCMD.equals("exit")) {}} catch (Exception e) {// try {// out.write("error".getBytes("utf-8"));// out.flush();// } catch (IOException e1) {// e1.printStackTrace();// }Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error111111");}}out.close();in.close();} catch (Exception e) {Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error222222");e.printStackTrace();} finally {try {if (client != null) {Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "client.close()");client.close();}} catch (IOException e) {Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error333333");e.printStackTrace();}}public void run() {Log.d(androidService.TAG, Thread.currentThread().getName() + "---->"+ "a client has connected to server!");BufferedOutputStream out;BufferedInputStream in;try {/* PC端发来的数据msg */String currCMD = "";out = new BufferedOutputStream(client.getOutputStream());in = new BufferedInputStream(client.getInputStream());// testSocket();// 测试socket方法androidService.ioThreadFlag = true;while (androidService.ioThreadFlag) {try {if (!client.isConnected()) {break;}/* 接收PC发来的数据*/Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "will read......");/* 读操作命令*/currCMD = readCMDFromSocket(in);Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "**currCMD ==== " + currCMD);/* 根据命令分别处理数据*/if (currCMD.equals("1")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("2")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("3")) {out.write("OK".getBytes());out.flush();} else if (currCMD.equals("4")) {/* 准备接收文件数据*/try {out.write("service receive OK".getBytes());out.flush();} catch (IOException e) {e.printStackTrace();}/* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据*/byte[] filelength = new byte[4];byte[] fileformat = new byte[4];byte[] filebytes = null;/* 从socket流中读取完整文件数据*/filebytes = receiveFileFromSocket(in, out, filelength,fileformat);// Log.v(Service139.TAG, "receive data =" + new// String(filebytes));try {/* 生成文件*/File file = FileHelper.newFile("R0013340.JPG");FileHelper.writeFile(file, filebytes, 0,filebytes.length);} catch (IOException e) {e.printStackTrace();}} else if (currCMD.equals("exit")) {}} catch (Exception e) {// try {// out.write("error".getBytes("utf-8"));// out.flush();// } catch (IOException e1) {// e1.printStackTrace();// }Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error111111");}}out.close();in.close();} catch (Exception e) {Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error222222");e.printStackTrace();} finally {try {if (client != null) {Log.v(androidService.TAG, Thread.currentThread().getName()+ "---->" + "client.close()");client.close();}} catch (IOException e) {Log.e(androidService.TAG, Thread.currentThread().getName()+ "---->" + "read write error333333");e.printStackTrace();}}6.如果是在PC端和android端的读写操作来while(true){}循环,这样socket流的结尾不好判断,不能用“-1”来判断,因为“-1”是只有在socket关闭时才作为判断结尾。
androidstudio中socket的用法
androidstudio中socket的用法在Android Studio中使用Socket是一种常见的方法来实现网络通信。
Socket 是一种能够在网络上进行通信的编程接口,它使得不同设备之间可以进行数据传输和接收。
Android Studio提供了Socket类和相关的网络API,使得我们能够轻松地实现Socket通信。
在Android Studio中使用Socket分为客户端和服务器端两个角色。
服务器端负责监听和接收来自客户端的连接请求,而客户端负责建立与服务器的连接并发送请求。
首先,我们需要创建一个服务器端的Socket。
可以通过创建一个Thread来监听来自客户端的连接请求。
以下是一个简单的服务器端代码示例:import java.io.IOException;import .ServerSocket;import .Socket;public class Server {private static final int PORT = 8080;public static void main(String[] args) {try {ServerSocket serverSocket = new ServerSocket(PORT);System.out.println("Server started...");while (true) {Socket clientSocket = serverSocket.accept();System.out.println("Client connected: " + clientSocket.getInetAddress());处理客户端请求的逻辑...}} catch (IOException e) {e.printStackTrace();}}}上述代码中,我们通过`ServerSocket`类创建一个服务器端的Socket,并指定监听的端口号为8080。
简述socket的基本概念和原理
一、Socket的基本概念Socket(套接字)是计算机网络中进程间通讯的一种方式。
它是应用层和传输层之间的接口,可用于在同一台计算机或不同计算机之间进行通讯。
在计算机网络中,Socket是这样一种抽象:它模拟了传统的插座,允许进程通过网络发送和接收数据。
1. 基本概念Socket是网络通讯中的一种机制,它允许一个应用程序发出通讯请求而不必了解网络的详细内部工作原理。
在计算机网络的通讯过程中,通常会涉及到两端的通讯,即客户端和服务器端。
而Socket就是客户端和服务器端进行通讯的一种方式。
2. 通讯过程通常来说,Socket通讯过程包括创建Socket对象、连接服务器、发送数据、接收数据以及关闭连接等步骤。
二、Socket的原理Socket的原理主要涉及到网络通讯过程中的一些核心概念和基本工作原理。
1. 套接字位置区域在网络通讯中,套接字位置区域用于标识网络上的通讯实体。
它由IP 位置区域和端口号组成,用于唯一标识一个通讯实体。
2. 通讯协议通讯协议是网络通讯中的一种规则,它定义了数据如何在网络上进行传输。
常见的通讯协议包括TCP、UDP等。
3. 通讯模式通讯模式是Socket通讯中的一种工作模式,包括面向连接的通讯和面向无连接的通讯。
4. 数据传输数据传输是Socket通讯中的核心环节,它包括数据的发送和接收两个步骤。
在数据传输过程中,需要考虑数据的可靠传输、数据的完整性以及数据的实时性等问题。
5. 套接字编程套接字编程是指在应用程序中使用Socket对网络进行编程操作。
开发者可以通过套接字编程实现自定义的网络通讯功能,从而实现各种复杂的网络应用。
三、总结Socket作为计算机网络中的重要通讯机制,在实际的网络应用中扮演着重要的角色。
了解Socket的基本概念和原理,有助于我们更好地理解网络通讯的工作原理,从而为开发更复杂、更稳定的网络应用奠定基础。
希望本文所述的内容能够帮助读者更深入地了解Socket,为日后的网络编程工作提供参考。
android模拟器与pc,模拟器与模拟之间用socket进行通信和获得模拟器ip地址程序
android模拟器与pc,模拟器与模拟之间用socket进行通信和获得模拟器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端口映射成功后,再进行下面的实验。
Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)根据前两周写的关于Socket编程的网络通信的代码,现在对有关知识和注意事项进行总结如下:1.首先说下Android NIO中有关Socket编程的类:1)ServerSocketChannel类:服务器套接字通道相当于传统IO下的ServerSocket,通过ServerSocketChannel的socket()可以获得传统的ServerSocket,反过来使用ServerSocket的getChannel()可以获得ServerSocketChannel对象;实例化ServerSocketChannel可以直接通过ServerSocketChannel的静态方法open()就可以了。
2)SocketChannel类:套接字通道相当于传统IO下的Socket,通过SocketChannel的socket()可以获得传统的Socket,反过来使用Socket的getChannel()可以获得SocketChannel对象;3)Selector选择器:在NIO中注册各种事件的方法主要使用Selector来实现的,我们可以使用Selector类的静态方法open()来实例化。
4)SelectionKey类:是个选择键,在NIO中选择器和选择键是很重要的,SelectionKey描述了NIO中比较重要的事件,如OP_ACCEPT、OP_READ、OP_WRITE。
2.然后说下非阻塞和阻塞模式的区别以及非阻塞模式的实现:1)非阻塞:所谓非阻塞就是说,服务器监听客户端连接的时候,如果没有客户连接,程序还接续执行,不会停在这里等待客户连接;或者客户连接上了,下一步就是等待客户发数据,如果不发,程序不会停留在这里,而是继续执行。
反过来停留在这里,不继续执行就是阻塞。
2)非阻塞模式的实现:对于客户端来说,得到SocketChannel对象后,通过调用方法configureBlocking(false)来设置这个Socket为非阻塞状态。
android socket原理
Android Socket原理一、什么是SocketSocket(套接字)是计算机网络中用于实现不同主机间通信的一种技术。
它提供了一种统一的接口,使得不同操作系统、不同编程语言之间可以相互通信。
在Android开发中,Socket常用于实现网络通信,使得Android设备可以与远程主机进行数据交换。
二、Socket通信原理Socket通信基于客户端(Client)和服务器(Server)之间的交互。
客户端向服务器发送请求,服务器接收请求并返回响应。
具体的通信流程如下:1.客户端创建一个Socket对象,指定要连接的服务器的IP地址和端口号。
2.客户端通过Socket对象与服务器建立连接。
3.客户端通过输出流向服务器发送请求数据。
4.服务器接收到请求数据后进行处理,然后通过输出流向客户端发送响应数据。
5.客户端接收到服务器的响应数据。
三、Socket相关类介绍在Android开发中,主要使用以下几个类实现Socket通信:.Socket:客户端Socket对象,用于与服务器建立连接和发送接收数据。
.ServerSocket:服务器Socket对象,用于监听客户端的连接请求。
.SocketException:Socket异常类,用于处理Socket通信过程中的异常。
4.java.io.InputStreamReader和java.io.OutputStreamWriter:用于将字节流转换为字符流。
四、Socket编程步骤1. 客户端编程步骤以下是Android客户端Socket编程的步骤:1.创建一个Socket对象,指定服务器的IP地址和端口号。
2.获取Socket对象的输出流,用于向服务器发送数据。
3.获取Socket对象的输入流,用于接收服务器返回的数据。
4.向服务器发送请求数据。
5.接收服务器返回的响应数据。
2. 服务器端编程步骤以下是Android服务器端Socket编程的步骤:1.创建一个服务器Socket对象,指定监听的端口号。
android x86模拟器和PC相互通信(socket)
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.servername:ServerThread客户端:android项目,运行于android模拟器package :com.android.clientname: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. */@Overridepublic 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); // 创建SocketPrintWriter 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);elsemTextView.setT ext("数据错误!");// 关闭流out.close();in.close();// 关闭Socketsocket.close();} catch (Exception e) {// TODO: handle exceptionLog.e(DEBUG_TAG, e.toString());}}}。
- 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());
}
}
}。