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

yizhihongxing

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日

相关文章

  • rancher2—了解什么是rancher以及简单部署

    Rancher2 – 了解什么是Rancher以及简单部署的完整攻略 1. Rancher2的概述 Rancher2是一款开源的容器管理平台,它可以帮助用户轻松地管理和部署容器化应用程序。Rancher2提供了一个直观的Web界面,可以帮助用户快速创建、部署和管理容器集群。Rancher2支持多种容器编排引擎,包括Kubernetes、Docker Swar…

    other 2023年5月9日
    00
  • 详谈android 6.0 fuse文件系统的挂载和卸载问题

    详谈android 6.0 fuse文件系统的挂载和卸载问题 什么是fuse文件系统 fuse是Filesystem in Userspace(用户空间文件系统)的缩写,它允许非特权用户创建并访问自定义文件系统。fuse将文件操作请求发送给fuse内核模块,内核模块将这些请求转发到用户空间的fuse库,在fuse库中,用户可以通过调用相应的协议来完成文件系统…

    other 2023年6月27日
    00
  • gitstash命令及提交指定文件

    git stash命令及提交指定文件 在使用Git进行版本控制的过程中,我们会经常使用git stash命令暂时保存一些未提交的修改,以便于在后续的开发工作中恢复这些修改。 git stash命令 git stash命令的主要作用是将当前分支中的所有未提交的修改(包括已经被Git跟踪的文件和还未被跟踪的文件)暂时存储起来,并将当前工作目录恢复成上次提交的状态…

    其他 2023年3月29日
    00
  • .net MVC中使用forms验证详解

    .NET MVC中使用Forms验证详解 在.NET MVC中,Forms验证是一种用于验证用户输入的强大工具。它可以帮助我们确保用户提交的数据符合我们的要求,并提供友好的错误提示。本攻略将详细介绍如何在.NET MVC中使用Forms验证。 步骤1:配置验证规则 首先,我们需要在模型中定义验证规则。我们可以使用数据注解来实现这一点。以下是一个示例模型类: …

    other 2023年8月3日
    00
  • SQL Server中的三种物理连接操作

    SQL Server中的三种物理连接操作的完整攻略 在SQL Server中,物理连接操作是一种常见的操作,它可以将多个表中的数据连接起来。本文将为您详细讲解SQL Server中的三种物理连接操作的完整攻略,包括内连接、左连接和右连接。在文中,我们将介绍如何使用SQL Server进行物理连接操作,并提供两个示例说明。 内连接 内连接是一种常见的物理连接操…

    other 2023年5月6日
    00
  • 路由器ip地址冲突怎么办? 电脑弹出windows系统错误的解决办法

    路由器IP地址冲突的解决办法 当路由器的IP地址与其他设备冲突时,可能会导致网络连接问题。下面是解决路由器IP地址冲突的完整攻略,包括两个示例说明。 步骤1:确认IP地址冲突 首先,我们需要确认是否存在IP地址冲突。以下是确认IP地址冲突的步骤: 打开命令提示符(Windows用户可以按下Win + R,然后输入\”cmd\”并按下回车键)。 在命令提示符中…

    other 2023年7月31日
    00
  • 子网掩码和IP地址的关系

    子网掩码和IP地址的关系 子网掩码(Subnet Mask)是用于划分网络中主机和网络地址的一种技术。它与IP地址(Internet Protocol Address)密切相关,用于确定一个IP地址的网络部分和主机部分。在本攻略中,我们将详细讲解子网掩码和IP地址之间的关系,并提供两个示例来说明。 1. IP地址的结构 IP地址是一个32位的二进制数,通常以…

    other 2023年7月30日
    00
  • 关于favicon.ico的两三事(最好就是放根目录)

    关于 favicon.ico 的两三事(最好就是放根目录),我为您准备了以下的完整攻略。 一、什么是 favicon.ico favicon.ico 是指网站的图标,可以在浏览器标签页、书签栏等位置显示。favicon.ico 文件通常被放置在网站根目录下,浏览器会自动请求并加载它。 二、为什么需要 favicon.ico 1.提高网站可识别度和品牌形象,方…

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