您的位置:首页 > 移动开发 > Android开发

android socket编程实例

2014-05-31 23:17 423 查看
原文:http://blog.csdn.net/wuchuanpingstone/article/details/6617276

android客户端通过socket与服务器进行通信可以分为以下几步:

应用程序与服务器通信可以采用两种模式:TCP可靠通信 和UDP不可靠通信。

(1)通过IP地址和端口实例化Socket,请求连接服务器:

     socket = new Socket(HOST, PORT);   //host:为服务器的IP地址  port:为服务器的端口号

(2)获取Socket流以进行读写,并把流包装进BufferWriter或者PrintWriter:

   PrintWriter out =
new PrintWriter( new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),true);

   这里涉及了三个类:socket.getOutputStream得到socket的输出字节流,OutputStreamWriter是字节流向字符流转换的桥梁,BufferWriter是字符流,然后再包装进PrintWriter。

(3)对Socket进行读写

     if (socket.isConnected()) {

                    if (!socket.isOutputShutdown()) {

                        out.println(msg);

                    }

                }

(4)关闭打开的流

      out.close();

在写代码的过程中一定要注意对socket  输入流  输出流的关闭

下面是一个简单的例子:

main.xml

[html]
view plaincopyprint?

<?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>  

<?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客户端的源代码:

[java]
view plaincopyprint?

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(); 

    } 
 
    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(); 
    } 
 
    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(); 
        } 
    } 
 
    public Handler mHandler =
new Handler() { 
        public void handleMessage(Message msg) { 

            super.handleMessage(msg); 

            tv_msg.setText(tv_msg.getText().toString() + content); 

        } 
    }; 


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();
}

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();
}

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();
}
}

public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
tv_msg.setText(tv_msg.getText().toString() + content);
}
};
}


下面是服务器端得java代码:

[java]
view plaincopyprint?

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("server start ..."); 

            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) { 
                            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; 

                            } 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(); 
                   } 
               } 
           } 
        }     


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("server start ...");
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) {
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;
} 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>

在写代码的过程中一定要注意对套接字和输入/输出流的关闭
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: