1. 程式人生 > >使用手機搭建伺服器,使用同一網段電腦訪問

使用手機搭建伺服器,使用同一網段電腦訪問

傳輸層協議可以分為TCP與UDP,下面分別介紹下這兩種協議的特點。
TCP(Transmission Control Protocol):
1.面向連線
2.傳輸可靠
3.速度慢(傳輸效率低)
4.面向位元組流
UDP(User Data Protocol):
1.無連線
2.傳輸不可靠
3.速度快(傳輸效率高)

4.面向報文

TCP與UDP的連線圖解


應用場景


TCP的三次握手、四次揮手圖


下面使用TCP連線實現手機搭建微伺服器,使用同一網段的電腦通過命令來遠端訪問,必須是同一網段才可以訪問。如在終端介面telnet 192.168.1.134 8088
工程結構

定義一個網頁配置類

package com.dzt.androidservice;

/**
 * Created by on 2016/9/20.
 */
public class WebConfiguration {
	//埠號
	private int port;
	//最大監聽數
	private int maxParallels;

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public int getMaxParallels() {
		return maxParallels;
	}

	public void setMaxParallels(int maxParallels) {
		this.maxParallels = maxParallels;
	}

	@Override
	public String toString() {
		return "WebConfiguration{" +
				"port=" + port +
				", maxParallels=" + maxParallels +
				'}';
	}
}
定義一個Http伺服器類
package com.dzt.androidservice;

import android.util.Log;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Created by on 2016/9/20.
 */
public class SimpleHttpServer {
	private static String TAG = "SimpleHttpServer";
	private boolean isEnable;
	private WebConfiguration webConfig;
	private ServerSocket socket;
	private ExecutorService threadPool;

	public SimpleHttpServer(WebConfiguration webConfig){
		this.webConfig = webConfig;
		//建立一個執行緒池
		threadPool = Executors.newCachedThreadPool();
	}

	/**
	 * 啟動Server(非同步)
	 */
	public void startAsync(){
		isEnable = true;
		new Thread(new Runnable() {
			@Override
			public void run() {
				doProcSync();
			}
		}).start();
	}

	private void doProcSync() {
		InetSocketAddress socketAddr = new InetSocketAddress(webConfig.getPort());
		try {
			socket = new ServerSocket();
			socket.bind(socketAddr);
			while (isEnable){
				final Socket remotePeer = socket.accept();
				Future future =  threadPool.submit(new Runnable() {
					@Override
					public void run() {
						Log.i(TAG, "a remote peer accepted..." + remotePeer
								.getRemoteSocketAddress().toString());
						onAcceptRemotePeer(remotePeer);
					}
				});
				//如果任務結束返回null
				Log.i(TAG, "future = " + future.get());
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void onAcceptRemotePeer(Socket remotePeer) {
		try {
			remotePeer.getOutputStream().write("congratulations, connected successful".getBytes());
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 停止Server(非同步)
	 */
	public void stopAsync(){
		threadPool.shutdownNow();
		if(!isEnable)
			return ;
		isEnable = false;
		try {
			if(!socket.isClosed()){
				socket.close();
			}
			socket = null;
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
}
呼叫方法
package com.dzt.androidservice;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

	private SimpleHttpServer shs;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		WebConfiguration wc = new WebConfiguration();
		wc.setPort(8088);
		wc.setMaxParallels(50);
		shs = new SimpleHttpServer(wc);
		shs.startAsync();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		shs.stopAsync();
	}
}
電腦與手機連線上同一Wifi後,在電腦終端上輸入

終端上的IP是通過手機-設定-狀態來檢視的


列印

這個列印以在以下函式中

private void doProcSync() {
		InetSocketAddress socketAddr = new InetSocketAddress(webConfig.getPort());
		try {
			socket = new ServerSocket();
			socket.bind(socketAddr);
			while (isEnable){
				final Socket remotePeer = socket.accept();
				Future future =  threadPool.submit(new Runnable() {
					@Override
					public void run() {
						Log.i(TAG, "a remote peer accepted..." + remotePeer
								.getRemoteSocketAddress().toString());
						onAcceptRemotePeer(remotePeer);
					}
				});
				//如果任務結束返回null
				Log.i(TAG, "future = " + future.get());
			}
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}