以上是手机端简单的运行效果图

通过本文只是想来简单介绍一下关于android socket编程。

向上服务器端代码:

package nate.PPT.control;import java.awt.AWTException;import java.awt.Robot;import java.awt.event.KeyEvent;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;public class PPTServer {private final static int RIGHT = 1;private final static int LEFT = 2;private final static int SHIFTF5 = 0;private final static int ESC = 3;private static int key;//注意这里用的输入输出流的对象private static ObjectInputStream fromClient;private static ObjectOutputStream fromServer;public static void main(String[] args) throws IOException,ClassNotFoundException, AWTException, InterruptedException{ServerSocket sSocket = new ServerSocket(2011);System.out.println("waiting a connection from the client");Robot robot = new Robot();Socket sock = sSocket.accept();System.out.println("recv a connection");fromClient = new ObjectInputStream(sock.getInputStream());fromServer = new ObjectOutputStream(sock.getOutputStream());do{Choices choice = (Choices)fromClient.readObject();System.out.println("the flag is " + choice.getKey());key = choice.getKey();switch(key){case SHIFTF5:robot.keyPress(KeyEvent.VK_SHIFT);Thread.sleep(20);robot.keyPress(KeyEvent.VK_F5);Thread.sleep(10);robot.keyRelease(KeyEvent.VK_F5);robot.keyRelease(KeyEvent.VK_SHIFT);Thread.sleep(10);break;case LEFT:robot.keyPress(KeyEvent.VK_LEFT);Thread.sleep(10);robot.keyRelease(KeyEvent.VK_LEFT);Thread.sleep(10);break;case RIGHT:robot.keyPress(KeyEvent.VK_RIGHT);Thread.sleep(10);robot.keyRelease(KeyEvent.VK_RIGHT);Thread.sleep(10);break;case ESC:robot.keyPress(KeyEvent.VK_ESCAPE);Thread.sleep(10);robot.keyPress(KeyEvent.VK_ESCAPE);Thread.sleep(10);break;default:break;}}while(key != -1);System.out.println("exit the app");fromClient.close();fromServer.close();sock.close();sSocket.close();}}

本例中,注意一下所用的输入输出流对象,关于这个java中已经很清楚了,就不多说。同时,本例中使用java中的Robot来模拟按键,即PPT中的快捷键从而实现控制PPT的目的。当然,大家都知道,使用ObjectInputStream、ObjectOutputStream传输对象首先还需下面的条件。即传送的对象所属的类,该类必须实现Serializable接口!同时注意在android手机客户端,我们需要同样拥有这样一个类型!!!将此类copy过去即可,这些都是java中的知识。

package nate.PPT.control;import java.io.Serializable;public class Choices implements Serializable{private int key;public Choices(int key) {super();this.key = key;}public int getKey() {return key;}public void setKey(int key) {this.key = key;}}

  

上面类包含了传输的信息数据内容。

来看看client端的代码,部署在android手机端:

package nate.PPT.control;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.InetAddress;import java.net.Socket;import java.net.UnknownHostException;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.KeyEvent;import android.view.View;import android.widget.Button;public class PPTClient extends Activity {private Button start;private Button escape;private Button forward;private Button back;private Socket sock;private ObjectOutputStream fromClient;private ObjectInputStream fromServer;private final static int RIGHT = 1;private final static int LEFT = 2;private final static int SHIFTF5 = 0;private final static int ESC = 3;    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                try {//sock = new Socket(InetAddress.getByName("125.71.69.199"),2011);        sock = new Socket(InetAddress.getByName("125.70.223.165"),2011);        fromClient = new ObjectOutputStream(sock.getOutputStream());fromServer = new ObjectInputStream(sock.getInputStream());} catch (UnknownHostException e1) {e1.printStackTrace();} catch (IOException e1) {e1.printStackTrace();}                start = (Button)this.findViewById(R.id.start);        escape = (Button)this.findViewById(R.id.escape);        forward = (Button)this.findViewById(R.id.froward);        back = (Button)this.findViewById(R.id.back);                start.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {Choices choice = new Choices(SHIFTF5);try {fromClient.writeObject(choice);System.out.println("send the start shift + f5");} catch (IOException e) {e.printStackTrace();}}                });                escape.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View arg0) {Choices  choice = new Choices(ESC);try {fromClient.writeObject(choice);System.out.println("send the escape");} catch (IOException e) {e.printStackTrace();}}        });        forward.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {Choices choice = new Choices(RIGHT);try {fromClient.writeObject(choice);System.out.println("send the right (the next)");} catch (IOException e) {e.printStackTrace();}}                });        back.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {Choices choice = new Choices(LEFT);try {fromClient.writeObject(choice);System.out.println("send the left (the last)");} catch (IOException e) {e.printStackTrace();}}        });    }        /**     * 监听BACK键     * @param keyCode     * @param event     * @return     */    public boolean onKeyDown(int keyCode, KeyEvent event)     {if ( event.getKeyCode() == KeyEvent.KEYCODE_BACK){AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("exit app");builder.setMessage("You will exit the app...");//builder.setIcon(R.drawable.stat_sys_warning);builder.setPositiveButton("OK",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent startMain = new Intent(Intent.ACTION_MAIN);startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startMain);System.exit(0);}});builder.setNegativeButton("Cancel",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}});builder.show();}return super.onKeyDown(keyCode, event);}}

代码还是很简单的,这里不多说了,强调一下的是,client端除了一个activity的类外,还有上面的Choices类!!!与服务器端的类型一模一样!同时,别忘记了需要在android manifest.XML文件中添加

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/>

用户权限!!!别忘记添加。。。
当然,代码还有很多需要改进的地方,比如要解决按下可能延迟PPT没有反应,但是又不知道是否真的按下等问题,我们可以在手机端的按钮上加上一个震动的效果,这样我们就能准确的知道我们是否按下手机上的按键。这个应该不难吧!不过本篇文章主要还是简单介绍android socket编程与PC的连接。

如果有朋友需要整个工程源码的,在下面留下邮箱,我将发送给你!


由于大家需要的网友比较多,我已经将资源放在此处,http://download.csdn.net/detail/natepan/3849822,大家可以去自由下载,谢谢。

更多相关文章

  1. 6.2、Android中向Internet发送xml数据
  2. Android获取手机当前连接的WiFi信息(SSID,IP,连接状态)
  3. Android之根据手机屏幕分辨率(px与dp互换)
  4. Android重启app功能实现
  5. Android(安卓)Screen Monitor抓取真机屏幕
  6. Android把Bitmap保存为PNG图像文件的简单代码
  7. Android(安卓)HandlerThread 消息循环机制之源码解析
  8. OkHttpClientManager使用
  9. Android培训班(13)

随机推荐

  1. Android 设备电池容量和使用量的获取
  2. Android Studio中与网站通信
  3. Android(安卓)gradle proguard 代码混淆
  4. Android(安卓)TwoLineListItem
  5. android的互联网开发
  6. android tablehost中tab中显示数字
  7. Android 如何实现带滚动条的TextView,在更
  8. 性能优化系列总篇
  9. Android如何通过shareduserid获取系统权
  10. Android的按键处理