android基于socket的局域网内服务器与客户端加密通信

  实现了基本的socket通信(即两台设备,一台用作服务器,一台用作客户端),服务器进行监听,客户端发送加密数据到服务器,服务器进行解密得到明文。

  注意:本项目中使用了ButterKnife及EventBus作为辅助工具,通信建立时默认网络正常(未做局域网网络环境检测),加密方式为AES加密

  1.效果图:

  (1)客户端



  (2)服务器端



  2.界面布局部分

  (1)服务器端布局 function_socket_server.xml

  ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:orientation="vertical">

 <RelativeLayout style="@style/ToolBar">

  <TextView

   style="@style/ToolBar_tv_Title"

   android:text="网络加密-服务器端" />

 </RelativeLayout>

 <LinearLayout

  android:layout_width="match_parent"

  android:layout_height="wrap_content"

  android:orientation="horizontal">

  <Button

   android:id="@+id/btn_startListener"

   android:layout_width="0dp"

   android:layout_height="wrap_content"

   android:layout_weight="1"

   android:text="启动监听" />

  <Button

   android:id="@+id/btn_stopListener"

   android:layout_width="0dp"

   android:layout_height="wrap_content"

   android:layout_weight="1"

   android:text="停止监听" />

  <Button

   android:id="@+id/btn_getUser"

   android:layout_width="0dp"

   android:layout_height="wrap_content"

   android:layout_weight="1"

   android:text="刷新用户" />

 </LinearLayout>

 <LinearLayout

  android:layout_width="match_parent"

  android:layout_height="wrap_content"

  android:orientation="horizontal"

  android:padding="10dp">

  <TextView

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:text="本机地址:" />

  <TextView

   android:id="@+id/tv_localAddress"

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

   android:singleLine="true" />

 </LinearLayout>

 <ScrollView

  android:layout_width="match_parent"

  android:layout_height="match_parent">

  <LinearLayout

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

   android:orientation="vertical">

   <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="接收到的明文:"

    android:textColor="@color/black" />

   <TextView

    android:id="@+id/tv_receivedContent"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:padding="10dp" />

   <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="解密后的明文:"

    android:textColor="@color/black" />

   <TextView

    android:id="@+id/tv_decryptContent"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:padding="10dp" />

  </LinearLayout>

 </ScrollView>

</LinearLayout>

  (2)客户端布局 function_socket_client.xml

  ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:orientation="vertical">

 <RelativeLayout style="@style/ToolBar">

  <TextView

   style="@style/ToolBar_tv_Title"

   android:text="网络加密-客户端" />

 </RelativeLayout>

 <LinearLayout

  android:layout_width="match_parent"

  android:layout_height="wrap_content"

  android:orientation="horizontal"

  android:padding="10dp">

  <TextView

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:text="服务器地址:" />

  <EditText

   android:id="@+id/edtTxt_serverAddress"

   android:layout_width="match_parent"

   android:text="192.168.43.1"

   android:layout_height="wrap_content"

   android:singleLine="true" />

 </LinearLayout>

 <ScrollView

  android:layout_width="match_parent"

  android:layout_height="0dp"

  android:layout_weight="1">

  <LinearLayout

   android:layout_width="match_parent"

   android:layout_height="wrap_content"

   android:orientation="vertical">

   <TextView

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="文本内容:"

    android:textColor="@color/black" />

   <EditText

    android:id="@+id/edtTxt_Content"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:background="@color/main_background"

    android:padding="10dp"

    android:text="123木头人" />

  </LinearLayout>

 </ScrollView>

 <Button

  android:id="@+id/btn_encryptAndSend"

  android:layout_width="match_parent"

  android:layout_height="wrap_content"

  android:layout_gravity="bottom"

  android:text="加密并发送" />

</LinearLayout>

  (3)用到的style

  ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

<!--通用Title的右侧按钮-->

<style name="ToolBar_iv_Right">

 <item name="android:layout_width">@dimen/toolbar_icon_dimen</item>

 <item name="android:layout_height">@dimen/toolbar_icon_dimen</item>

 <item name="android:layout_alignParentRight">true</item>

 <item name="android:layout_gravity">end</item>

 <item name="android:clickable">true</item>

 <item name="android:background">?android:actionBarItemBackground</item>

 <item name="android:padding">15dp</item>

</style>

<!--通用Title的TextView-->

<style name="ToolBar_tv_Title">

 <item name="android:layout_width">wrap_content</item>

 <item name="android:layout_height">wrap_content</item>

 <item name="android:layout_centerVertical">true</item>

 <item name="android:layout_marginLeft">@dimen/toolbar_title_haveBack_marginStart</item>

 <item name="android:layout_marginRight">@dimen/toolbar_title_haveBack_marginEnd</item>

 <item name="android:gravity">center</item>

 <item name="android:singleLine">true</item>

 <item name="android:textColor">@color/white</item>

 <item name="android:textSize">20sp</item>

</style>

  3.功能代码

  (1)基类 BaseEventActivity.Java

  ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

import android.os.Bundle;

import android.support.v7.app.AppCompatActivity;

import org.greenrobot.eventbus.EventBus;

import butterknife.ButterKnife;

public abstract class BaseEventActivity extends AppCompatActivity {

 @Override

 public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  getIntentData();

  setContentView(getLayoutResId());

  ButterKnife.bind(this);

  EventBus.getDefault().register(this);

  init();

 }

 protected void getIntentData() {

 }

 @Override

 protected void onDestroy() {

  super.onDestroy();

  EventBus.getDefault().unregister(this);

 }

 protected abstract void init();

 protected abstract int getLayoutResId();

}

  (2)服务器主界面 Function_Socket.java

  ?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

import android.content.ComponentName;

import android.content.Intent;

import android.content.ServiceConnection;

import android.os.IBinder;

import android.view.View;

import android.widget.TextView;

import org.greenrobot.eventbus.Subscribe;

import org.greenrobot.eventbus.ThreadMode;

import java.io.BufferedReader;

import java.io.FileReader;

import java.util.ArrayList;

import butterknife.BindView;

import butterknife.OnClick;

/**

 * 服务器界面

 */

public class Function_Socket_Server extends BaseEventActivity {

 @BindView(R.id.tv_localAddress)

 TextView tv_localAddress;

 @BindView(R.id.tv_receivedContent)

 TextView tv_receivedContent;

 @BindView(R.id.tv_decryptContent)

 TextView tv_decryptContent;

 private LocalService localService;//用于启动监听的服务

 private ServiceConnection sc;//服务连接

 @Override

 protected void init() {

  tv_localAddress.setText(ToolUtil.getHostIP());

  sc = new ServiceConnection() {

   @Override

   public void onServiceConnected(ComponentName name, IBinder service) {

    LocalService.LocalBinder localBinder = (LocalService.LocalBinder) service;

    localService = localBinder.getService();

    localService.startWaitDataThread();

    ToastUtil.showToast(Function_Socket_Server.this, "监听已启动");

   }

   @Override

   public void onServiceDisconnected(ComponentName name) {

   }

  };

  connection();

 }

 @Subscribe(threadMode = ThreadMode.MAIN)

 public void getData(String data) {

  tv_receivedContent.setText(data);

  tv_decryptContent.setText(AESUtil.decrypt(ConstantUtil.password, data));

 }

 /**

  * 绑定service

  */

 private void connection() {

  Intent intent = new Intent(this, LocalService.class);

  bindService(intent, sc, BIND_AUTO_CREATE);

 }

 @Override

 protected int getLayoutResId() {

  return R.layout.function_socket_server;

 }

 /**

  * 获取连接到本机热点上的手机ip

  */

 private ArrayList<String> getConnectedIP() {

  ArrayList<String> connectedIP = new ArrayList<>();

  try {

   //通过读取配置文件实现

   BufferedReader br = new BufferedReader(new FileReader(

     "/proc/net/arp"));

   String line;

   while ((line = br.readLine()) != null) {

    String[] splitted = line.split(" +");

    if (splitted.length >= 4) {

     String ip = splitted[0];

     connectedIP.add(ip);

    }

   }

  } catch (Exception e) {

   e.printStackTrace();

  }

  return connectedIP;

 }

 @OnClick({R.id.btn_startListener, R.id.btn_stopListener, R.id.btn_getUser})

 public void onClick(View v) {

  switch (v.getId()) {

   case R.id.btn_startListener://启动监听

    connection();

    break;

   case R.id.btn_stopListener://停止监听

    if (sc != null)

     unbindService(sc);

    break;

   case R.id.btn_getUser://刷新连接到此设备的IP并清空之前接收到的数据

    ArrayList<String> connectedIP = getConnectedIP();

    StringBuilder resultList = new StringBuilder();

    for (String ip : connectedIP) {

     resultList.append(ip);

     resultList.append("\n");

    }

    ToastUtil.showToast(this, "连接到手机上的Ip是:" + resultList.toString());

    tv_decryptContent.setText("");

    tv_receivedContent.setText("");

    break;

  }

 }

 public void onDestroy() {

  super.onDestroy();

  if (sc != null)

   unbindService(sc);

 }

}

(0)

相关推荐

  • Android手机连接本地局域网web服务器

    一直从事Android端开发,想简单单学学JavaWeb. 这样就可以自己返回测试数据,不用苦苦的等服务端的哥们写接口. ps:主要的是自食其力,不用整天求服务端的哥们.... 但是JavaWeb程序 ...

  • 怎样查看局域网内IP地址

    如何查看局域网内电脑IP地址,下面来介绍怎样查看局域网内IP地址. 操作方法 01 点击开始菜单,再选择"运行" 02 运行对话框中输入<cmd> 03 弹出的DOS界 ...

  • 怎么查询局域网内全部电脑IP和mac地址

    如何查询局域网内全部电脑IP和mac地址,请看以下怎么查询局域网内全部电脑IP和mac地址方法. 操作方法 01 点击开始菜单,然后选择"运行" 02 弹出运行对话框中输入&quo ...

  • 局域网内virtualbox虚拟机中搭建FTP服务器

    用笔记本搭建FTP服务器,方便局域网内的文件传输 以windows server 2003为例子.virtualbox虚拟机内搭建FTP服务器 也可以在主机上直接搭建FTP服务器 操作方法 01 1. ...

  • 局域网内建立时间同步

    系统时间的重要性在而今非常重要.不准确的电脑时钟对于网络结构以及其中的应用程序的安全性会产生较大的影响,尤其是那些对没有实现网络同步而导致的问题比较敏感的网络指令或应用程序.尤其是服务器,几台服务器之 ...

  • 提高局域网内网速的几个小技巧小结

    提高局域网内网速的几个小技巧小结

  • 轻松禁止局域网内运行P2P等流氓软件

    P2P技术的迅猛发展给我们带来很大的好处,所能找到的网络资源更加丰富,下载速度也更快。但P2P技术的广泛使用,也给公司网管带来了很大的挑战。 在一个局域网中如果有3、5个用户在使用P2P软件,将会使整 ...

  • 在局域网内提高网速的几个小技巧

     1.去掉无关的选项 在Windows XP中,双击“控制面板”中的“文件夹选项”,再单击“查看”标签,然后将鼠标指针滚动至窗口的最下方,可以看到有一个“自动搜索网络文件夹和打印机”项,默认是选中的, ...

  • 分享局域网内共用电视卡的方法

    NBA季后赛正进行得如火如荼,像笔者这等球迷自然抵挡不住诱惑,可上班时间又不可能跑回家看比赛,于是就在自己的办公室电脑上安装了一块电视卡,利用办公室提供的有线信号偷偷地欣赏起了比赛。由于办公室内的电脑 ...