一、什么是AndroidSocket
AndroidSocket,即Android套接字,它是一种实现安卓客户端与服务器之间通信的方法。通过套接字,Android客户端可与服务器建立连接,发送和接收数据,实现实时通信功能。
二、AndroidSocket的工作原理
AndroidSocket的工作原理主要分为以下三个过程:
- 创建Socket对象,在客户端为客户端Socket对象,在服务器端为服务器端Socket对象,通过指定服务器的IP地址和端口号来创建和服务器端建立连接;
- 通过输入输出流向服务器发送数据和接受数据;
- 关闭Socket连接。
//客户端
try {
Socket socket = new Socket(SERVER_IP_ADDRESS, SERVER_PORT);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
dos.writeUTF("Hello server!");
String response = dis.readUTF();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
//服务器端
try {
ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
Socket socket = serverSocket.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
String request = dis.readUTF();
dos.writeUTF("Hello client!");
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
三、如何在Android应用中使用AndroidSocket
实现AndroidSocket需要注意以下几点:
- 不要在主线程中创建Socket连接;
- 使用线程池来控制Socket连接的创建和销毁;
- 使用Handler来将子线程中的数据更新到主线程中。
下面是一个使用AndroidSocket实现聊天室功能的示例代码:
public class MainActivity extends Activity {
private static final String SERVER_IP_ADDRESS = "192.168.0.101";
private static final int SERVER_PORT = 8888;
private ScrollView mScrollView;
private LinearLayout mContainer;
private EditText mMessageEditText;
private Button mSendButton;
private BufferedReader mBufferedReader;
private PrintWriter mPrintWriter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mScrollView = (ScrollView) findViewById(R.id.scrollView);
mContainer = (LinearLayout) findViewById(R.id.container);
mMessageEditText = (EditText) findViewById(R.id.messageEditText);
mSendButton = (Button) findViewById(R.id.sendButton);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String message = mMessageEditText.getText().toString();
mPrintWriter.println(message);
mMessageEditText.setText("");
}
});
initSocket();
}
private void initSocket() {
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket(SERVER_IP_ADDRESS, SERVER_PORT);
mBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
mPrintWriter = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = mBufferedReader.readLine()) != null) {
Message handlerMessage = mHandler.obtainMessage();
handlerMessage.obj = message;
mHandler.sendMessage(handlerMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
String message = (String) msg.obj;
TextView textView = new TextView(MainActivity.this);
textView.setText(message);
mContainer.addView(textView);
mScrollView.fullScroll(View.FOCUS_DOWN);
}
};
}
四、AndroidSocket实现的优缺点
AndroidSocket实现了实时通信功能,可以及时地将信息传输到对方设备上,非常便于实现聊天室、网络游戏等功能。但是,使用AndroidSocket需要注意线程安全性,需要在线程池中处理Socket连接的创建和销毁,并且需要使用Handler将数据更新到主线程中。