使用手機搭建伺服器,使用同一網段電腦訪問
阿新 • • 發佈:2019-01-27
傳輸層協議可以分為TCP與UDP,下面分別介紹下這兩種協議的特點。
TCP(Transmission Control Protocol):
1.面向連線
2.傳輸可靠
3.速度慢(傳輸效率低)
4.面向位元組流
UDP(User Data Protocol):
1.無連線
2.傳輸不可靠
3.速度快(傳輸效率高)
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
工程結構
定義一個網頁配置類
定義一個Http伺服器類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 + '}'; } }
呼叫方法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(); } } }
電腦與手機連線上同一Wifi後,在電腦終端上輸入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(); } }
終端上的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();
}
}