您的位置:首页 > 移动开发 > Android开发

android真机最简socket联网例子

2015-11-24 14:20 561 查看
服务器

采用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防火墙,点击“打开或关闭防火墙”,要设置为下图才行哦!!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: