Android Socket通讯

来源:互联网 发布:mac怎么同时登陆2个qq 编辑:程序博客网 时间:2024/05/20 07:34

这里我给大家简单介绍利用socket通讯,里面包含了Handler刷新Ui操作

首先我们来看一下Android客户端的代码

下面是MainActivity类

package com.example.testsocket;

import java.io.UnsupportedEncodingException;

import org.apache.http.util.EncodingUtils;

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.Toast;

public class MainActivity extends Activity {
 private EditText ed;
 private Button but;
 Handler h = new Handler(){

  @Override
  public void handleMessage(Message msg) {//建立handler对象刷新UI
   // TODO Auto-generated method stub
   super.handleMessage(msg);
   switch(msg.what){
   case 1:
    
   Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_SHORT).show();
    
   break;
   }
  }
  
  };
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  InitView();
 }

 public void InitView(){//初始化及监听
  ed = (EditText)findViewById(R.id.input);
  but = (Button)findViewById(R.id.bok);
  but.setOnClickListener(new OnClickListener() {
   
   @Override
   public void onClick(View arg0) {
    // TODO Auto-generated method stub
    java_socket joc = new java_socket(MainActivity.this,ed.getText().toString(),h);
    new Thread(joc).start();//启动线程类(java_socket是一个线程类)
   }
  });
 }
 @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;
 }

}

 

之后我们再看看线程类是如何操作的

package com.example.testsocket;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import org.apache.http.util.EncodingUtils;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

public class java_socket implements Runnable {
 private Socket sok;//socket对象
 private OutputStream os;//输出流用于向服务器传递数据
 private String name;//传递服务器的名字
 private BufferedOutputStream bos;
 private InputStream ins;//输入流对象用于读取服务的字符串
 private BufferedInputStream bin;
 private Context con;//上下文对象
 private Handler h;//Hnadler回掉
 public java_socket(Context con,String name,Handler h) {
  super();
  this.name=name;
  this.con=con;
  this.h=h;
 }


 @Override
 public void run() {//run方法
  // TODO Auto-generated method stub
   try {
    sok = new Socket("192.168.1.109", 79);//服务器地址和端口号建立socket流对象
    os = new DataOutputStream(sok.getOutputStream());//获取socket输出流用于向服务器传递数据   
    bos = new BufferedOutputStream(os);//包装流缓冲区
    bos.write(name.getBytes("utf-8"));//向服务器传递数据
    ins = new DataInputStream(sok.getInputStream());//获取socket输入流用于读取服务端传递过来的字符串
    bin = new BufferedInputStream(ins);//包装输入流
    byte by[] = new byte[1024];//字节缓冲区
    int in=bin.read(by);//把数据读取到缓冲区并返回读取的字符个数
    if(in!=-1){//如果读取的字符个数不为-1就建立message对象向主线程刷新UI
     String str = EncodingUtils.getString(by, "utf-8");//将缓冲区的字节转换成UTF-8编码
     Message ms = new Message();
     ms.what=1;
     ms.obj=str;
     h.sendMessage(ms);
    }
    // TODO Auto-generated catch block
    
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   
   }finally{
    if(bos!=null){
     try {
      bos.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if(os!=null){
     try {
      os.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    
    }
    if(bin!=null){
     try {
      bin.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    if(ins!=null){
     try {
      ins.close();
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   }
 }

}

下面是服务端代码

首先我们来看程序的入口类

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class mainSocket {
 private Socket scoket;
 private ServerSocket ser;
 
 public void thread(){
  try {
   System.out.println("服务器已启动......");
   ser = new ServerSocket(79);
   while(true){
   scoket = ser.accept();
   System.out.println("以连接服务器");
   test ttt = new test(scoket);
   new Thread(ttt).start();
   }
   
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  
  
 }
public static void main(String[] args) {
 mainSocket m = new mainSocket();
 m.thread();
}
}

 

下面我们再看看线程类

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.stream.FileImageInputStream;

import org.apache.http.util.EncodingUtils;
import org.omg.CORBA.portable.OutputStream;


public class test implements Runnable{
 private Socket sc;
 private InputStream ins;
 private BufferedInputStream br;
 private DataOutputStream output;
 private BufferedOutputStream bo;
 public test(Socket sc) {
  super();
  this.sc = sc;
  
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  try {
   ins = new DataInputStream(sc.getInputStream());
   br = new BufferedInputStream(ins);
   output = new DataOutputStream(sc.getOutputStream());
   output.writeUTF("已成功连接服务器");
   byte[] b = new byte[1024];
   br.read(b);
   if(br!=null){
    String str = EncodingUtils.getString(b,"utf-8");
    System.out.println(str);
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }finally{
   
    if(ins!=null){
     try {
      ins.close();
     } catch (Exception e2) {
      // TODO: handle exception
     }
     if(output!=null){
      try {
       output.close();
      } catch (Exception e2) {
       // TODO: handle exception
      }
     }
    }
   }
  }
  
 
 

}

 

最后我们不要忘了加入Internet权限

首先我们再来看一下效果图

0 0