Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 使用Socket進行通信

Android 使用Socket進行通信

編輯:關於Android編程

 

客戶端通常可以使用Socket的構造器來鏈接到指定的服務器。

下面演示一下,Android端鏈接到服務器,同時,用服務器給Android發送一條消息:

1)服務器端

2)Android端

 

1)服務器端

編寫過程中遇到的一個小問題:java.net.BindException: Address already in use: JVM_Bind,分析出現這個問題的原因,一般有如下幾種:

①)原因:端口已被占用。

解決方案:換一個端口。

②)原因:變量定義位置問題(我不知道是不是這個問題,可能是,我開始出現這個問題的時候,換了幾個端口還是沒解決,後來我將變量定義在外面,就解決了)

解決方案:將變量定義在外部。

\

 

package dujun.king.javaee;

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

public class CServer {
	public static void main(String[] args){	
		//創建一個ServerSocket,用於監聽客戶端Socket的鏈接請求
		//本機IP: 169.254.49.31
		ServerSocket ss=null;
		Socket s = null;
		OutputStream os = null;
		//采用循環不斷的接受來自客戶端的請求
		while (true)
		{
			try {
				System.out.println(等待客戶端的鏈接....);
				ss = new ServerSocket(9527);
				//每當接收到客戶端Socket的請求,服務器也對應產生一個Socket
				s = ss.accept();
				System.out.println(客戶端已鏈接....);
				os = s.getOutputStream();
				os.write(您好,收到一條信息!.getBytes(utf-8));
				//關閉輸出流,關閉Socket
				os.close();
				s.close();
				ss.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
2)Android端

 

編寫過程中遇到的一個小問題,就是(我用真機)一直連接不上服務器,我當時以為不是ip地址的問題,我先後換了好幾個都沒用(包括我聯網後的ip 113.132.174.158,沒聯網時的ip 169.254.49.31)。

解決方案:添加一個模擬器,不用真機模擬。(使用:169.254.49.31 測試成功,如下圖)

\

a) xml布局代碼:

 



    

b)MainActivity.java代碼:

 

 

package client.dujun.king.tcp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;


public class MainActivity extends Activity {

	EditText show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (EditText)findViewById(R.id.show);
        new Thread()
        {
        	@Override
        	public void run()
        	{
        		try {
					//建立連接到遠程服務器的Socket
        			Socket socket = new Socket(169.254.49.31,9527);
        			//將Socket對應的輸入流包裝成BufferedReader
        			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        			//進行普通的I/O操作
        			String line = br.readLine();
        			show.setText(來自服務器的數據:+line);
        			br.close();
        			socket.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
        	}
        }.start();
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
c) AndroidMainiFest.xml 權限設置代碼:

 

            
        
    

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved