AYE89

coding & learning

导航

Android之socket多线程(二)

Posted on 2017-09-26 17:12  AYE89  阅读(505)  评论(0编辑  收藏  举报

 

使用ServerSocket创建服务器端:

public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
          //创建一个ServerSo查看特,用于监听客户端Socket的连接请求
           ServerSocket ss=new  ServerSocket(3000);
           while(true){
               //每当接收到客户端Socket的请求,服务器端也对应产生一个Socket,没接收到请求就等待。。
               Socket s=ss.accept();
               OutputStream os=s.getOutputStream();//服务器端产生的Socket获取输出流
               os.write("您好,您收到了来自服务器的祝福!\n".getBytes());
               os.close();
               s.close();
           }
    }

 

客户端使用Socket通信:
测试环境是PC端服务器,手机当客户端,PC和手机要连接同一个局域网,PC和手机在同一网段

package com.example.simpleclient;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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.widget.TextView;
 
 
public class MainActivity extends Activity {
     TextView text;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text=(TextView) findViewById(R.id.text);
        new Thread(){
 
            @Override
            public void run() {
                // TODO Auto-generated method stub
                                     
                    try {
                        //建立连接到远程服务器的的Socket,Ip是服务器端PC的IP,测试环境是PC端服务器,手机当客户端,PC和手机要连接同一个局域网,PC和手机在同一网段
                        Socket socket = new Socket("192.168.88",3000);
                        //将Socket对应的输入流包装秤BufferedReader
                        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        String line=br.readLine();
                        text.setText("来自服务的数据:"+line);
                        br.close();
                        socket.close();
                    } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                                   
            }
             
        }.start();
    }
}    

补充:用ADB shell来检查网络状态

方法:Windows平台

1. cmd cd到adb.exe安装路径,通常是xxx/sdk/platform-tools

2. 输入adb shell

3. netstat

4. 查看指定端口占用 netstat -aon|findstr "8630"

查看PID对应进程 tasklist|findstr "2014"

以上列表中state状态说明
LISTEN 侦听来自远方的TCP端口的连接请求[4]
SYN-SENT 在发送连接请求后等待匹配的连接请求[4]
SYN-RECEIVED 在收到和发送一个连接请求后等待对方对连接请求的确认[4]
ESTABLISHED 代表一个打开的连接[4]
FIN-WAIT-1 等待远程TCP连接中断请求,或先前的连接中断请求的确认[4]
FIN-WAIT-2 从远程TCP等待连接中断请求[4]
CLOSE-WAIT 等待从本地用户发来的连接中断请求[4]
CLOSING 等待远程TCP对连接中断的确认[4]
LAST-ACK 等待原来的发向远程TCP的连接中断请求的确认[4]
TIME-WAIT 等待足够的时间以确保远程TCP接收到连接中断请求的确认[4]
CLOSED 没有任何连接状态[4]

 

详情参考:android通过执行netstat及cat /proc/net/tcp查看正在运行应用的本地端口号pid和uid以及对方的IP和端口号

ADB shell命令:ADB Shell学习