Android与PC端通过WiFi通信

前期准备:我的是Linux Mint操作系统(总之折腾的过程中怀疑过是不是系统的问题),首先是要创建wifi热点给android手机使用,这个时候笔记本作为通信的服务器端,android手机作为客户端,通过socket进行通信。

1.在eclipse下写好服务器端的代码,包括监听的端口好,客户端的IP地址获取,发送的数据处理等,这里涉及到J2EE的环境配置,有时间我在写下,这个代码是直接百度到的,能用:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Test {
    private ServerSocket server;
    private Socket client;
    private BufferedReader in;
    private PrintWriter out;

    public Test() {
        try {
            server = new ServerSocket(9400);
            while (true) {
                System.out.println("start!");
                // 获得客户端连接
                client = server.accept();
                // 获得客户端的IP和端口
                String remoteIP = client.getInetAddress().getHostAddress();
                int remotePort = client.getLocalPort();

                System.out.println("A client connected. IP:" + remoteIP
                        + ", Port: " + remotePort);
                System.out.println();

                // 获得 client 端的输入输出流,为进行交互做准备
                in = new BufferedReader(new InputStreamReader(
                        client.getInputStream()));
                out = new PrintWriter(client.getOutputStream(), false);

                // 获得 client 端发送的数据
                String tmp = in.readLine();
                // String content = new String(tmp.getBytes("utf-8"));
                System.out.println("Client message is: " + tmp);

                // 向 client 端发送响应数据
                out.println("Your message has been received successfully!.");

                // 关闭各个流
                out.close();
                in.close();
                // server.close();
            }
        } catch (Exception e) {
            // 发送响应,接收失败
            System.out.println(e.toString());
            out.println("Receive Error!");
        }
    }

    public static void main(String[] args) {
        new Test();
    }

}

代码看起来也不是太难,关键是Java EE的使用,尤其是服务器的配置,(配置教程涉及到tomcat的配置,以及服务器的建立),

Project name随便写好了,然后next---->next,需要把Generate web.xml deployment descriptor勾选上。注意:

Java Resources 下的src文件夹下里面放的是相关的类,这个类写完之后还在Webcontent文件夹--->WEB-INF文件夹下的web.xml里面配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>TomcatTest</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>Test</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>
</web-app>

到这里你可以运行你的服务端,选中项目,右击选中Run as--->Run on server,到此你的网站基本上就发布成功了,在你的手机的浏览器中输入你PC端的IP地址,注意端口号是9400,比如我之前测试的用是的10.3.19.26:9400,就可以看到服务端返回的信息。

2.android端的程序比较简单,但是一开始的时候怎么都不能成功运行,最后发现的两个问题a.权限没有加,b.自从android3.0以后,android的运行机制不容许在主线程中使用网络的相关操作

我的值加了这几个权限,貌似也能够运行起来,呵呵:

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

第二个问题,网上的一些代码太坑了,明明都是有问题,也不知道修改,下面写的很简单,没有图形界面,

package com.example.client;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button btnConnect, btnSend;
    private Socket socket;
    private PrintStream output;
    private EditText editSend;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnConnect = (Button) findViewById(R.id.button1);
        btnSend = (Button) findViewById(R.id.button2);
        editSend = (EditText) findViewById(R.id.editText1);
        btnConnect.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                new Thread(runnable).start();//开启线程
            }
        });
        btnSend.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                sendMessage(editSend.getText().toString());

            }
        });

    }
    Runnable runnable = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            initClientSocket();
        }
    };

    public void initClientSocket() {
        try {
            EditText edit_ip = (EditText) MainActivity.this.findViewById(R.id.editText2);
            String ip = edit_ip.getText().toString().trim();
            socket = new Socket("10.3.19.26", 9400);
            output = new PrintStream(socket.getOutputStream(), true, "gbk");

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            Toast.makeText(MainActivity.this, "请检查端口号是否为服务器IP",
                    Toast.LENGTH_LONG).show();
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Toast.makeText(MainActivity.this, "服务器未开启", Toast.LENGTH_LONG)
                    .show();
            e.printStackTrace();
        }
        output.println("this is the message from client");
    }

    private void sendMessage(String str) {
        output.println(str);
    }

    public void closeSocket() {
        try {
            output.close();
            socket.close();
        } catch (IOException e) {
            System.out.println("error"+e);
        }
    }

}

基本上控件只有一个按钮,其他的都是没有用的,在按钮的监听器里面写的方法,就是使用Runable开启一个线程,在runable的方法中调用initClientSocket()方法,你会发现,里连接的代码很简单,我连接成功后就使用

output.println("this is the message from client");

这个就是返回给服务器的信息,一开始放在另一个按钮中的,但是考虑到上述的问题,还是直接在线程中发送(我测试过,在UI线程中不能使用这个方法,发送完了也没有反应)最终的服务器端接受的数据情况如下:

从下午到晚上总算弄完了2015-05-18 22:11:21,有时间把相关的配置弄下。

时间: 2024-11-06 14:08:50

Android与PC端通过WiFi通信的相关文章

Android 防止PC端第三方流氓软件强制安装apk至android设备

今天,研究了一下PC端软件连接设备(android)后,强制安装应用程序到设备端,比如某60,某讯等,最后被我活生生禁掉了,折服于我的PMS之下,欲知如何禁之,且听下文分解: 软件平台:Android 4.4.3 硬件平台:Mavell android系统安装app有诸多方式, 其一,将app放置目标平台/system/app和/data/app目录,PMS(PackageManagerService)会定时扫描该目录,从而安装app: 其二,从网络下载应用程序,然后实现安装: 其三,adb命令

从Android访问PC端的port (reverse port forwarding)

大致就是 Device side: install SSH Server, add ssh server on 22222 port and user q start ssh server PC side: adb forward tcp:22222 tcp:22222    //这是为了能够从PC访问android里的ssh server的22222端口. ssh -f -N -R 3000:localhost:3000  q@localhost -p 22222 Then you can u

PC端的软件端口和adb 5037端口冲突解决方案

引用https://www.aliyun.com/jiaocheng/32552.html 阿里云 >  教程中心   >  android教程 >  PC端的软件端口和adb 5037端口冲突解决方案 PC端的软件端口和adb 5037端口冲突解决方案 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 端口 冲突 解决方案 端的 软件 5037 adb 发表文章 摘要:使用adb进行移动终端的调试时,若看到以下的提示:$adbdevicesListofdevicesa

我的Android进阶之旅------&gt;Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端

因为经常开着笔记本工作,累了就坐床上玩手机,但晚上要睡觉了又不想下床去关电脑,就想做个Android软件来控制PC端的关机和重启.要想实现此功能,就得让Android手机和PC之间进行通信才能,因此采用Socket编程来实现. ==================================Shutdown命令的用法======================================== 首先得了解一下关于Shutdown命令的用法. 选择win+R,打开命令行窗口,输入shutdo

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) [转]

从服务器 (PC 端 ) 发送图片到客户端 (android 手机端 ) ,并在手机页面上显示该图片.(注:本文旨在实现功能,并未考虑效率,有待后续跟进.) 1.服务器端 1 int port=9090; 2 3 4 /** 5 * 发送文件的方法 6 * 此处定义服务器端口为9090,ip地址为192.168.1.1 7 * 设定被传输图片的路径为"images/icon.png" 8 * images文件夹放在此工程的根目录下,我们就可以通过相对路径访问这个图片文件了 9 */ 1

PIC32单片机端C语言serial bootloader和PC端C#语言bootloader串口通信程序

今天介绍下我新完成的为Microchip的32位单片机PIC32MZ2048ECH144开发的UART bootloader程序.整个工程分两部分,第一部分是单片机端用XC32编译的bootloader程序PhsBoot_v5.0,另一部分是PC端用C#编译的bootloader通讯程序PhsLoader_v5.0.两者之间采用固定的协定通信合作,如下. <STX><CMD><ADDRL><ADDRH><ADDRU><ADDRM>&l

关于Android与pc通信时中文乱码的分析和解决

初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题.既然出现了乱码,那么原因自然是协议不通了.我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认的布局文件编码标准则是utf-8,这样一来,我们双方通信的时候便难免出现乱码.要解决它,就要从二者转换方面着手.     首先我们知道,从安卓手机界面上获得的文字,其编码字符集是utf-8,所以,当我们的java文件获得它时,它是以utf-8形式编译的.所以这里,在得到EditText中的文字之后,

android通过socket连接服务端(PC端)

自己的计算机网络的基础太差了,一个很小的Demo居然搞了快一天,真醉了,不过坑踩多了,自然知道怎么走路了. 首先,是服务端的代码 class Server implements Runnable{ public static void main(){ Thread server = new Thread(new Server()); server.start();} //服务端因为需要接受多个客户端的信息,所以需要一直开放端口等待客户端连入,我就不写try catch了,有点多 public v

android手机客户端与pc机进行socket通信

这两天做了一个手机和电脑通信利用socket进行网络通信的小程序,上图先: 在写程序的过程中发现了很多问题... 一.电脑和手机的IP必须在同一个网段,也就是IP的前三段必须是一样的. 刚开始电脑和手机都连着老师办公室的 无线,可是却连不上..折腾了好久才发现虽然都是连在同一个路由器,网段却不一样.(老师说应该是一样的,我也不知道怎么回事.)后来修改了手机的IP地址,才能连上.关于如何修改手机IP,百度一下就OK了. 二.ReadLine()读数据阻塞问题 终于连接上了,却读不出数据.经过deb