我们先来介绍一下 Android 编程中使用 Socket 与服务器进行通信的方法。
什么是 Socket?
Socket,即“套接字”,是一种网络通信的方式。在进行网络通信时,程序之间需要建立起通信链路,Socket 就是建立该通信链路所使用的一种方法。在 Android 编程中,可以使用 Socket 进行与服务器的通信,使得客户端与服务器之间可以进行数据的交换。
Android 中使用 Socket 进行通信
在 Android 中使用 Socket 进行通信的基本步骤如下:
- 创建 Socket 对象
- 建立连接
- 发送数据
- 接收数据
- 关闭连接
下面我们来详细介绍每个步骤的具体实现方法。
1. 创建 Socket 对象
在 Android 中,可以使用 Java 中的 Socket 类来创建 Socket 对象。创建方式为:
Socket socket = new Socket(ip, port);
其中,ip
为服务器的 IP 地址,port
为服务器的端口号。通过这个语句,就可以创建一个 Socket 对象。
2. 建立连接
Socket 对象创建完毕后,可以通过调用 connect()
方法来建立与服务器的连接。代码示例:
socket.connect(new InetSocketAddress(ip, port), timeout);
其中,ip
是服务器的 IP 地址,port
是服务器的端口号,timeout
是连接的超时时间,单位为毫秒。
3. 发送数据
连接建立之后,可以通过 OutputStream
对象来向服务器发送数据。代码示例:
String message = "Hello, server!";
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());
其中,message
是要发送的消息,os
是通过 Socket
对象获取到的 OutputStream
对象。
4. 接收数据
向服务器发送完消息后,可以通过 InputStream
对象来接收服务器返回的消息。代码示例:
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);
其中,is
是通过 Socket
对象获取到的 InputStream
对象,buffer
是用来存储接收数据的字节数组,count
是实际接收到的字节数,response
是服务器返回的消息。
5. 关闭连接
通信完成后,需要关闭连接。代码示例:
socket.close();
这样就可以关闭连接,释放资源。
示例介绍
下面我们来介绍两个使用 Socket 与服务器进行通信的示例。
示例1:获取服务器时间
客户端发送请求给服务器,服务器返回当前的时间。具体代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String SERVER_IP = "192.168.1.100";
private static final int SERVER_PORT = 12345;
private TextView mResponseTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResponseTv = findViewById(R.id.tv_response);
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);
mResponseTv.setText(response);
socket.close();
} catch (IOException e) {
Log.e(TAG, "run: ", e);
}
}
}).start();
}
}
示例2:与服务器进行聊天
客户端与服务器进行聊天,客户端输入消息发送给服务器,服务器返回相同的消息。具体代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private static final String SERVER_IP = "192.168.1.100";
private static final int SERVER_PORT = 12345;
private EditText mMessageEt;
private ListView mChatLv;
private ChatListAdapter mAdapter;
private List<String> mChatList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMessageEt = findViewById(R.id.et_message);
mChatLv = findViewById(R.id.lv_chat);
mAdapter = new ChatListAdapter(this, mChatList);
mChatLv.setAdapter(mAdapter);
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
while (true) {
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);
mChatList.add("Server: " + response);
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
mChatLv.setSelection(mChatList.size() - 1);
}
});
}
} catch (IOException e) {
Log.e(TAG, "run: ", e);
}
}
}).start();
}
public void sendMessage(View view) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
String message = mMessageEt.getText().toString();
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int count = is.read(buffer);
String response = new String(buffer, 0, count);
mChatList.add("Client: " + response);
runOnUiThread(new Runnable() {
@Override
public void run() {
mMessageEt.setText("");
mAdapter.notifyDataSetChanged();
mChatLv.setSelection(mChatList.size() - 1);
}
});
} catch (IOException e) {
Log.e(TAG, "run: ", e);
}
}
}).start();
}
}
这两个示例分别演示了客户端与服务器之间进行通信的两种情况。具体实现中,我们创建了 Socket 对象,并且利用 InputStream
和 OutputStream
对象来进行数据的接收和发送,使得客户端与服务器之间达到了数据的互通。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android编程之客户端通过socket与服务器通信的方法 - Python技术站