android真机最简socket联网例子
2015-11-24 14:20
561 查看
服务器
采用java程序,新建一个java工程,写一个java类,如下:
Client端:
layout布局文件只有一个Editbox
还要设下联网权限:AndroidManifest.xml文件加上 <uses-permission android:name="android.permission.INTERNET"/>
好了,运行Java服务器程序,打开手机客户端,看看真机联网效果如何,能不能打印出服务器发回的一句话。
这里提下IP地址,
手机用WIFI联PC服务器用的是无线网络的IP,如下图:
使用上面无线网络连接的IP,不要用下面的以太网IP,你可以手机下个Ping软件PING下这个IP能否联通,然后在电脑上ping下你的手机IP(我的小米手机在设置WLAN--高级设置 可看到IP地址)看能否联通,能ping通的话IP地址说明是对的。这里注意手机和PC的IP要在一个网段里才能联通,如手机IP 192.168.1.207, PC ip是192.168.1.116,你如果电脑和手机都是用一个wifi上网肯定在一个网段内的。还有端口号要正确。
但你可能仍然出现 connection timeout情况,这时90%可能性是防火墙禁用你程序联网了。关掉你所有的杀毒和电脑管家,再到控制面板看看你的windows防火墙,点击“打开或关闭防火墙”,要设置为下图才行哦!!
采用java程序,新建一个java工程,写一个java类,如下:
import java.net.*; import java.io.*; /** * Description: * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> * <br/>Copyright (C), 2001-2016, Yeeku.H.Lee * <br/>This program is protected by copyright laws. * <br/>Program Name: * <br/>Date: * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */ public class SimpleServer { public static void main(String[] args) throws IOException { System.out.println("Server start..."); InetAddress ia=null; try { //获取本机IP地址的,可无视这段代码,从下面创建ServerSocket开始看起 ia=ia.getLocalHost(); String localname=ia.getHostName(); String localip=ia.getHostAddress(); System.out.println("本机名称是:"+ localname); System.out.println("本机的ip是 :"+localip); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // 创建一个ServerSocket,用于监听客户端Socket的连接请求 ServerSocket ss = new ServerSocket(30000); // ① // 采用循环不断接受来自客户端的请求 while (true) { // 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket Socket s = ss.accept(); OutputStream os = s.getOutputStream(); os.write(" 您好,您收到了服务器的新年祝福!\n" .getBytes("utf-8")); // 关闭输出流,关闭Socket os.close(); s.close(); } } }
Client端:
package org.crazyit.net; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.widget.EditText; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; public class MainActivity extends Activity { EditText show; String receMsg = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); show = (EditText) findViewById(R.id.show); final Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x123) { show.setText(receMsg); } } }; new Thread() { @Override public void run() { try { Log.v("net", "start connect!"); // 建立连接到远程服务器的Socket //Socket socket = new Socket("192.168.1.116" , 30001); // ① //Socket socket = new Socket("36.62.21.136", 30000); Socket socket = new Socket(); //打开cmd,用ipconfig命令查看您本机的 无线局域网下的ip地址,而不是以太网ip InetSocketAddress isA = new InetSocketAddress("192.168.1.116", 30000); socket.connect(isA, 5000); //设置5秒后还联不上就超时 Log.v("net", "after connect!"); // 将Socket对应的输入流包装成BufferedReader BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); // 进行普通I/O操作 String line = br.readLine(); receMsg = line; //设置接受到的服务器数据 //注意本来是想设置EditText文本的,但只能在UI线程设置,否则会报错,这里只好发消息了。 myHandler.sendEmptyMessage(0x123); //show.setText(line); //这样写会引发异常!! //show.setText("来自服务器的数据:" + line); // 关闭输入流、socket br.close(); socket.close(); } catch(UnknownHostException e) { Log.v("net", "192.168.1.116 is unkown server!"); } catch (IOException e) { Log.v("net", "IO Exception"); e.printStackTrace(); } } }.start(); } }
layout布局文件只有一个Editbox
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" android:editable="false" android:cursorVisible="false" /> </LinearLayout>
还要设下联网权限:AndroidManifest.xml文件加上 <uses-permission android:name="android.permission.INTERNET"/>
好了,运行Java服务器程序,打开手机客户端,看看真机联网效果如何,能不能打印出服务器发回的一句话。
这里提下IP地址,
手机用WIFI联PC服务器用的是无线网络的IP,如下图:
使用上面无线网络连接的IP,不要用下面的以太网IP,你可以手机下个Ping软件PING下这个IP能否联通,然后在电脑上ping下你的手机IP(我的小米手机在设置WLAN--高级设置 可看到IP地址)看能否联通,能ping通的话IP地址说明是对的。这里注意手机和PC的IP要在一个网段里才能联通,如手机IP 192.168.1.207, PC ip是192.168.1.116,你如果电脑和手机都是用一个wifi上网肯定在一个网段内的。还有端口号要正确。
但你可能仍然出现 connection timeout情况,这时90%可能性是防火墙禁用你程序联网了。关掉你所有的杀毒和电脑管家,再到控制面板看看你的windows防火墙,点击“打开或关闭防火墙”,要设置为下图才行哦!!
相关文章推荐
- android程序逆向工程
- C# android base-64 字符数组的无效长度
- Android 框架
- Android开发 布局优化
- IOS和Android OpenGL游戏引擎的集成AdMob新版教程
- Android 框架
- android编译分析之1—概述
- Android & iOS 第三方 Crash ANR 捕捉上传
- Android开发笔记(五)日期的处理
- Android代码资源的国际化
- android国际化(多语言)
- android知识点杂锦
- android studio生成aar包并在其他工程引用aar包
- Android下Bonjour服务的使用
- Android ANR分析
- java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy
- Android线程池
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- android-seekbar的thumb图片不居中显示的处理办法
- android之Widget开发详解实例一