设为首页 收藏本站
查看: 1150|回复: 0

[经验分享] Android 局域网Phone端Socket通信-wifi 聊天应用

[复制链接]

尚未签到

发表于 2015-9-30 12:06:38 | 显示全部楼层 |阅读模式
  到公司第一天,老大说要个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 }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-120914-1-1.html 上篇帖子: 创建wifi热点---让手机共享笔记本网络 下篇帖子: [quote] Porting WiFi drivers to Android
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表