android真机最简socket联网例子

来源:互联网 发布:淘宝android客户端 编辑:程序博客网 时间:2024/05/21 07:09

服务器

  采用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 blocke.printStackTrace();}// 创建一个ServerSocket,用于监听客户端Socket的连接请求ServerSocket ss = new ServerSocket(30000);  // ①// 采用循环不断接受来自客户端的请求while (true){// 每当接受到客户端Socket的请求,服务器端也对应产生一个SocketSocket s = ss.accept();OutputStream os = s.getOutputStream();os.write(" 您好,您收到了服务器的新年祝福!\n".getBytes("utf-8"));// 关闭输出流,关闭Socketos.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 = "";@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);show = (EditText) findViewById(R.id.show);final Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg){if (msg.what == 0x123) {show.setText(receMsg);}}};new Thread(){@Overridepublic 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地址,而不是以太网ipInetSocketAddress isA = new InetSocketAddress("192.168.1.116", 30000);socket.connect(isA, 5000); //设置5秒后还联不上就超时Log.v("net", "after connect!"); // 将Socket对应的输入流包装成BufferedReaderBufferedReader 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);// 关闭输入流、socketbr.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"><EditTextandroid: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防火墙,点击“打开或关闭防火墙”,要设置为下图才行哦!!



0 0