android Socket实现简单聊天功能以及文件传输

Android Socket实现简单聊天功能以及文件传输的步骤如下:

1. 创建服务端

首先,需要创建一个服务端,用于接收客户端请求。在服务端创建Socket实例,并指定端口号,即可监听客户端的请求。以下是一个简单的服务端代码示例,用于接受客户端的连接请求并接受消息:

public class ServerSocketThread extends Thread {
    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();

            DataInputStream inputStream = new DataInputStream(socket.getInputStream());
            String message = inputStream.readUTF();
            System.out.println("收到客户端发来的消息:" + message);

            inputStream.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 创建客户端

接下来需要创建一个客户端,用于向服务端发送消息。在客户端中,同样需要创建Socket实例,并指定服务端的IP地址和端口号。这样就可以连接到服务端,并向其发送消息。以下是一个简单的客户端代码示例,用于向服务端发送消息:

public class SocketThread extends Thread {
    @Override
    public void run() {
        try {
            Socket socket = new Socket("localhost", 8080);

            DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
            outputStream.writeUTF("Hello, Server!");

            outputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 实现简单聊天功能

有了服务端和客户端,就可以实现简单的聊天功能了。可以使用一个循环,让客户端和服务端轮流发送消息。以下是一个简单的示例聊天程序,其中使用了异步任务来运行服务端和客户端。

public class ChatActivity extends AppCompatActivity {
    private TextView mMsgTextView;
    private EditText mMsgEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        mMsgTextView = findViewById(R.id.msg_text_view);
        mMsgEditText = findViewById(R.id.msg_edit_text);

        findViewById(R.id.send_button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendMessage();
            }
        });

        new ServerSocketThread().start();
        new SocketThread().start();
    }

    private void sendMessage() {
        String message = mMsgEditText.getText().toString();
        if (TextUtils.isEmpty(message)) {
            return;
        }
        mMsgEditText.getText().clear();
        mMsgTextView.append("I: " + message + "\n");

        new AsyncTask<String, Void, Void>() {
            @Override
            protected Void doInBackground(String... strings) {
                try {
                    Socket socket = new Socket("localhost", 8080);

                    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
                    outputStream.writeUTF(strings[0]);

                    DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                    String receivedMessage = inputStream.readUTF();
                    mMsgTextView.append("Server: " + receivedMessage + "\n");

                    outputStream.close();
                    inputStream.close();
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return null;
            }
        }.execute(message);
    }
}

4. 实现文件传输

要实现文件传输,只需要使用Java IO的File、FileInputStream、FileOutputStream、BufferedInputStream和BufferedOutputStream等类来读取和写入文件数据。只需要在客户端发送文件的连接后,从本地读取文件的字节数组,然后写入到Socket的输出流中;在服务端接收到文件的连接后,从输入流中读取字节数组,然后写入到本地文件中。

以下是一个简单的文件传输示例程序。在客户端中,使用异步任务读取要发送的文件,并将其写入Socket的输出流中:

public class FileClientThread extends Thread {
    private String mFilePath;

    public FileClientThread(String filePath) {
        mFilePath = filePath;
    }

    @Override
    public void run() {
        try {
            Socket socket = new Socket("localhost", 8080);

            File file = new File(mFilePath);
            FileInputStream fileInputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);

            OutputStream outputStream = socket.getOutputStream();
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
                bufferedOutputStream.write(buffer, 0, bytesRead);
                bufferedOutputStream.flush();
            }

            bufferedInputStream.close();
            bufferedOutputStream.close();
            outputStream.close();
            fileInputStream.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在服务端中,新建一个线程来接收文件,读取Socket输入流中的数据,并将其写入到文件中。

public class FileServerThread extends Thread {
    private String mSavePath;

    public FileServerThread(String savePath) {
        mSavePath = savePath;
    }

    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(8080);
            Socket socket = serverSocket.accept();

            InputStream inputStream = socket.getInputStream();
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

            File file = new File(mSavePath);
            FileOutputStream fileOutputStream = new FileOutputStream(file);
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
                bufferedOutputStream.write(buffer, 0, bytesRead);
                bufferedOutputStream.flush();
            }

            bufferedInputStream.close();
            bufferedOutputStream.close();
            fileOutputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

至此,Android Socket实现简单聊天功能以及文件传输的攻略完成。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:android Socket实现简单聊天功能以及文件传输 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • LINUX下的文件结构介绍

    让我们来详细讲解一下Linux下的文件结构介绍。在Linux系统中,文件系统被组成为一个树状的结构,称为目录树。在目录树中,根目录是所有目录的起点,表示为“/”。下面是Linux下的目录树结构简图以及每个目录的作用: / ├── bin:系统命令目录,包含许多常用的命令,如ls、cd、grep等。 ├── boot:系统启动目录,包含Linux内核和引导程序…

    other 2023年6月26日
    00
  • 批处理入门手册之批处理常用DOS命令篇(attrib、del、copy、xcopy)

    当我们学习使用批处理时,了解批处理常用的DOS命令是非常必要的。本篇文章将会详细介绍attrib、del、copy和xcopy这四个DOS命令的用法,同时也给出了一些实际的示例。 attrib命令 attrib命令用于显示或修改文件的属性,包括文件的只读、系统、隐藏和存档等属性。以下是常用的attrib命令选项: /S:对指定目录及其子目录中的文件进行操作 …

    other 2023年6月26日
    00
  • recyclerview分割线——万能分割线

    Recyclerview分割线——万能分割线 当我们使用Recyclerview来展示列表的时候,通常需要使用分割线来给列表项之间增加一些空隙,使得用户可以更好地区分每个项。那么在这里,我们介绍一种万能分割线,使你在使用Recyclerview时减少一些烦恼。 传统方式 在传统的方式中,我们通常需要自己写分割线的布局文件。但是,这种方式会增加代码量,并且会有…

    其他 2023年3月28日
    00
  • linuxrz的使用

    以下是关于“linuxrz的使用”的完整攻略,包括基本概念、步骤和两个示例。 基本概念 linuxrz是Linux系统中的一个命令行工具,用于在本地计算机和远程计算机之间传输文件。它可以通过SSH协议进行加密传输,保证数据的安全性。 步骤 是使用linuxrz进行文件传输的步骤: 安装linuxrz:使用以下命令在Linux系统中安装linuxrz。 bas…

    other 2023年5月7日
    00
  • eclipse同时开两个tomcat

    Eclipse同时开两个Tomcat 在使用Eclipse进行Java Web开发的过程中,我们可能需要同时启动多个Tomcat服务器。本文将介绍如何在Eclipse中同时开两个Tomcat服务器。 安装Tomcat插件 首先,我们需要在Eclipse中安装Tomcat插件。在Eclipse的菜单栏中选择”Help” -> “Eclipse Marke…

    其他 2023年3月28日
    00
  • 反射机制:getDeclaredField和getField的区别说明

    首先需要了解反射机制,它是Java中的一种高级特性,允许程序在运行时获取类的信息以及动态调用它的方法,甚至可以在运行时动态修改类的属性和方法。在反射机制中,我们通常使用Java.lang.reflect包中提供的类完成相关功能。其中,getDeclaredField和getField是两个比较常用的方法,主要用于获取类的字段(属性)信息,它们在使用上也有所区…

    other 2023年6月26日
    00
  • git分支的创建和切换

    当我们在进行软件开发时,通常需要在同一个代码库中进行多个开发和测试。Git分支是一个非常有用的功能,它允许我们在一个代码库中创建多个分支,以便在不影响主分支的情况下进行开发和测试。本文将详细介绍如何在Git中创建和切换分支,并提供两个示例说明。 创建分支 在Git中,我们可以使用git branch命令创建一个新分支。以下是创建一个名为feature的新分支…

    other 2023年5月7日
    00
  • 2003和xp设置isatap隧道方式获取IPv6地址

    2003和XP设置ISATAP隧道方式获取IPv6地址攻略 简介 ISATAP(Intra-Site Automatic Tunnel Addressing Protocol)是一种用于在IPv4网络上传输IPv6流量的隧道协议。在Windows Server 2003和Windows XP操作系统中,可以通过ISATAP隧道方式获取IPv6地址。下面是详细…

    other 2023年7月31日
    00
合作推广
合作推广
分享本页
返回顶部