深入理解Android网络编程——学习笔记(二)——简单使用TCP通信

1、TCP通信原理示意图

                                   深入理解Android网络编程——学习笔记(二)——简单使用TCP通信_第1张图片

2、TCP的使用分为两个部分

2、1、TCP服务器端

主要步骤:

(1)调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上

(2)调用accpet(),监听连接请求,如果客户端请求连接,则接收连接,返回通信套接字

(3)调用Socket类的getOutputStream()和getInputStream()获取输出流和输入流

(4)关闭通信套接字

2、2、TCP客户端

主要步骤:

(1)调用Socket()创建一个流套接字,并连接到服务器端

(2)调用Socket类的getOutputStream()和getInputStream()方法获取输出和输入流,开始网络数据的发送和接收

(3)关闭通信套接字

3、代码实现

3、1、服务器端

服务器端主要使用Java main()方法+线程Thread实现

(1)TCP_Server.java


import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCP_Server {

    public static void main(String[] args) {
        //TCP通信的端口号
        int TCP_SERVER_PORT=12345;
        //初始化服务器线程
        ServerThread serverThread = new ServerThread(TCP_SERVER_PORT);
        serverThread.start();

    }
}

(2)TCPThread.java


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InterruptedIOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread extends Thread {
    //创建一个ServerSocket对象
    private ServerSocket serverSocket=null;

    private int mTCP_SERVER_PORT;
    public ServerThread(int TCP_SERVER_PORT){
        this.mTCP_SERVER_PORT=TCP_SERVER_PORT;
    }
    @Override
    public void run(){
        super.run();
        while (true)
        {
            try{
                System.out.println("Server服务器正在监听");
                //mTCP_SERVER_PORT为指定的绑定的端口,为int类型
                serverSocket=new ServerSocket(mTCP_SERVER_PORT);
                //监听连接请求

                Socket socket=serverSocket.accept();
                System.out.println("客户端已连接");

                //写入读Buffer中
                BufferedReader in=new BufferedReader(new 
                InputStreamReader(socket.getInputStream())); //获取输入流
                //放到写的Buffer中
                BufferedWriter out=new BufferedWriter(new 
                 OutputStreamWriter(socket.getOutputStream()));//获取输出流
                //读取接收信息,转换为字符串
                String incomingMsg=in.readLine()+System.getProperty("line.separator");
                
                //显示接收信息
                System.out.println(incomingMsg);
                //生成发送字符串
                String outgoingMsg="googbye from 
                port:"+mTCP_SERVER_PORT+System.getProperty("line.separator");
                
                //将发送字符串写入上面定义的BufferedWriter中
                out.write(outgoingMsg);
                //刷新,发送
                out.flush();
                //关闭socket
                socket.close();

            }catch (InterruptedIOException e){
                //超时错误
                e.printStackTrace();
            }catch (IOException e){
                //IO异常
                e.printStackTrace();
            }finally {
                //判定是否初始化ServerSocket对象,如果初始化则关闭serverSocket
                if(serverSocket!=null){
                    try {
                        serverSocket.close();
                    }catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
       }
    }
}

3、1、客户端

客户端为Android部分,有MainActivity.java、ClientThread.java、activity_main.xml三部分组成

(1)MainActivity.java 主要是显示一个用户界面,并且开启线程,该线程与ClientThread.java相关


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.net.Socket;

public class MainActivity extends AppCompatActivity {
    String localhost="192.168.43.81";  //这里为PC机的IP地址
    final int PORT=12345;

    Button send_btn;
    private void init_view()
    {
        send_btn=findViewById(R.id.btn_send);
    }

    public void btn_send_onClick(View view){
        ClientThread clientthread=new ClientThread(localhost,PORT);
        clientthread.start();
        Log.i("按钮点击事件响应:","客户端线程启动");

    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init_view();
    }

}

(2)ClientThread.java 用于与服务器端相连接的相关操作


import android.util.Log;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientThread extends Thread {

    private String LocalHost;
    private int TCP_SERVER_PORT;

    public ClientThread(String localhost,int port)
    {
        this.LocalHost=localhost;
        this.TCP_SERVER_PORT=port;

    }
  @Override
    public void run(){
        super.run();
        try {
            //初始化Socket,TCP_SERVER_PORT为指定的端口,int类型
            Socket socket=new Socket(LocalHost,TCP_SERVER_PORT);
            //获取输入流
            BufferedReader in=new BufferedReader(new 
            InputStreamReader(socket.getInputStream()));
           
            //生成输出流
            BufferedWriter out=new BufferedWriter((new 
            OutputStreamWriter(socket.getOutputStream())));
            //生成输出内容
            String outMsg="TCP connecting to 
            "+TCP_SERVER_PORT+System.getProperty("line.separator");
            
            //写入
            out.write(outMsg);
            //刷新,发送
            out.flush();
            //获取输入流
            String inMsg=in.readLine()+System.getProperty("line.separator");
            Log.i("TCPClient","received:"+inMsg);
            
            //关闭连接
            socket.close();

        }catch (UnknownHostException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }


  }
}

(3)activity_main.xml 布局文件




    

(4)需要在AndroidManifest.xml配置文件中添加权限

 

4、运行结果

服务器端运行结果

深入理解Android网络编程——学习笔记(二)——简单使用TCP通信_第2张图片

客户端运行结果

深入理解Android网络编程——学习笔记(二)——简单使用TCP通信_第3张图片

深入理解Android网络编程——学习笔记(二)——简单使用TCP通信_第4张图片

你可能感兴趣的:(Android)