WIFI环境下Android手机和电脑通信

前面已经写过一篇java实现最基础的socket网络通信,这篇和之前那篇大同小异,只是将客户端代码移植到手机中,然后获取本机IP的方法略有不同。

先讲一下本篇中用到Android studio的使用吧

使用Android studio开发Android最基本的3个步骤:

(1)新建工程

(2)在XML布局文件中定义应用程序的用户界面。

点击画圈中的Design和Text可以切换界面

(3)在java代码中编写业务实现。

这里面用来写java代码

另外这篇文章还需要添加用户权限

好了,可以上代码了:

Android服务器端代码:

package com.example.x_yp.socket;

import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import java.net.*;
import java.io.*;

public class MainActivity extends ActionBarActivity
{

    //定义侦听端口号
    final int SERVER_PORT = 30000;
    @Override

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //打印本机的IP地址
        TextView myip=(TextView)findViewById(R.id.myip);
        myip.setText(getLocalIpAddress());
        //开一个新的线程来侦听客户端连接
       new Thread()
        {
            public void run()
            {
                startServer();
            }
        }.start();
    }
    // 得到本机WIFI下的ip地址
    private String getLocalIpAddress()
    {
        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        // 获取32位整型IP地址
        int ipAddress = wifiInfo.getIpAddress();

        //返回整型地址转换成“*.*.*.*”地址
        return String.format("%d.%d.%d.%d",
                (ipAddress & 0xff), (ipAddress >> 8 & 0xff),
                (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
    }

    //进行socket连接通信
    private void startServer()
    {
        try
        {
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            //循环侦听客户端连接请求
            while (true)
            {
                Socket ss = serverSocket.accept();
                try
                {
                    // 将Socket对应的输出流包装成PrintStream
                    PrintStream ps = new PrintStream(ss.getOutputStream());
                    // 进行普通IO操作
                    ps.println("hello,you have recevied sever's messege");
                    // 关闭输出流,关闭Socket
                    ps.close();
                    ss.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                finally
                {
                    ss.close();
                }
                Thread.sleep(3000);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

PC客户端代码:

/**
PC端代码
PC作为客户端,根据服务器的IP地址和端口号连接服务器
*/
import java.net.*;
import java.io.*;

public class PC_Client
{
    public static void main(String[] args)
        throws IOException
    {
        //Socket socket = new Socket("192.168.47.1" , 30000);//这里的IP地址填写手机端服务器的IP地址
        Socket socket = new Socket("192.168.1.114" , 30000);//这里的IP地址填写手机端服务器的IP地址
        // 将Socket对应的输入流包装成BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // 进行普通IO操作
        String line = br.readLine();
        System.out.println("来自服务器的数据:" + line);
        // 关闭输入流、socket
        br.close();
        socket.close();
    }
}

OK,下载到手机中,手机和电脑可以通信了

 补充一下用到的图形界面的内容:

这里添加完控件之后,设置一个ID,这里设置成了myip

然后java程序中,通过 findViewById函数与控件相连接,

这里用TextView myip=(TextView)findViewById(R.id.myip);

然后就可以在java中控制控件了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏wOw的Android小站

[Android][Framework] 从一个小问题了解STK加载内容的方式

这个界面从哪来的? 实际上,我们插入SIM卡,手机就会显示SimToolKit,打开就能看到一些和运营商相关的菜单。换了不同的卡菜单也会变。所以大概可以猜到,S...

27310
来自专栏漏斗社区

天空飘来五字:Android逆向smali

本期,我们将继续Android逆向动态分析之smali篇。内容包括smali语言介绍与动态调试。

13520
来自专栏知识分享

android 之TCP客户端编程

吸取教训!!!本来花了5个小时写完了,没想到,,,因为没点上面的自动保存查看一下,全没了,重新写呗 关于网络通信:每一台电脑都有自己的ip地址,每台电脑上的网络...

38880
来自专栏向治洪

Android Remote Views

听名字就可以看出,remote views是一种远程view,感觉有点像远程service,其实remote views是view的一个结构,他可以在其他的进程...

20470
来自专栏Android知识点总结

O1-开源框架使用之EventBus

说明使用POSTING,发布与订阅在同一个线程,也就是子线程,更新UI会崩 说明使用MAIN,不管发布者在哪,订阅者都在main线程,可更新UI,但不能耗时操...

11320
来自专栏非著名程序员

Retrofit初探和简单使用

? Retrofit简单介绍 Retrofit是Square提供的开源产品,为Android平台的应用提供一个类型安全的REST客户端。它是基于注解,提供 J...

21290
来自专栏androidBlog

ARouter 使用教程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

38010
来自专栏向治洪

android插件开发机制

插件机制实质上就是由主体程序定义接口,然后由插件去实现这些接口,以达到功能模块化。Android系统是基于Linux内核的,其安全机制也继承了Linux的特性...

23470
来自专栏郭霖

Android ListView异步加载图片乱序问题,原因分析及解决方案

在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼。比...

421100
来自专栏三流程序员的挣扎

Navigation 详解一

Navigation 是 JetPack 中的一个组件,用于方便的实现页面的导航,所以抽象出了一个 destination 的概念,大部分情况一个 destin...

23610

扫码关注云+社区

领取腾讯云代金券