android-------- socket 實現客戶端與服務器端通信


前面介紹了Socket的簡介和原理,今天簡單的來實現一下客服端與服務器通信的功能

 

客服端

建立連接

 try {
socket
= new Socket("192.168.1.100", 9999); Log.i("Android", "與服務器建立連接:" + socket); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }

 

發送消息

  try {
         // socket.getInputStream()
        DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
        writer.writeUTF("嘿嘿,你好啊,服務器.."); // 寫一個UTF-8的信息
        System.out.println("發送消息");
      } catch (IOException e) {
           e.printStackTrace();
      }

 

添加權限

 <uses-permission android:name="android.permission.INTERNET"/>

 

服務端(在Eclipse建立一個Java項目即可)

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

public class SocketServer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        System.out.println("123456");
        startService();
    }
    
    
    /**  
    * 啟動服務監聽,等待客戶端連接 
    */  
   private static void startService() {  
       try {  
           // 創建ServerSocket  
           ServerSocket serverSocket = new ServerSocket(9999);  
           System.out.println("--開啟服務器,監聽端口 9999--");  
 
           // 監聽端口,等待客戶端連接  
           while (true) {  
               System.out.println("--等待客戶端連接--");  
               Socket socket = serverSocket.accept(); //等待客戶端連接  
               System.out.println("得到客戶端連接:" + socket);  
                 
               startReader(socket);  
           }  
 
       } catch (IOException e) {  
           e.printStackTrace();  
       }  
   }  
 
   /**  
    * 從參數的Socket里獲取最新的消息 
    */  
   private static void startReader(final Socket socket) {  
 
       new Thread(){  
           @Override  
           public void run() {  
               DataInputStream reader;  
               try {  
                   // 獲取讀取流  
                   reader = new DataInputStream( socket.getInputStream());  
                   while (true) {  
                       System.out.println("*等待客戶端輸入*");  
                       // 讀取數據  
                       String msg = reader.readUTF();  
                       System.out.println("獲取到客戶端的信息:" + msg);  
                   }  
               } catch (IOException e) {  
                   e.printStackTrace();  
               }  
           }  
       }.start();  
   }  

}

 

運行Java項目,得到

 

 

然后在手機端點擊發送消息

     

 

 

服務端接收到消息,打印信息

 

 

服務端發送消息給客戶端

 

服務端代碼:

public class TestServer {

     public static void main(String[] args) {
        
         try {
            ServerSocket serverSocket = new ServerSocket(30000);
            System.out.println("服務器已連接");
            while(true){
                System.out.println("123");
                Socket socket = serverSocket.accept();
                OutputStream outputStream = socket.getOutputStream();
                outputStream.write("你好,我是服務器\n".getBytes("utf-8"));
                outputStream.close();
                socket.close();
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
     }
}

 

客戶端代碼

public class Demo2Activity extends AppCompatActivity {

    static TextView textView;
    Socket socket;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.demo2);
        initView();
    }


    private void initView(){
        textView = (TextView) findViewById(R.id.txt_1);

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    socket = new Socket("192.168.1.101", 30000);
                    // socket.setSoTimeout(10000);//設置10秒超時
                    Log.i("Android", "與服務器建立連接:" + socket);
                    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String line = br.readLine();
                    Log.i("Android", "與服務器建立連接:" + line);
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = line;
                    handler.sendMessage(msg);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();

    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1){
                textView.setText("這是來自服務器的數據:"+msg.obj.toString());
            }
        }
    };

}

 

 

先運行服務端,再運行客戶端

效果圖:

 

 

 

 

源碼包含多個demo,也是參考網上資料而來

 

源碼地址:https://github.com/DickyQie/android-socket

 


免責聲明!

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



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