Android與PC端通過WiFi通訊

來源:互聯網
上載者:User

標籤:

前期準備:我的是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>
View Code

到這裡你可以運行你的服務端,選中項目,右擊選中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,有時間把相關的配置弄下。

Android與PC端通過WiFi通訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.