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

news2024/11/24 19:18:41

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)上传文件可以采用序列化的方式简单完成,但是程序不具备通用性;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZZ308 物联网应用与服务赛题第F套

2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 &#xff08;F卷&#xff09; 赛位号&#xff1a;______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等&#xff1b; 2.竞赛任务中所使用…

【MySQL篇】数据库角色

前言 数据库角色是被命名的一组与数据库操作相关的权限&#xff0c;角色是权限的集合。因此&#xff0c;可以为一组具有相同权限的用户创建一个角色&#xff0c;使用角色来管理数据库权限可以简化授权的过程。 CREATE ROLE&#xff1a;创建一个角色 GRANT&#xff1a;给角色授…

个人前端编程技巧总结

目录 1. 让界面位于当前屏幕的中心&#xff08;屏幕中心&#xff09;css代码示例 2. 界面透明但是内部元素不透明&#xff08;毛玻璃&#xff09;css代码示例 3. 将当前界面的参数传递到跳转的目标页面&#xff08;携参跳转&#xff09;js代码 1. 让界面位于当前屏幕的中心&…

cmake 之add_definitions使用误区

需求 需要实现&#xff0c;在cmake中定义宏定义&#xff0c;可以&#xff1a;1&#xff09; 在code中可以使用&#xff1b;2&#xff09; 在cmake中可以识别是否已定义 问题 宏定义&#xff0c;cmake有add_definitions函数&#xff0c;直观的实现方法如下。 cmake_minimum…

java--实体javaBean

1.什么是实体类 1.就是一种特殊形式的类 2.这个类中的成员变量都要私有&#xff0c;并且要对外提供相应的getXXX&#xff0c;setXXX方法 3.类中必须要有一个公共的无参的构造器 2.实体类有啥应用场景 实体类只负责数据存取&#xff0c;而对数据的处理交给其他类来完成&…

【数据结构】线性表的链式存储结构

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 顺序存储结构的不足的解决办法 从上一节我们对顺序表的讨论中可见,线性表的顺序存储结构的特点是: 逻辑关系上相邻的两个元素在物理位置(内存)上也相邻,因此可以随机存取表中…

妙手ERP功能更新:Shopee认领配置中的主货号支持按后缀自动递增、Ozon采集箱支持批量编辑【颜色样本图】、TikTok Shop......

为了给卖家朋友带来更好的使用体验&#xff0c;更高效地运营跨境店铺&#xff0c;妙手ERP在上周优化了以下多项功能。 01、产品模块优化 全平台 - 系统新增密码错误被锁提示 Shopee - 认领配置中的主货号&#xff08;父SKU&#xff09;支持按后缀自动递增 - 发布配置中的【定…

通过SOLIDWORKS Composer让自定义视图更智能

SOLIDWORKS Composer是一款专业的技术文档创建工具&#xff0c;通过SOLIDWORKS Composer可以快速创建所需的技术文档&#xff0c;无论是用于装配说明&#xff0c;维护手册还是销售展示。 当使用SOLIDWORKS Composer创建交互式内容的时候&#xff0c;自定义视图至关重要。自定义…

DAY47 198.打家劫舍 + 213.打家劫舍II + 337.打家劫舍 III

198.打家劫舍 题目要求&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警…

前端-选中DOM定位源代码

用到的工具&#xff1a;react-dev-inspector 使用流程 根据react-dev-inspector文档进行配置 安装 yarn add --dev react-dev-inspector配置&#xff1a;在根目录下配置Inspector import { createRoot } from react-dom/client import { Inspector } from react-dev-inspe…

Spring中的循环依赖解决方案

前言&#xff1a;测试环境突发BeanCurrentlyInCreationException&#xff0c;导致后端服务启动失败&#xff0c;一看就是Spring的Bean管理中循环依赖。项目中存在Bean的循环依赖&#xff0c;是代码质量低下的表现。多数人寄希望于框架层来给擦屁股&#xff0c;造成了整个代码的…

[工业自动化-6]:西门子S7-15xxx编程 - PLC系统硬件组成与架构

目录 一、PLC系统组成 1.1 PLC 单机系统组成 1.2 PLC 分布式系统 二、PLC各个组件 2.1 PLC上位机 2.2 PLC主站&#xff1a;PLC CPU控制中心 &#xff08;1&#xff09;主要功能 &#xff08;2&#xff09;主站组成 2.3 PLC分布式从站: IO模块的拉远 &#xff08;1&am…

Pytorch R-CNN目标检测-汽车car

概述 目标检测(Object Detection)就是一种基于目标几何和统计特征的图像分割,它将目标的分割和识别合二为一,通俗点说就是给定一张图片要精确的定位到物体所在位置,并完成对物体类别的识别。其准确性和实时性是整个系统的一项重要能力。 R-CNN的全称是Region-CNN(区域卷积神经…

Python之文件与文件夹操作

目录 1、Pathlib1.1、glob(),rglob()1.2、目录拼接1.3、重命名1.4、复制文件 2、os3、os.path4、示例 1、Pathlib # 通过cwd()获得当前工作目录 # 通过home()获得主目录from pathlib import Path currentPath Path.cwd() print(f"Current directory: {currentPath}"…

Android开发中自定义饼图以及百分比展示

本篇文章主要讲解有关怎么用自定义View绘制圆形饼图&#xff0c;饼图内容包含&#xff1a;饼图内部添加百分比、绘制短延长线以及长延长线、延长线上添加文字说明。下面进行主要内容分析说明&#xff0c;文章最后附上全部代码以及具体使用说明&#xff1a; 效果图&#xff1a;…

3d max软件中的缓存垃圾该如何清理?

使用3d max建模到渲染操作&#xff0c;来回对效果图调整的次数过多时&#xff0c;就会出现一下看不到的垃圾缓存&#xff0c;影响保存的速度&#xff0c;影响效率&#xff01; 对于这类的3d垃圾清理的有什么高效方法呢&#xff1f; 3dmax垃圾清理的常规操作如下&#xff1a; 1、…

pandas的一些函数

1、pd.read_csv () 读取csv文件 import pandas as pddf pd.read_csv(Popular_Baby_Names.csv)df pd.read_csv(Popular_Baby_Names.csv, sep;, header0, index_col0, skiprows5, na_valuesN/A)##读取CSV文件data.csv&#xff0c;使用;作为分隔符&#xff0c;第一行作为标题&…

idea 一直卡在maven正在解析maven依赖

修改maven Importing的jvm参数 -Xms1024m -Xmx2048m

OpenAI开发者大会之后,当何去何从?

简介 过往总结 ​产品升级 GPT-4 Turbo Agent化 此间的未来 定制GPT GPT商店 Assistants API 总结与思考 简介 此次发布会简单总结如下。 1. 发布GPT-4 Turbo&#xff1a; 更长。支持128K上下文输入&#xff0c;标准GPT-4是8K版本&#xff0c;之前升级出了32K版本 更…

kubernetes (k8s)的使用

一、kubernetes 简介 谷歌2014年开源的管理工具项目&#xff0c;简化微服务的开发和部署。 提供功能&#xff1a;自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics监控、日志监控、弹性和容错、API管理、服务安全等。官网&#xff1a;https://kubernetes.io/zh-cn…