android之socket编程实例

jopen 10年前

注意点:注册访问的网络权限;android中UI线程不能有访问网络的操作,否则会报android.os.NetworkOnMainThreadException的异常

<pre class="html" name="code" snippet_file_name="blog_20131128_1_9516181" code_snippet_id="86031"> <uses-permission android:name="android.permission.INTERNET"/></pre>

客户端

 

package com.android.xiong.simplesocket;    import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.io.OutputStream;  import java.net.InetSocketAddress;  import java.net.Socket;  import java.net.SocketTimeoutException;    import android.app.Activity;  import android.os.Bundle;  import android.os.Handler;  import android.os.Message;  import android.view.Menu;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.Button;  import android.widget.EditText;  import android.widget.TextView;    public class MainActivity extends Activity {   Socket socket = null;   String buffer = "";   TextView txt1;   Button send;   EditText ed1;   String geted1;   public Handler myHandler = new Handler() {    @Override    public void handleMessage(Message msg) {     if (msg.what == 0x11) {      Bundle bundle = msg.getData();      txt1.append("server:"+bundle.getString("msg")+"\n");     }    }     };     @Override   protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    txt1 = (TextView) findViewById(R.id.txt1);    send = (Button) findViewById(R.id.send);    ed1 = (EditText) findViewById(R.id.ed1);    send.setOnClickListener(new OnClickListener() {       @Override     public void onClick(View v) {      geted1 = ed1.getText().toString();      txt1.append("client:"+geted1+"\n");      //启动线程 向服务器发送和接收信息      new MyThread(geted1).start();     }    });     }     class MyThread extends Thread {      public String txt1;      public MyThread(String str) {     txt1 = str;    }      @Override    public void run() {     //定义消息     Message msg = new Message();     msg.what = 0x11;     Bundle bundle = new Bundle();     bundle.clear();     try {      //连接服务器 并设置连接超时为5秒      socket = new Socket();      socket.connect(new InetSocketAddress("1.1.9.30", 30000), 5000);      //获取输入输出流      OutputStream ou = socket.getOutputStream();      BufferedReader bff = new BufferedReader(new InputStreamReader(        socket.getInputStream()));      //读取发来服务器信息      String line = null;      buffer="";      while ((line = bff.readLine()) != null) {       buffer = line + buffer;      }            //向服务器发送信息      ou.write("android 客户端".getBytes("gbk"));      ou.flush();      bundle.putString("msg", buffer.toString());      msg.setData(bundle);      //发送消息 修改UI线程中的组件      myHandler.sendMessage(msg);      //关闭各种输入输出流      bff.close();      ou.close();      socket.close();     } catch (SocketTimeoutException aa) {      //连接超时 在UI界面显示消息      bundle.putString("msg", "服务器连接失败!请检查网络是否打开");      msg.setData(bundle);      //发送消息 修改UI线程中的组件      myHandler.sendMessage(msg);     } catch (IOException e) {      e.printStackTrace();     }    }   }     @Override   public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.main, menu);    return true;   }    }

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      android:layout_width="match_parent"      android:layout_height="match_parent"      android:paddingBottom="@dimen/activity_vertical_margin"      android:paddingLeft="@dimen/activity_horizontal_margin"      android:paddingRight="@dimen/activity_horizontal_margin"      android:paddingTop="@dimen/activity_vertical_margin"      tools:context=".MainActivity" >        <EditText           android:id="@+id/ed1"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:hint="给服务器发送信息"/>      <Button           android:id="@+id/send"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:layout_below="@id/ed1"          android:text="发送"/>      <TextView           android:id="@+id/txt1"          android:layout_width="match_parent"          android:layout_height="wrap_content"          android:layout_below="@id/send"/>                  </RelativeLayout>

服务端

package com.android.net;    import java.io.IOException;  import java.net.ServerSocket;  import java.net.Socket;  import java.util.ArrayList;  import java.util.List;    public class AndroidService {       public static void main(String[] args) throws IOException {    ServerSocket serivce = new ServerSocket(30000);    while (true) {     //等待客户端连接     Socket socket = serivce.accept();     new Thread(new AndroidRunable(socket)).start();    }   }    }

package com.android.net;    import java.io.BufferedReader;  import java.io.BufferedWriter;  import java.io.IOException;  import java.io.InputStream;  import java.io.InputStreamReader;  import java.io.OutputStream;  import java.io.OutputStreamWriter;  import java.io.PrintWriter;  import java.net.Socket;    public class AndroidRunable implements Runnable {     Socket socket = null;     public AndroidRunable(Socket socket) {    this.socket = socket;   }     @Override   public void run() {    // 向android客户端输出hello worild    String line = null;    InputStream input;    OutputStream output;    String str = "hello world!";    try {     //向客户端发送信息     output = socket.getOutputStream();     input = socket.getInputStream();     BufferedReader bff = new BufferedReader(       new InputStreamReader(input));     output.write(str.getBytes("gbk"));     output.flush();     //半关闭socket       socket.shutdownOutput();     //获取客户端的信息     while ((line = bff.readLine()) != null) {      System.out.print(line);     }     //关闭输入输出流     output.close();     bff.close();     input.close();     socket.close();      } catch (IOException e) {     e.printStackTrace();    }     }  }