標籤:
前期準備:我的是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通訊