Android通过Socket与服务器进行通信

简介: 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~  先上代码,可以先把代码下下来,对着代码看本文。代码地址是:https://github.com/huangtianyu/SocketDemo,代码记得点击star哦~  总有些想尝试一些底层的人,之前做过socket开发,总是想能不能用socket实现手机和服务器直接通信。

终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~  

先上代码,可以先把代码下下来,对着代码看本文。代码地址是:https://github.com/huangtianyu/SocketDemo,代码记得点击star哦~

  总有些想尝试一些底层的人,之前做过socket开发,总是想能不能用socket实现手机和服务器直接通信。尝试了下,还是不难的。毕竟都是用Java写的,无论是Android端还是服务器端,都是对Socket的使用。下面给出具体代码。

 先看服务器端代码:

Server.java

package com.scu;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable {
	public void run() {
		try {
			// 创建ServerSocket
			ServerSocket serverSocket = new ServerSocket(6868);
			while (true) {
				// 接受客户端请求
				Socket client = serverSocket.accept();
				if (client == null) {
					continue;
				}
				System.out.println("客户端来了");
				try {
					// 接收客户端消息
					BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
					String str = in.readLine();
					System.out.println("收到:" + str);
					// 向服务器发送消息
					PrintWriter out = new PrintWriter(
							new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
					out.println("服务器收到了");
					// 关闭流
					out.close();
					in.close();
				} catch (Exception e) {
					System.out.println(e.getMessage());
					e.printStackTrace();
				} finally {
					// 关闭
					client.close();
					System.out.println("close");
				}
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	// main函数,开启服务器,这就是一个普通的Java类,可以放到命令行里面执行的
	public static void main(String a[]) {
		Thread desktopServerThread = new Thread(new Server());
		desktopServerThread.start();
	}
}

  上面是普通的Java类,可以直接放到命令行里面编译然后执行(javac Server.java,然后java Server即可)。首先初始化一个ServerSocket,利用一个while循环,不断循环接收客户端请求。注意ServerSocket类的accept函数将会阻塞线程的运行,当没有客户端发来请求时,服务器将会停在accept方法处,直到有客户端发送请求。

  下面看看Android端代码:

package com.zqc.socketdemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class MainActivity extends Activity {
    private final String DEBUG_TAG = "hty";
    private TextView mTextView = null;
    private EditText mEditText = null;
    private Button mButton = null;
    Socket socket = null;

    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.Button01);
        mTextView = (TextView) findViewById(R.id.TextView01);
        mEditText = (EditText) findViewById(R.id.EditText01);

        mButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                new Thread(){
                    @Override
                    public void run() {
                        String message = mEditText.getText().toString();
                        try {
                            //创建Socket
                            socket = new Socket("10.18.73.62", 6868);//第一个参数是ip地址,第二个是端口号
                            //向服务器发送消息
                            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                            out.println(message);
                            //接收来自服务器的消息
                            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                            String msg = new String(in.readLine().getBytes(),"UTF-8");
                            if (msg != null) {
                                mTextView.setText(msg);
                            } else {
                                mTextView.setText("数据错误!");
                            }
                            //关闭流
                            out.close();
                            br.close();
                        } catch (Exception e) {
                            Log.e(DEBUG_TAG, e.toString());
                        } finally {
                            //关闭Socket
                            try {
                                if (socket != null) {
                                    socket.close();
                                }
                            } catch (Exception e) {

                            }
                        }
                    }
                }.start();
            }
        });
    }
}
  在Android端首先初始化一个Socket,然后获取该Socket的输出流,在调用out.println的时候框架会自动进行socket请求并发送数据。可以通过socket.getInputStream()获取Socket的输入流,从而可以接收服务器的输出。

  具体代码可以参考github:https://github.com/huangtianyu/SocketDemo


目录
相关文章
|
9天前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
45 10
|
4月前
|
Android开发 数据安全/隐私保护 虚拟化
安卓手机远程连接登录Windows服务器教程
安卓手机远程连接登录Windows服务器教程
726 4
|
5月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
240 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
5月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
292 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
5月前
|
Ubuntu Linux Android开发
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
本文介绍了如何在Android设备上安装Termux和AnLinux,并通过这些工具运行Ubuntu系统和桌面环境。
654 2
termux+anlinux+Rvnc viewer来使安卓手机(平板)变成linux服务器
|
5月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
61 0
|
7月前
|
API Windows
揭秘网络通信的魔法:Win32多线程技术如何让服务器化身超级英雄,同时与成千上万客户端对话!
【8月更文挑战第16天】在网络编程中,客户/服务器模型让客户端向服务器发送请求并接收响应。Win32 API支持在Windows上构建此类应用。首先要初始化网络环境并通过`socket`函数创建套接字。服务器需绑定地址和端口,使用`bind`和`listen`函数准备接收连接。对每个客户端调用`accept`函数并在新线程中处理。客户端则通过`connect`建立连接,双方可通过`send`和`recv`交换数据。多线程提升服务器处理能力,确保高效响应。
79 6
|
7月前
|
网络协议 安全 Unix
6! 用Python脚本演示TCP 服务器与客户端通信过程!
6! 用Python脚本演示TCP 服务器与客户端通信过程!
127 1
|
7月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
270 0
|
Java Android开发 数据格式
android http 连接通信
一共有三个文件,JAVA,MAIN.XML,AndroidManifest.xml JAVA文件:package Android_https.
932 0