Android基於TCP協議的Socket通信簡單實例


Socket通信有兩種主要方式:TCP協議和UDP協議,兩者區別是TCP協議要首先和接收方要建立連接然后發送數據,這樣數據能保證送達,但速度較慢;UDP協議首先把數據打包,然后直接發送到接收方,無需建立連接誒,速度快,但容易丟失數據。這里是一個簡單的基於TCP協議的通信實例:

直接上代碼:

首先是java服務器的編寫:

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



public class netserver {

    public static void main(String[] args) throws IOException {
        
        
        
        ServerSocket server=new ServerSocket(9090);//9090是端口號,由自己設置
        System.out.println("服務器已啟動");
        Socket client=server.accept();//接收客戶端請求
//        PrintStream out=new PrintStream(client.getOutputStream());
        PrintWriter out=new PrintWriter(new OutputStreamWriter(client.getOutputStream(),"UTF-8"),true);
        BufferedReader msg=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//對緩沖區數據讀取
    StringBuffer info=new StringBuffer();//接收客戶端發來的消息
    
    info.append("I'm fine.你好! ");//回應的數據
    info.append(msg.readLine());//接收的數據
    System.out.println(info);//控制台輸出將要發出的信息
    out.print(info);//發送到客戶端
    out.close();
    msg.close();
    client.close();
    server.close();
    
    }

}

接下來是安卓客戶端的代碼:

package com.example.scoket;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
private Button send=null;
private TextView info=null;
private Handler handler=null;
private String s="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        send=(Button)findViewById(R.id.send);
        info=(TextView) findViewById(R.id.info);
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread()
                {
                    public void run(){
                        try {
                            Socket client=new
Socket("10.0.2.2",9090);//括號內為(服務器,端口號)
                           
                            PrintStream out=new PrintStream(client.getOutputStream());                
                            BufferedReader msgget=new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));//讀取返回的數據
                            out.println("已連接服務器");
                            s=msgget.readLine();
                            out.close();
                            msgget.close();
                            client.close();
                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(0);}}.start();
                handler =new Handler() {

                    //當有消息發來的時候就執行Handler方法
                public void handleMessage(Message msg)
                {
                    super.handleMessage(msg);
                    info.setText(s);
                }

                };
            }
        });    
    }
}

服務器就填服務器的ip地址,如果服務器是在自己電腦上的,客戶端在虛擬機上,那么服務器就填10.0.2.2,若是局域網連接的,就用在win+r >cmd>config查詢一下電腦的ip;端口號必須與服務器一致,挑選的端口如果顯示被占用就換一個,端口的取值就自行百度。

運行時先啟動服務器,在運行客戶端

運行效果:

客戶端+服務器控制台

按鈕點擊前:

 

 

 

 點擊后:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM