首页 > 窍门 > 科技数码

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

来源: 更新时间:2022-11-23 00:11:03
The Beginning

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

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

  1.效果图:

  (1)客户端

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

  (2)服务器端

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

  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);

}

}

THE END

TAG:明文  本机  地址  

猜你喜欢

相关文章