zoukankan      html  css  js  c++  java
  • Android 局域网Phone端Socket通信wifi 聊天应用

    到公司第一天,老大说要个Android Native的app。在局域网Wifi下,phone端可以互相发送信息实现聊天。My God,我可从来没有弄过这个啊。没办法,现学呗。

    首先想到Socket编程,但是得有Server端。但是手机应用啊。不能在PC再给开个Server吧。所以两个Phone端就互为Client,互为Server端。大方向确定后,先用PC机当server来通信,毕竟网上这方面文章多,继尔建个新的Android App 当Server端,怎么在模拟器中模拟两个手机端口的通信。简单说就是用PC redirect 到emulator端口。.参照我的另一篇文章。http://www.cnblogs.com/fengjian/archive/2012/07/05/2578519.html

    下面的代码为完整的Activity,仅同时支持单个Client。你可以用ExecutorService来实现多个请求。请参照http://www.blogjava.net/sterning/archive/2007/10/15/152940.html

    基本的流程是在Create的时候,就开启Server Thread服务来监听Client。当点击send的时候来请求建立Socket连接。

    在真正环境下测试过,注意路由器的防火墙设置。

      1 public class ChatActivity extends Activity {
      2 
      3 private TextView tv_ip = null;
      4 private TextView tv_showmes = null;
      5 private EditText ed_msg = null;
      6 private Button btn_send = null;
      7 private static final int PORT = 8192;
      8 private static final int SERVERPORT = 8192; // listen port
      9 
     10 /** Called when the activity is first created. */
     11 
     12 @Override
     13 public void onCreate(Bundle savedInstanceState) {
     14 super.onCreate(savedInstanceState);
     15 setContentView(R.layout.activity_chat);
     16 // init client;
     17 tv_ip = (TextView) findViewById(R.id.et_ip);
     18 tv_showmes = (TextView) findViewById(R.id.tv_mes_show);
     19 ed_msg = (EditText) findViewById(R.id.et_mes);
     20 // btn_login = (Button) findViewById(R.id.Button01);
     21 btn_send = (Button) findViewById(R.id.btn_send);    
     22 
     23 new Thread(new Service()).start();
     24 
     25 btn_send.setOnClickListener(new Button.OnClickListener() {
     26 public void onClick(View v) {
     27 try {
     28 String chathost = tv_ip.getText().toString().trim();
     29 Socket socket = new Socket(chathost, PORT);
     30 BufferedReader in = new BufferedReader(
     31 new InputStreamReader(socket.getInputStream()));
     32 PrintWriter out = new PrintWriter(new BufferedWriter(
     33 new OutputStreamWriter(socket.getOutputStream())),
     34 true);
     35 String msg = ed_msg.getText().toString()+"\n";
     36 if (socket.isConnected()) {
     37 if (!socket.isOutputShutdown()) {
     38 out.write(msg);
     39 out.flush();
     40 }
     41 }
     42 } catch (IOException ex) {
     43 ShowDialog("The IP address can't access!");
     44 }
     45 Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 
     46 long[] pattern = {100, 50, 100, 50, 100, 50, 100, 50}; // OFF/ON/OFF/ON... 
     47 vibrator.vibrate(pattern, -1);
     48 }
     49 });
     50 
     51 }
     52 
     53 
     54 public Handler mHandler = new Handler() { 
     55 @Override
     56 public void handleMessage(Message msg) {
     57 super.handleMessage(msg);
     58 Bundle b = msg.getData();
     59 String mesg = b.getString("mes");
     60 tv_showmes.setText(tv_showmes.getText().toString() + mesg+"\n"); 
     61 }
     62 };
     63 
     64 public void ShowDialog(String msg) {
     65 new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
     66 .setPositiveButton("ok", new DialogInterface.OnClickListener() {
     67 
     68 public void onClick(DialogInterface dialog, int which) {
     69 // TODO Auto-generated method stub
     70 
     71 }
     72 }).show();
     73 }
     74 
     75 @Override
     76 public boolean onCreateOptionsMenu(Menu menu) {
     77 getMenuInflater().inflate(R.menu.activity_chat, menu);
     78 return true;
     79 }
     80 
     81 class Service implements Runnable {
     82 private Socket socket; 
     83 private BufferedReader in = null; 
     84 private String msg = ""; 
     85 private ServerSocket server = null;
     86 
     87 public void run() {
     88 Looper.prepare();
     89 try {
     90 server = new ServerSocket(SERVERPORT);
     91 } catch (IOException e1) {
     92 // TODO Auto-generated catch block
     93 e1.printStackTrace();
     94 }
     95 while(true){
     96 try { 
     97 socket = server.accept();
     98 in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     99 msg = "user" +this.socket.getInetAddress().toString() + ":" 
    100 +in.readLine(); 
    101 
    102 //notice the UI thread to refactor the ui 
    103 Message message = new Message();
    104 Bundle b = new Bundle();
    105 b.putString("mes", msg);
    106 message.setData(b); 
    107 ChatActivity.this.mHandler.sendMessage(message);
    108 
    109 } catch (IOException e) { 
    110 e.printStackTrace(); 
    111 }
    112 }
    113 } 
    114 }
    115 
    116 
    117 }
  • 相关阅读:
    20191105 《Spring5高级编程》笔记-第10章
    Overview of the High Efficiency Video Coding (HEVC) Standard阅读笔记
    web视频播放
    ffmpeg使用笔记
    ffplay使用笔记
    ffmpeg安装配置以及库调用
    ffmpeg入门
    Faster-RCNN
    OJ练习
    python搭建友盟以及个推推送web服务器
  • 原文地址:https://www.cnblogs.com/fengjian/p/2578484.html
Copyright © 2011-2022 走看看