android之socket通信

本文详细介绍了使用 Android 进行 socket 客户端和服务端通信的基本概念、代码实现及注意事项。包括如何在 Android 应用中创建 Socket 对象,以及在不同版本的系统中如何正确处理网络请求,确保应用的兼容性和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

度娘给出的描述:
通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

       网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。

       在java中,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

       下面通过一个极为简单的客户端和服务端的连接例子演示下最基本的android socket通信:

       服务端的代码,在服务端特定的端口9999监听客户端请求,一旦有请求,便会执行,而后继续监听。使用accept()这个阻塞函数,就是该方法被调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket。本例中很简单,服务端不断监听,一旦有请求就输出一段信息:

  1. <span style="font-family: Comic Sans MS; font-size: 18px;">import java.io.BufferedWriter; 
  2. import java.io.IOException; 
  3. import java.io.OutputStreamWriter; 
  4. import java.net.ServerSocket; 
  5. import java.net.Socket; 
  6.  
  7. public class Main { 
  8.     private static final int PORT = 9999
  9.     public static void main(String[] args) { 
  10.  
  11.         try
  12.             // 实例化服务器套接字 设置端口号9999 
  13.             ServerSocket server = new ServerSocket(PORT); 
  14.             while (true) { 
  15.                 Socket socket = server.accept(); 
  16.                 // 获取输出流 
  17.                 BufferedWriter writer = new BufferedWriter( 
  18.                         new OutputStreamWriter(socket.getOutputStream())); 
  19.                 // 写字符串 
  20.                 writer.write("这是一段来自服务器的问候:Hello沃德!"); 
  21.                 writer.flush(); 
  22.                 writer.close(); 
  23.             } 
  24.         } catch (IOException e) { 
  25.             // TODO Auto-generated catch block 
  26.             e.printStackTrace(); 
  27.         } 
  28.  
  29.     } 
  30.  
  31.  
  32. </span> 
<span style="font-family:Comic Sans MS;font-size:18px;">import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
	private static final int PORT = 9999;
	public static void main(String[] args) {

		try {
			// 实例化服务器套接字 设置端口号9999
			ServerSocket server = new ServerSocket(PORT);
			while (true) {
				Socket socket = server.accept();
				// 获取输出流
				BufferedWriter writer = new BufferedWriter(
						new OutputStreamWriter(socket.getOutputStream()));
				// 写字符串
				writer.write("这是一段来自服务器的问候:Hello沃德!");
				writer.flush();
				writer.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

</span>


       下面是android客户端的相关内容,界面有一个按钮,点击后请求服务端的制定端口,然后显示服务端的内容,值得注意的是在android4.0以上的系统中,是不允许在主线程里面去执行网络相关的请求,否则会报错:NetworkOnMainThreadException,所以本例中新开辟一个线程初始化socket的内容:

  1. <span style="font-family: Comic Sans MS; font-size: 18px;">package com.example.socketdemo; 
  2.  
  3. import java.io.BufferedReader; 
  4. import java.io.IOException; 
  5. import java.io.InputStreamReader; 
  6. import java.net.Socket; 
  7. import java.net.UnknownHostException; 
  8. import android.annotation.SuppressLint; 
  9. import android.app.Activity; 
  10. import android.os.Bundle; 
  11. import android.os.Handler; 
  12. import android.os.Message; 
  13. import android.util.Log; 
  14. import android.view.View; 
  15. import android.view.View.OnClickListener; 
  16. import android.widget.Button; 
  17. import android.widget.TextView; 
  18.  
  19. @SuppressLint("HandlerLeak"
  20. public class SocketDemo extends Activity { 
  21.     /** Called when the activity is first created. */ 
  22.     private Button btn_receive; 
  23.     private TextView txt; 
  24.     private String line; 
  25.      
  26.     private static final String HOST = "192.168.1.101";   
  27.     private static final int PORT = 9999;   
  28.  
  29.  
  30.     @Override 
  31.     public void onCreate(Bundle savedInstanceState) { 
  32.         super.onCreate(savedInstanceState); 
  33.         setContentView(R.layout.activity_main); 
  34.         initControl(); 
  35.     } 
  36.  
  37.     private void initControl() { 
  38.         btn_receive = (Button) findViewById(R.id.btn_receive); 
  39.         txt = (TextView) findViewById(R.id.txt); 
  40.         btn_receive.setOnClickListener(new ReceiverListener()); 
  41.     } 
  42.  
  43.      
  44.     @SuppressLint("HandlerLeak"
  45.     class ReceiverListener implements OnClickListener { 
  46.  
  47.         @Override 
  48.         public void onClick(View v) { 
  49.             // TODO Auto-generated method stub 
  50.             new Thread() { 
  51.                 @Override 
  52.                 public void run() { 
  53.                     // 执行完毕后给handler发送一个空消息 
  54.                     try
  55.                         // 实例化Socket 
  56.                         Socket socket = new Socket(HOST, PORT); 
  57.                         // 获得输入流 
  58.                         BufferedReader br = new BufferedReader( 
  59.                                 new InputStreamReader(socket.getInputStream())); 
  60.                         line = br.readLine(); 
  61.                         br.close(); 
  62.                     } catch (UnknownHostException e) { 
  63.                         // TODO Auto-generated catch block 
  64.                         e.printStackTrace(); 
  65.                     } catch (IOException e) { 
  66.                         // TODO Auto-generated catch block 
  67.                         e.printStackTrace(); 
  68.                     } 
  69.                     handler.sendEmptyMessage(0); 
  70.                 } 
  71.             }.start(); 
  72.         } 
  73.  
  74.     } 
  75.  
  76.     // 定义Handler对象 
  77.     private Handler handler = new Handler() { 
  78.         @Override 
  79.         // 当有消息发送出来的时候就执行Handler的这个方法 
  80.         public void handleMessage(Message msg) { 
  81.             super.handleMessage(msg); 
  82.             // 处理UI 
  83.             txt.setText(line); 
  84.             Log.i("PDA", "----->" + line); 
  85.         } 
  86.     }; 
  87.  
  88.  
  89. </span> 
<span style="font-family:Comic Sans MS;font-size:18px;">package com.example.socketdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

@SuppressLint("HandlerLeak")
public class SocketDemo extends Activity {
	/** Called when the activity is first created. */
	private Button btn_receive;
	private TextView txt;
	private String line;
	
	private static final String HOST = "192.168.1.101";  
	private static final int PORT = 9999;  


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

	private void initControl() {
		btn_receive = (Button) findViewById(R.id.btn_receive);
		txt = (TextView) findViewById(R.id.txt);
		btn_receive.setOnClickListener(new ReceiverListener());
	}

	
	@SuppressLint("HandlerLeak")
	class ReceiverListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			new Thread() {
				@Override
				public void run() {
					// 执行完毕后给handler发送一个空消息
					try {
						// 实例化Socket
						Socket socket = new Socket(HOST, PORT);
						// 获得输入流
						BufferedReader br = new BufferedReader(
								new InputStreamReader(socket.getInputStream()));
						line = br.readLine();
						br.close();
					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					handler.sendEmptyMessage(0);
				}
			}.start();
		}

	}

	// 定义Handler对象
	private Handler handler = new Handler() {
		@Override
		// 当有消息发送出来的时候就执行Handler的这个方法
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			// 处理UI
			txt.setText(line);
			Log.i("PDA", "----->" + line);
		}
	};

}

</span>


       效果图如下:

                                     

另外在配置文件中记得加上权限:<uses-permission android:name="android.permission.INTERNET">

       测试的时候先启动服务端,然后启动客户端,点击按钮就可获取到服务端信息。这是在是一个灰常简单的有关android socket的小例子,可以初步对socket有个简单的了解,这个笔记就先记到这里!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值