网络通信——与Socket交换数据(三十一)

1. 与Socket交换数据

1.1 知识点

(1)通过Android与Socket完成基本的Echo程序实现;

(2)通过对象序列化进行大数据的传输;

1.2 具体内容

对于网络的开发而言,最常使用的交互模式:WEB Service、WebServer、Socket程序,一些Socket程序的使用是绝对要比JSP/Servlet更加安全的,所有许多android程序手机端会使用Socket进行数据交换。

服务端:(JavaSE项目)

package com.SocketServer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
      public static void main(String[] args) throws Exception{
    	  ServerSocket server = new ServerSocket(2012); 	// 在8888端口上监听
  		Socket client = server.accept(); 		// 接收客户端请求
  		PrintStream out = new PrintStream(client.getOutputStream()); // 取得客户端输出流
  		BufferedReader buf = new BufferedReader(new InputStreamReader(client
  				.getInputStream()));	// 字符缓冲区读取
  		StringBuffer info = new StringBuffer(); 	// 接收客户端的信息
  		info.append("Android : ");		// 回应数据
  		info.append(buf.readLine()); 	// 接收数据
  		out.print(info);		// 发送信息
  		out.close();		// 关闭输出流
  		buf.close(); 		// 关闭输入流
  		client.close();		// 关闭客户端连接
  		server.close();		
	}
}

客户端布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SocketConnetionActivity" >
    
    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Echo回应程序"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="等待服务端发送回应信息。。。。" />

</LinearLayout>

客户端:

package com.example.socketconnectionproject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SocketConnetionActivity extends Activity {
	Button but = null;
	TextView tv = null;
	String response = null;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				SocketConnetionActivity.this.tv.setText(msg.obj.toString());// 接收子线程消息
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_socket_connetion);
		this.but = (Button) super.findViewById(R.id.but);
		this.tv = (TextView) super.findViewById(R.id.tv);
		but.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				new Thread(new Runnable() {

					@Override
					public void run() {
						try {
							Socket client = new Socket("172.26.64.60", 2012); // 指定服务器
							PrintStream out = new PrintStream(client
									.getOutputStream()); // 打印流输出
							BufferedReader buf = new BufferedReader(
									new InputStreamReader(client
											.getInputStream()));
							out.println("华万通科技有限公司");// 发送数据
							response = buf.readLine();
							out.close(); // 关闭输出流
							buf.close(); // 关闭输入流
							client.close();// 关闭连接

						} catch (Exception e) {
							e.printStackTrace();
						}
						Message mag = new Message();
						mag.what = 1;
						mag.obj = response;
						SocketConnetionActivity.this.handler.sendMessage(mag);// 向主线程发送信息
					}
				}).start();

			}
		});
	}

}

以下实现利用Socket进行登录验证:

服务端:

package com.SocketServer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
      public static void main(String[] args) throws Exception{
    	ServerSocket server = new ServerSocket(2012); 	// 在8888端口上监听
  		Socket client = server.accept(); 		// 接收客户端请求
  		PrintStream out = new PrintStream(client.getOutputStream()); // 取得客户端输出流
  		BufferedReader buf = new BufferedReader(new InputStreamReader(client
  				.getInputStream()));	// 字符缓冲区读取
  		String userInfo = buf.readLine();
  		System.out.println(userInfo);
  		String userStr[] = userInfo.split(",");
  		DH10User user = new DH10User(userStr[0],userStr[1]);
  		boolean bool=new LoginDAOImpl(GetConnection.getConn()).login(user);
  		if(bool){
  			
  			out.print("LoginSuccess");		// 发送信息
  		}else{
  			out.print("LoginFail");
  		}
  		out.close();		// 关闭输出流
  		buf.close(); 		// 关闭输入流
  		client.close();		// 关闭客户端连接
  		server.close();		
	}
}

客户端:

package com.example.socketconnectionproject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class SocketConnetionActivity extends Activity {
	EditText username,password=null;
	Button but = null;
	String response = null;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Toast.makeText(SocketConnetionActivity.this, msg.obj.toString(), 0).show();// 接收子线程消息
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_socket_connetion);
		this.but = (Button) super.findViewById(R.id.login);
		this.username = (EditText) super.findViewById(R.id.username);
		this.password = (EditText) super.findViewById(R.id.password);
		but.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				new Thread(new Runnable() {

					@Override
					public void run() {
						try {
							Socket client = new Socket("172.26.64.60", 2012); // 指定服务器
							PrintStream out = new PrintStream(client
									.getOutputStream()); // 打印流输出
							BufferedReader buf = new BufferedReader(
									new InputStreamReader(client
											.getInputStream()));
							out.println(SocketConnetionActivity.this.username.getText().toString()
									+","+SocketConnetionActivity.this.password.getText().toString());// 发送数据
							response = buf.readLine();
							out.close(); // 关闭输出流
							buf.close(); // 关闭输入流
							client.close();// 关闭连接

						} catch (Exception e) {
							e.printStackTrace();
						}
						Message mag = new Message();
						mag.what = 1;
						mag.obj = response;
						SocketConnetionActivity.this.handler.sendMessage(mag);// 向主线程发送信息
					}
				}).start();

			}
		});
	}

}

1.3 小结

(1)使用Android可以与Socket程序进行通信;

(2)上传文件可以采用序列化的方式简单完成,但是程序不具备通用性;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣197. 上升的温度

【版本1】&#xff1a; select w2.id from Weather w1 inner join Weather w2 on w1.recordDate subdate(w2.recordDate,1) where w2.Temperature > w1.Temperature【小记】 1、遇到这种某个字段与自身相比&#xff08;今天温度和昨天温度比&#xff0c;是温度这个字段…

11.8 33oj 模拟赛总结(时间安排 + 题解(数学 + 二分 + 括号匹配DP + 性质DP))

文章目录 考试时间及策略考试结果赛后总结题解Balance AddictsBoboniu and StringBracket InsertionConveyor 考试时间及策略 7:40 - 8:00 开题。T1 应该是个dp, 但是好像有点恶心。T2是个神秘构造。T3是个求随机括号匹配的概率&#xff0c;一眼应该是个 n 3 n^3 n3 的…

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的&#xff1a; 单链表如何解决顺序表中的问题&#xff1a; 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

蓝牙安全管理(SM:Security Manager)规范详解

总述 配对(Pairing)分为三个阶段&#xff0c;前两个阶段是必须的&#xff0c;而第三阶段是可选的&#xff0c;三个阶段如下&#xff1a; 阶段1&#xff1a;配对功能交换(Pairing Feature Exchange) 阶段2(LE传统配对 LE legacy pairing)&#xff1a;短期密钥(STK:Short Term…

【Python大数据笔记_day04_Hadoop】

分布式和集群 分布式:多台服务器协同配合完成同一个大任务(每个服务器都只完成大任务拆分出来的单独1个子任务) 集群:多台服务器联合起来独立做相同的任务(多个服务器分担客户发来的请求) 注意:集群如果客户端请求量(任务量)多,多个服务器同时处理不同请求(不同任务),如果请求量…

为什么推荐从Linux开始了解IT技术

IT是什么&#xff0c;是干什么的呢&#xff1f; 说起物联网&#xff0c;云计算&#xff0c;大数据&#xff0c;或许大家听过。但是&#xff0c;你知道&#xff0c;像云计算的底层基座是什么呢&#xff1f;就是我们现在说的Linux操作系统。而云计算就是跑在Linux操作系统上的一个…

商越科技:渗透测试保障平台安全,推动线上采购高效运转

商越科技是数字化采购解决方案提供商&#xff0c;在同赛道企业中始终保持前列。商越科技通过自主研发的智能采购中台、SaaS应用及运营服务等为企业搭建专属的互联网采购平台&#xff0c;帮助企业实现采购数字化以及智能化转型&#xff0c;提高工作效率、降低采购成本。 打造数字…

自建网盘平台搭建(源码+教程)

为什么要自己搭建网盘&#xff0c;现在许多大厂的网盘&#xff0c;文件都添加了许多限制&#xff0c;有好多文件会遭到和谐&#xff0c;而且大部分网盘也都会限速&#xff0c;不开通VIP是很难用的&#xff01;这是一套可以运营的网盘&#xff0c;代码无加密可以进行二次开发。下…

【java】【MyBatisPlus】【四】【完】MyBatisPlus一些实战总结(枚举、翻页、sql、组合条件、自增主键、逻辑删除)

目录 一、枚举 1、数据库type字段是Integer 类型枚举 2、创建一个该字段的枚举类 TypeEnum 3、修改实体类 4、配置文件新增mybatis-plus的配置 5、检验&#xff1a; 5.1 查询显示 5.3 库里验证 二、自增主键不是id字段处理 三、逻辑删除字段不是delete字段处理 1、实…

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子 文章目录 [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 LCR 091. 粉刷房子 题目解析 (1) 一排房子&#xff0c;共有n个 (2) 染…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

Docker两个容器互相请求接口

BEGIN 环境&#xff1a;Docker-Windows-Hyperf 1. 过以下命令查看Docker中的所有网络 docker network ls这个命令会列出所有的Docker网络&#xff0c;包括其ID、名称、驱动以及作用范围 在 Docker 中&#xff0c;容器通过 Docker 网络进行相互通信&#xff1b;在 Docker 中有…

第二十七章 解读Transformer_车道线检测中的Transformer(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 SE简单实现 class SELayer(nn.Module):d…

Invalid bound statement (not found)

说明&#xff1a;记录一次Mapper.xml调用数据库存储过程的错误&#xff1b; 报错信息&#xff1a;Invalid bound statement (not found)&#xff0c;Mapper的全限定类名 场景&#xff1a;我仔仔细细核对过了方法名&#xff0c;参数&#xff0c;都没有问题&#xff0c;使用插件…

基于 HarmonyOS 的 HTTPS 请求过程开发示例(ArkTS)

介绍 本篇 Codelab 基于网络模块以及 Webview 实现一次 HTTPS 请求&#xff0c;并对其过程进行抓包分析。效果如图所示&#xff1a; 相关概念 ● Webview&#xff1a;提供 Web 控制能力&#xff0c;Web 组件提供网页显示能力。 ● HTTP数据请求&#xff1a;网络管理模块&am…

开发知识点-Django

Django 1 了解简介2 Django项目结构3 url 地址 和视图函数4 路由配置5 请求及响应6 GET请求和POST请求查询字符串 7 Django设计模式及模板层8 模板层-变量和标签9 模板层-过滤器和继承继承 重写 10 url反向解析11 静态文件12 Django 应用及分布式路由创建之后 注册 一下 13 模型…

力扣每日一题 ---- 2905. 找出满足差值条件的下标 II

这道题带有绝对值差的题&#xff0c;一看就是双指针的题&#xff0c;并且还带有两个限制&#xff0c;那么我们的做法就是 固定一个条件&#xff0c;维护一个条件 本题还用到了一个贪心思路&#xff0c;会介绍到 那我们怎么固定一个条件&#xff0c;维护一个条件&#xff1f; …

基于ssm的大学生社团管理系统

基于ssm的大学生社团管理系统 摘要 基于SSM的大学生社团管理系统是一个全面、高效的社团管理平台&#xff0c;旨在帮助大学生和社团管理员更方便、更快捷地进行社团活动的组织和管理。该系统基于Spring、SpringMVC和MyBatis&#xff08;简称SSM&#xff09;开发&#xff0c;这三…

CentOS Linux 系统镜像

CentOS Linux具有以下特点&#xff1a; 稳定性&#xff1a;CentOS Linux旨在提供一个稳定、可靠的服务器环境&#xff0c;适合用于关键业务应用和生产环境。高效性&#xff1a;CentOS Linux经过优化和调整&#xff0c;可以充分发挥硬件的性能&#xff0c;提高系统的整体效率。…