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日

相关文章

  • Android 获取系统各个目录的方法

    获取系统各个目录是Android开发中的一项重要基础技能。以下是获取Android系统各个目录的方法攻略: 1. 获取应用程序目录 在Android应用程序中,每个应用程序都有自己的私有目录,也就是手机内存中/data/data/包名/目录,这个目录可以用来存放应用程序的私有数据和缓存数据。 方法1 可以通过getFilesDir()方法来获取当前应用程序的…

    other 2023年6月28日
    00
  • 批量列出所有文件名的批处理

    首先,我们需要明确批处理文件的编写目标,即在指定的文件夹中列出所有文件名,并将其输出到一个文本文件中。下面是完成这个目标的具体步骤: 步骤一:打开命令提示符窗口 在电脑屏幕上按下Win+R组合键,打开运行窗口,输入cmd并点击确定,即可打开命令提示符窗口。 步骤二:进入要扫描的文件夹 在命令提示符窗口中输入cd路径,其中路径是指要扫描的文件夹路径。例如,如果…

    other 2023年6月26日
    00
  • Win11怎么卸载应用? 卸载默认Win11应用程序的方法

    Win11中卸载应用程序的方法和Win10相似,下面是详细攻略: 卸载应用程序的方法 打开“设置” 点击屏幕左下角的“开始”按钮,在“开始”菜单中找到并点击“设置”图标,或者使用快捷键“Win + I”打开“设置”。 打开“应用和功能” 在“设置”中,点击“应用”选项,然后在左侧导航栏中选择“应用和功能”。 选择要卸载的应用 滚动列表找到要卸载的应用程序,在…

    other 2023年6月25日
    00
  • Linux应用程序使用写文件调试程序的方法

    当 Linux 应用程序出现问题时,我们通常需要进行调试处理。其中一种处理方式就是写文件记录程序运行时的细节信息以进一步进行分析。下面是使用写文件调试程序的方法的完整攻略: 1. 创建文件 首先需要创建一份记录细节信息的文件,我们可以使用 fopen() 函数来创建文件并返回文件指针。如下所示,新建一个 debug.log 记录文件: FILE *fp; f…

    other 2023年6月25日
    00
  • 利用C++简单实现顺序表和单链表的示例代码

    首先我需要说明一下Markdown中的代码块格式,在Markdown中使用三个反引号(“`)或者一个制表符(Tab键)加上代码语言名称来表示代码块。例如,C++的代码可以用以下方式表示: #include <iostream> using namespace std; int main() { cout << "Hello…

    other 2023年6月27日
    00
  • React生命周期函数深入全面介绍

    关于React生命周期函数深入全面介绍的攻略,这里为大家详细介绍一下: 什么是React生命周期函数 React组件有生命周期,即从组件被创建到最终组件销毁过程中的各个阶段。在这些阶段,React提供了一组函数,这些函数分别对应不同阶段中的操作,这就是React生命周期函数。 React生命周期函数总共分为三类: 挂载阶段(Mounting):组件被创建并插…

    other 2023年6月26日
    00
  • java设计模式–三种工厂模式详解

    Java 设计模式:三种工厂模式详解 工厂模式是Java中常见的一种设计模式,用来解决对象创建过程中的一些问题。根据具体的需求和使用场景,工厂模式还可以进一步细分为三种——简单工厂模式、工厂方法模式和抽象工厂模式。 本文将详细讲解三种工厂模式的原理、特点、适用场景以及代码实现等方面的内容,希望对Java初学者有所帮助。 简单工厂模式 原理 在简单工厂模式中,…

    other 2023年6月26日
    00
  • MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法

    MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法 当我们尝试启动MySQL 5.7.9服务时,可能会遇到以下错误: “error 1067 the process terminated unexpectedly”,然后我们通过命令行方式尝试手动启动该服务,而结果提示了 “NET HELPMSG 3534” 错误。如下所示:…

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