当前位置: 首页 > news >正文

Android通过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


相关文章:

  • 写sql语句时将时间格式“20110725”转化为格式2012年07月25日
  • MySQL 简易序列
  • HASH的应用(负数下标用偏移量解决)
  • Python 反序列化安全问题(二)
  • collection和collections的区别
  • Eclipse自动补全增强
  • H264 RTP封包原理(转载)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • Intellij IDEA 热部署处理
  • Angular Material 攻略 03 angular Material Design 安装
  • urllib2 的使用细节(转)
  • 半理解系列--Promise的进化史
  • 游戏引擎大全
  • 【Lv1-Lesson008】A Guide to Birthdays
  • ARM9 S3C2440 定时器中断
  • (三)从jvm层面了解线程的启动和停止
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • CSS中外联样式表代表的含义
  • go语言学习初探(一)
  • spring + angular 实现导出excel
  • ViewService——一种保证客户端与服务端同步的方法
  • 产品三维模型在线预览
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 精彩代码 vue.js
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 突破自己的技术思维
  • 微信小程序:实现悬浮返回和分享按钮
  • 为什么要用IPython/Jupyter?
  • 学习ES6 变量的解构赋值
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​人工智能书单(数学基础篇)
  • ​用户画像从0到100的构建思路
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (bean配置类的注解开发)学习Spring的第十三天
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (四)c52学习之旅-流水LED灯
  • (五)MySQL的备份及恢复
  • (转载)Linux 多线程条件变量同步
  • ... 是什么 ?... 有什么用处?
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 6 redis操作类
  • .NET Core 项目指定SDK版本
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Project Open Day(2011.11.13)
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET下ASPX编程的几个小问题
  • .NET学习全景图