网络编程---Java飞机大战联机

解析服务器端代码

代码是放在app/lib下的src下的main/java,而与之前放在app/src/main下路径不同

Main函数

Main函数里只放着创建MyServer类的一行

public static void main(String args[]){new MyServer();}

MyServer构造函数

1.获取本机IP地址

//获取本机IP地址InetAddress addr = InetAddress.getLocalHost();System.out.println("local host:" + addr);

2.创建serverSocket(创建服务器套接字并绑定到一个端口上)

//创建server socketServerSocket serverSocket = new ServerSocket(9999);System.out.println("listen port 9999");

3.accept方法监听等待

//等待客户端连接while(true){System.out.println("waiting client connect");//从连接请求队列中取出一个客户的连接请求,然后创建与客户连接的Socket对象,并将它返回// 如果队列中没有连接请求,accept()方法就会一直等待,直到接收到了连接请求才返回Socket socket = serverSocket.accept();//连接成功,返回socket对象System.out.println("accept client connect" + socket);new Thread(new Service(socket)).start();}

4.监听成功,创建线程进行通信(上一步while循环内最后一行)

创建线程进行通信

  • 线程构造函数内,new数据传输通道
 class Service implements Runnable{private Socket socket;private BufferedReader in = null;public Service(Socket socket){this.socket = socket;try{//InputStreamReader把字节流转化成字符流//BufferedReader用于读取字符流。它继承自Reader类,提供了按行读取文件的功能in = new BufferedReader(new InputStreamReader(socket.getInputStream()));}catch (IOException ex){ex.printStackTrace();}}
  • 重写的run函数内,用一个while来不断读入客户端传来的流(用BufferedReader)
@Overridepublic void run() {System.out.println("wait client message " );try {while ((content = in.readLine()) != null) {//从socket连接读取到bye标识客户端发出断开连接请求if(content.equals("bye")){System.out.println("disconnect from client,close socket");//关闭socket输入输出流socket.shutdownInput();socket.shutdownOutput();socket.close();   //关闭socket连接break;}else {//从socket连接读取到的不是断开连接请求,则像客户端发信息this.sendMessge(socket);}}} catch (Exception ex) {ex.printStackTrace();}}
  • 如何sendMessage:用PrintWriter
public void sendMessge(Socket socket) {PrintWriter pout = null;try{String message = "hello,client!";System.out.println("messge to client:" + message);//OutputStreamWriter:将字符流转换为字节流//BufferedWriter:是缓冲字符输出流//PrintWriter:字符类型的打印输出流pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8")),true);//利用输出流输出数据pout.println(message);}catch (IOException ex){ex.printStackTrace();}}

解析客户端代码

1.与服务器的连接

NetConn netConn = new NetConn(handler);

2.与服务器的信息交流

其中的writer在与服务器进行连接会把它进行赋值,它是获得了socket输出流的PrintWriter,把信息给到服务器。(注:接收服务器的信息是在netConn线程的run方法里用了一个while)

new Thread(){@Overridepublic void run(){Log.i(TAG, "send message to server");writer.println("hello,server");}}.start();

NetConn是一个线程

在重写的 run 方法里

1.创建socket并连接对象

//创建socket对象socket = new Socket();//connect,要保证服务器已启动socket.connect(new InetSocketAddress("10.0.2.2",9999),5000);

2.获取socket的输入输出流

//获取socket输入输出流in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8"));writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"utf-8")),true);Log.i(TAG,"connect to server");

3.再建一个线程,接收服务器的数据

//接收服务器返回的数据Thread receiveServerMsg =  new Thread(){@Overridepublic void run(){String fromserver = null;try{while((fromserver = in.readLine())!=null){//发送消息给UI线程Message msg = new Message();msg.what = 1;msg.obj = fromserver;toClientHandler.sendMessage(msg);}}catch (IOException ex){ex.printStackTrace();}}};

感觉hander像个快递员???把在服务器接收数据线程里,接收到的东西,打包成message,通过sendMessage函数,发给UI线程(就是那些Activity),进行相应操作。

以下是MainActivity内的Handler

handler = new Handler(Looper.getMainLooper()){//当数据处理子线程更新数据后发送消息给UI线程,UI线程更新UI@Overridepublic void handleMessage(Message msg){if(msg.what == 1){txt.setText(msg.obj.toString());}}};

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

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

相关文章

捋清UITableView展示不同类型数据的差异

背景: UITableView可以展示分组数据和单组数据,一般这两种数据有4种情况: 单组数据的简单类型,本身为字典数组,内部字典key对应的value全为基本数据类型。(如lol英雄展示案例,不分组且组内信息…

一五零、MAC 安装mysql可视化工具连接

mysql安装,按照网上教程一步步安装(官网下载安装包->解压->完成安装),最后在「系统偏好设置」无法启动mysql。 原因:下载的版本是8.0最新版本,MAC上这种方法无法启动成功。 解决方法 换低版本的mys…

如何利用 Go 高效地构建大规模并发网络应用?

要利用Go高效地构建大规模并发网络应用,可以考虑以下几个方面: 使用Goroutine并发处理:Goroutine是Go语言中的轻量级线程,可以轻松创建成千上万个并发的任务。通过使用Goroutine,可以高效地处理大量的并发请求&#xf…

C#版 iText7——画发票PDF(完整)

显示描述&#xff1a; 1、每页显示必须带有发票头、“销售方和购买方信息” 2、明细填充为&#xff1a;当n≤8 行时&#xff0c;发票总高度140mm&#xff0c;每条发票明细行款高度4.375mm&#xff1b; 当8<n≤12行时&#xff0c;发票高度增加17.5mm&#xff0c;不换页&#…

我们一起聊聊 Go 性能工具

从开发到部署的整个过程都离不开基本的负载测试和性能剖析。利用 Go 的 pprof 和跟踪工具&#xff0c;开发人员可以深入了解性能瓶颈、CPU 使用率和内存分配情况。 在开发过程中&#xff0c;从一开始到应用程序的推出都充满了挑战&#xff0c;而负载测试则是其中至关重要的一项…

Kettle 数据抽取工具使用教程:从入门到实战

一、简介 Kettle 是 Pentaho Data Integration (PDI) 的一个组成部分&#xff0c;是一个开源的数据集成工具。它被广泛用于数据的抽取、转换和加载 (ETL) 过程。Kettle 提供了一个易于使用的图形界面&#xff0c;可以轻松设计和执行 ETL 流程。 github 源码地址&#xff1a;ht…

postman教程-19-mock测试

上一小节我们学习了Postman接口参数化方法&#xff0c;本小节我们讲解一下Postman mock测试的方法。 一、什么叫mock测试 mock测试就是在测试过程中&#xff0c;对某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便于测试的一种测试方法&#xff0c…

chatgpt 生成的 左侧导航功能的网页

目录 一、左侧导航 1、效果如下&#xff1a; 2、代码如下&#xff1a; 3、技术点&#xff1a; 1)、箭头居中 2)、导航区域 3)、导航隐藏时&#xff0c;正文重新居中 4)、设置视口高度 这是用chatgpt生成的网页&#xff0c;其实&#xff0c;不是一下子就生成了满足需求的…

Syncovery:跨平台高效文件备份与同步的得力助手

在数字化时代&#xff0c;数据安全与文件同步已成为个人及企业不可或缺的需求。Syncovery作为一款专为Mac和Windows用户设计的文件备份和同步工具&#xff0c;凭借其高效、安全和易用的特点&#xff0c;赢得了广泛赞誉。 一、强大备份功能 Syncovery支持多种备份方案和数据格…

LeetCode 119.杨辉三角 II

1.题目要求如图所示: 示例 1:输入: rowIndex 3 输出: [1,3,3,1]示例 2:输入: rowIndex 0 输出: [1]示例 3:输入: rowIndex 1 输出: [1,1]先用malloc函数创造一个二维数组&#xff0c;变成杨辉三角&#xff0c;然后再用一维数组找到所指的那一行: /*** Note: The returned…

java使用多线程导出数据至excel

大量数据导出 问题 如果数据量较大&#xff0c;那么使用 Apache POI 导出数据可能会导致OOM或者到处时间较长。 解决方案 使用多线程同时导出多个excel&#xff0c;缩短接口响应时间 代码示例 public void test () {List<Test> tests testMapper.selectAll(); // 查…

深入讲解Java线程中 wait 和 notify 的用法和原理

基本概念 wait 和 notify 是 Java 中用于线程间通信的方法&#xff0c;定义在 Object 类中。它们的主要作用是在多线程环境中协调线程的执行顺序。 wait 方法 作用&#xff1a;使当前线程进入等待状态&#xff0c;直到其他线程调用 notify 或 notifyAll 方法唤醒它。调用条件…

c linux 静态库试验

1.概要 2.代码 2.1 main.c #include <stdio.h> #include "add.h"int main(){printf("hello word\n");int a fun(3,5);printf("%d\n",a);return 0; } 2.2 add.c #include "add.h"int fun(int a,int b){return ab; } 2.3 a…

7号楼地面东照西和南照北

里面有个小交换机 断电重启下

labelme安装(通过anaconda)

1.下载安装anaconda 2.安装完成后打开&#xff0c;在环境页里面创建环境 选择3.6.13版本&#xff0c;然后运行 3.安装labelme pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple 使用上面命令加速一下 4.labelme打开并标注 总结&#xff1a;现在版本越来越多…

中小学一级教师相当于什么级别的职称

你知道吗&#xff1f;当你一步步攀登职称的阶梯&#xff0c;达到中小学一级教师的荣誉时&#xff0c;你究竟站在了哪个高度&#xff1f;一级教师不仅是一个职称的标签&#xff0c;更是对你专业能力的认可。 中小学教师的职称体系&#xff0c;就像一幅层次分明的画卷&#xff0c…

vue3.0(十三)内置组件Transition和TransitionGroup

文章目录 简介一、<Transition> 组件1.基本应用2.动画过程中发生的事情3.基于 CSS 的过渡效果4.JavaScript 钩子5.可复用过渡效果6.出现时过渡7.元素间过渡8.过渡模式9.组件间过渡10.动态过渡11.使用 Key Attribute 过渡 二、<TransitionGroup>组件1.​​进入 / 离…

Blender:渲染输出

渲染输出界面 渲染设置界面&#xff1a; 输出设置界面&#xff1a; 输出文件格式 【文档】 视频导出格式&#xff1a; AVI JPEG 使用JPEG压缩的AVI。有损&#xff0c;能得到更小的文件&#xff0c;但大小无法与编解码器的压缩算法得到的文件相比。JPEG 压缩也是数字摄像机使用…

开源项目-MES制造执行系统

哈喽,大家好,今天主要给大家带来一个开源项目-制造执行系统 制造执行系统的主要功能包括系统管理,物料管理,工艺管理,计划管理,在制品管理,数字化平台,数字孪生等模块 <

知识图谱的应用---新零售

文章目录 新零售知识图谱构建过程典型应用 新零售 新零售&#xff0c;即个人、企业以互联网为依托&#xff0c;通过运用大数据、人工智能等先进技术手段并运用心理学知识&#xff0c;对商品的生产、流通与销售过程进行升级改造&#xff0c;进而重塑业态结构与生态圈&#xff0c…