Android中socket通信的简单实现

Androidsocket通信" title="socket通信">socket通信简单实现,供大家参考,具体内容如下

socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。

先上个图:

这里以一个APP作为服务器跟客户端为示例

1、添加网络访问权限

<uses-permission android:name="android.permission.INTERNET" />

2、写服务器,在APP上启动

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.InetAddress;

import java.net.ServerSocket;

import java.net.Socket;

public class Server {

ServerSocket serverSocket = null;

public final int port = 9998;

private int i = 0;

public Server(){

//输出服务器的IP地址

try {

InetAddress addr = InetAddress.getLocalHost();

System.out.println("local host:"+addr);

serverSocket = new ServerSocket(port);

System.out.println("0k");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void startService(){

try {

Socket socket = null;

System.out.println("waiting...");

//等待连接,每建立一个连接,就新建一个线程

while(true){

socket = serverSocket.accept();//等待一个客户端的连接,在连接之前,此方法是阻塞的

System.out.println("connect to"+socket.getInetAddress()+":"+socket.getLocalPort());

new ConnectThread(socket).start();

}

} catch (IOException e) {

// TODO Auto-generated catch block

System.out.println("IOException");

e.printStackTrace();

}

}

//向客户端发送信息

class ConnectThread extends Thread{

Socket socket = null;

public ConnectThread(Socket socket){

super();

this.socket = socket;

}

@Override

public void run(){

try {

DataInputStream dis = new DataInputStream(socket.getInputStream());

DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

while(true){

i++;

String msgRecv = dis.readUTF();

System.out.println("msg from client:"+msgRecv);

dos.writeUTF(msgRecv + i);

dos.flush();

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

需要在线程中调用,调用方法:

new Thread(() -> new Server().startService()).start();

3、客户端代码

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.net.InetAddress;

import java.net.Socket;

import java.net.UnknownHostException;

import androidx.appcompat.app.AppCompatActivity;

/**

* @author fenghaitao

* @time 2020年4月2日14:34:33

* scoket客户端连接测试

*/

public class SocketActivity extends AppCompatActivity {

//IP地址和端口号

public static String IP_ADDRESS = "";

public static int PORT = 9998;

//三个控件

EditText et_message = null; //需要发送的内容

Button bt_getAdress = null; //获取本机IP地址

Button bt_connect = null; //连接并发送

Button bt_startServer = null; //启动服务端

TextView tv_adress = null; //ip地址

TextView tv_reply = null; //服务器回复的消息

//handler

Handler handler = null;

Socket soc = null;

DataOutputStream dos = null;

DataInputStream dis = null;

String messageRecv = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_socket);

et_message = findViewById(R.id.et_message);

bt_getAdress = findViewById(R.id.bt_getAdress);

bt_connect = findViewById(R.id.bt_connect);

bt_startServer = findViewById(R.id.bt_startServer);

tv_adress = findViewById(R.id.tv_adress);

tv_reply = findViewById(R.id.tv_reply);

bt_getAdress.setOnClickListener(v -> {

new Thread(() -> {

try {

InetAddress addr = InetAddress.getLocalHost();

System.out.println("local host:"+addr);

runOnUiThread(() -> tv_adress.setText(addr.toString().split("/")[1]));

} catch (UnknownHostException e) {

e.printStackTrace();

}

}).start();

});

bt_startServer.setOnClickListener(v -> {

new Thread(() -> new Server().startService()).start();

Toast.makeText(SocketActivity.this,"服务已启动",Toast.LENGTH_SHORT).show();

});

bt_connect.setOnClickListener(v -> {

IP_ADDRESS = tv_adress.getText().toString();

new ConnectionThread(et_message.getText().toString()).start();

});

handler = new Handler(msg -> {

Bundle b = msg.getData(); //获取消息中的Bundle对象

String str = b.getString("data"); //获取键为data的字符串的值

tv_reply.append(str);

return false;

});

}

//新建一个子线程,实现socket通信

class ConnectionThread extends Thread {

String message = null;

public ConnectionThread(String msg) {

message = msg;

}

@Override

public void run() {

if (soc == null) {

try {

//Log.d("socket","new socket");

if ("".equals(IP_ADDRESS)) {

return;

}

soc = new Socket(IP_ADDRESS, PORT);

//获取socket的输入输出流

dis = new DataInputStream(soc.getInputStream());

dos = new DataOutputStream(soc.getOutputStream());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

try {

dos.writeUTF(message);

dos.flush();

messageRecv = dis.readUTF();//如果没有收到数据,会阻塞

Message msg = new Message();

Bundle b = new Bundle();

b.putString("data", messageRecv);

msg.setData(b);

handler.sendMessage(msg);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

下面是xml页面代码

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

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

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".SocketActivity">

<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_marginTop="10dp">

<Button

android:id="@+id/bt_getAdress"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="获取IP地址"/>

<TextView

android:id="@+id/tv_adress"

android:layout_width="200dp"

android:layout_height="match_parent"

android:layout_marginLeft="15dp"

android:textSize="20dp"

android:gravity="center"/>

</LinearLayout>

<Button

android:id="@+id/bt_startServer"

android:text="启动服务"

android:layout_marginTop="10dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

<EditText

android:id="@+id/et_message"

android:layout_marginTop="10dp"

android:hint="请输入发送信息"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

<Button

android:id="@+id/bt_connect"

android:text="连接发送"

android:layout_marginTop="10dp"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

<TextView

android:id="@+id/tv_reply"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="10dp"

android:text="服务端返回消息:"

android:textSize="30sp"/>

</LinearLayout>

</LinearLayout>

客户端跟服务器进行通信之前记得先启动服务器,如果端口被占用需要换个端口。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 Android中socket通信的简单实现 的全部内容, 来源链接: utcz.com/p/242616.html

回到顶部