android真机最简socket联网例子

服务器

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



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天马流星2719

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值