android studio socket编程实例
(4)關閉打開的流
out.close();********************************************
在寫代碼的過程中一定要注意對socket??輸入流??輸出流的關閉
下面是一個簡單的例子:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ?
? ? android:orientation="vertical"
? ? android:layout_width="fill_parent" ?
? ? android:layout_height="fill_parent"> ?
? ? <TextView
? ? ? ? android:id="@+id/TextView"
? ? ? ? android:singleLine="false" ?
? ? ? ? android:layout_width="fill_parent" ?
? ? ? ? android:layout_height="wrap_content" /> ?
? ? <EditText android:hint="content"
? ? ? ? android:id="@+id/EditText01" ?
? ? ? ? android:layout_width="fill_parent" ?
? ? ? ? android:layout_height="wrap_content"> ?
? ? </EditText> ?
? ? <Button
? ? ? ? android:text="send"
? ? ? ? android:id="@+id/Button02" ?
? ? ? ? android:layout_width="fill_parent" ?
? ? ? ? android:layout_height="wrap_content"> ?
? ? </Button> ?
</LinearLayout>
下面是android客戶端的源代碼:
package com.android.SocketDemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SocketDemo extends Activity implements Runnable {
? ? private TextView tv_msg = null;
? ? private EditText ed_msg = null;
? ? private Button btn_send = null;
// ? ?private Button btn_login = null;
? ? private static final String HOST = "192.168.1.223";
? ? private static final int PORT = 9999;
? ? private Socket socket = null;
? ? private BufferedReader in = null;
? ? private PrintWriter out = null;
? ? private String content = "";
? ? /** Called when the activity is first created. */
? ? @Override
? ? public void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.main);
? ? ? ? tv_msg = (TextView) findViewById(R.id.TextView);
? ? ? ? ed_msg = (EditText) findViewById(R.id.EditText01);
// ? ? ? ?btn_login = (Button) findViewById(R.id.Button01);
? ? ? ? btn_send = (Button) findViewById(R.id.Button02);
? ? ? ? try {
? ? ? ? ? ? socket = new Socket(HOST, PORT);
? ? ? ? ? ? in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? ? ? out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(
? ? ? ? ? ? ? ? ? ? socket.getOutputStream())), true);
? ? ? ? } catch (IOException ex) {
? ? ? ? ? ? ex.printStackTrace();
? ? ? ? ? ? ShowDialog("login exception" + ex.getMessage());
? ? ? ? }
? ? ? ? btn_send.setOnClickListener(new Button.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View v) {
? ? ? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? ? ? String msg = ed_msg.getText().toString();
? ? ? ? ? ? ? ? if (socket.isConnected()) {
? ? ? ? ? ? ? ? ? ? if (!socket.isOutputShutdown()) {
? ? ? ? ? ? ? ? ? ? ? ? out.println(msg);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? //啟動線程,接收服務器發送過來的數據
? ? ? ? new Thread(SocketDemo.this).start();
? ? }
? ? //如果連接出現異常,彈出AlertDialog!
? ? public void ShowDialog(String msg) {
? ? ? ? new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
? ? ? ? ? ? ? ? .setPositiveButton("ok", new DialogInterface.OnClickListener() {
? ? ? ? ? ? ? ? ? ? @Override
? ? ? ? ? ? ? ? ? ? public void onClick(DialogInterface dialog, int which) {
? ? ? ? ? ? ? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }).show();
? ? }
? ? //讀取服務器發來的信息,并通過Handler發給UI線程
? ? public void run() {
? ? ? ? try {
? ? ? ? ? ? while (true) {
? ? ? ? ? ? ? ? if (socket.isConnected()) {
? ? ? ? ? ? ? ? ? ? if (!socket.isInputShutdown()) {
? ? ? ? ? ? ? ? ? ? ? ? if ((content = in.readLine()) != null) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? content += "\n";
? ? ? ? ? ? ? ? ? ? ? ? ? ? mHandler.sendMessage(mHandler.obtainMessage());
? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? //接收線程發送過來信息,并用TextView顯示
? ? public Handler mHandler = new Handler() {
? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? super.handleMessage(msg);
? ? ? ? ? ? tv_msg.setText(tv_msg.getText().toString() + content);
? ? ? ? }
? ? };
}
下面是服務器端得java代碼:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
? ? private static final int PORT = 9999;
? ? private List<Socket> mList = new ArrayList<Socket>();
? ? private ServerSocket server = null;
? ? private ExecutorService mExecutorService = null; //thread pool
? ??
? ? public static void main(String[] args) {
? ? ? ? new Main();
? ? }
? ? public Main() {
? ? ? ? try {
? ? ? ? ? ? server = new ServerSocket(PORT);
? ? ? ? ? ? mExecutorService = Executors.newCachedThreadPool(); ?//create a thread pool
? ? ? ? ? ? System.out.print("服務器已啟動...");
? ? ? ? ? ? Socket client = null;
? ? ? ? ? ? while(true) {
? ? ? ? ? ? ? ? client = server.accept();
? ? ? ? ? ? ? ? //把客戶端放入客戶端集合中
? ? ? ? ? ? ? ? mList.add(client);
? ? ? ? ? ? ? ? mExecutorService.execute(new Service(client)); //start a new thread to handle the connection
? ? ? ? ? ? }
? ? ? ? }catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? }
? ? }
? ? class Service implements Runnable {
? ? ? ? ? ? private Socket socket;
? ? ? ? ? ? private BufferedReader in = null;
? ? ? ? ? ? private String msg = "";
? ? ? ? ? ??
? ? ? ? ? ? public Service(Socket socket) {
? ? ? ? ? ? ? ? this.socket = socket;
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
? ? ? ? ? ? ? ? ? ? //客戶端只要一連到服務器,便向客戶端發送下面的信息。
? ? ? ? ? ? ? ? ? ? msg = "user" +this.socket.getInetAddress() + "come toal:"
? ? ? ? ? ? ? ? ? ? ? ? +mList.size();
? ? ? ? ? ? ? ? ? ? this.sendmsg();
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? } ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? ? ? @Override
? ? ? ? ? ? public void run() {
? ? ? ? ? ? ? ? // TODO Auto-generated method stub
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? while(true) {
? ? ? ? ? ? ? ? ? ? ? ? if((msg = in.readLine())!= null) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? //當客戶端發送的信息為:exit時,關閉連接
? ? ? ? ? ? ? ? ? ? ? ? ? ? if(msg.equals("exit")) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? System.out.println("ssssssss");
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? mList.remove(socket);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? in.close();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? msg = "user:" + socket.getInetAddress()
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + "exit total:" + mList.size();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? socket.close();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.sendmsg();
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //接收客戶端發過來的信息msg,然后發送給客戶端。
? ? ? ? ? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? msg = socket.getInetAddress() + ":" + msg;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.sendmsg();
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (Exception e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ??
? ? ? ? ? ?//循環遍歷客戶端集合,給每個客戶端都發送信息。
? ? ? ? ? ?public void sendmsg() {
? ? ? ? ? ? ? ?System.out.println(msg);
? ? ? ? ? ? ? ?int num =mList.size();
? ? ? ? ? ? ? ?for (int index = 0; index < num; index ++) {
? ? ? ? ? ? ? ? ? ?Socket mSocket = mList.get(index);
? ? ? ? ? ? ? ? ? ?PrintWriter pout = null;
? ? ? ? ? ? ? ? ? ?try {
? ? ? ? ? ? ? ? ? ? ? ?pout = new PrintWriter(new BufferedWriter(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?new OutputStreamWriter(mSocket.getOutputStream())),true);
? ? ? ? ? ? ? ? ? ? ? ?pout.println(msg);
? ? ? ? ? ? ? ? ? ?}catch (IOException e) {
? ? ? ? ? ? ? ? ? ? ? ?e.printStackTrace();
? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?}
? ? ? ? ? ?}
? ? ? ? } ? ?
}
注意在AndroidManifest.xml中加入對網絡的訪問權限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
在寫代碼的過程中一定要注意對套接字和輸入/輸出流的關閉
解析:除了isClose方法,Socket類還有一個isConnected方法來判斷Socket對象是否連接成功。??看到這個名字,也許讀者會產生誤解。??其實isConnected方法所判斷的并不是Socket對象的當前連接狀態,??而是Socket對象是否曾經連接成功過,如果成功連接過,即使現在isClose返回true, isConnected仍然返回true。因此,要判斷當前的Socket對象是否處于連接狀態, 必須同時使用isClose和isConnected方法, 即只有當isClose返回false,isConnected返回true的時候Socket對象才處于連接狀態。 雖然在大多數的時候可以直接使用Socket類或輸入輸出流的close方法關閉網絡連接,但有時我們只希望關閉OutputStream或InputStream,而在關閉輸入輸出流的同時,并不關閉網絡連接。這就需要用到Socket類的另外兩個方法:shutdownInput和shutdownOutput,這兩個方法只關閉相應的輸入、輸出流,而它們并沒有同時關閉網絡連接的功能。和isClosed、isConnected方法一樣,Socket類也提供了兩個方法來判斷Socket對象的輸入、輸出流是否被關閉,這兩個方法是isInputShutdown()和isOutputShutdown()。 shutdownInput和shutdownOutput并不影響Socket對象的狀態。
?super.onCreate(savedInstanceState);
????????// android3.0以后需要加入以下的代碼,否則會報socket連接異常的錯誤
????????StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());?
????????StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath().build());??
????????setContentView(R.layout.activity_login);
總結
以上是生活随笔為你收集整理的android studio socket编程实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国产科幻FPS大作来了!《边境》官宣4月
- 下一篇: 11.38万起 新款广汽丰田雷凌上市:混