基于多点通信的PtoP聊天程序

2023-11-12

import java.io.InputStream;
import java.io.OutputStream;
import java.util.Hashtable;

import javax.microedition.io.Connector;
import javax.microedition.io.ServerSocketConnection;
import javax.microedition.io.SocketConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;

//显示指定输入本地端口的窗体,一旦输入,建立该端口的监听
public class Exec extends MIDlet implements CommandListener {
        Display display;
        Form chooseForm = new Form("指定端口");
        TextField tfLocal = new TextField("本地端口:", "", 20, TextField.ANY);
        Command chooseCommand = new Command("确定", Command.OK, 1);

        public Exec() {
                display = Display.getDisplay(this);
        }

        public void startApp() {
                chooseForm.append(tfLocal);
                chooseForm.addCommand(chooseCommand);
                chooseForm.setCommandListener(this);
                display.setCurrent(chooseForm);
        }

        public void pauseApp() {
        }

        public void destroyApp(boolean unconditional) {
        }

        // 获取本地端口号
        public String getLocalPort() {
                return tfLocal.getString();
        }

        public void commandAction(Command com, Displayable arg1) {
                // 创建列表并显示,同时启动监听线程来监听其他用户的连接请求
                if (com == chooseCommand) {
                        PersonList pl = new PersonList(this);
                        display.setCurrent(pl);
                        RecieveInfo ri = new RecieveInfo(tfLocal.getString(), pl);
                        Thread thread = new Thread(ri);
                        thread.start();
                }
        }

        public void setCurrent(Displayable disp) {
                display.setCurrent(disp);
        }
}

// 显示所有通信者的列表,每一个项目的值都是对方的端口
class PersonList extends List implements CommandListener {
        Command communicate = new Command("通讯", Command.OK, 1);
        Command newConnect = new Command("新建连接", Command.BACK, 1);
        Exec exec;
        Hashtable allForms = new Hashtable();
        String localPort;

        public PersonList(Exec exec) {
                super("本地:" + exec.getLocalPort(), List.IMPLICIT);
                localPort = exec.getLocalPort();
                this.exec = exec;
                this.addCommand(communicate);
                this.addCommand(newConnect);
                this.setCommandListener(this);
        }

        public void commandAction(Command com, Displayable arg1) {
                // 新建对其他用户的连接
                if (com == newConnect) {
                        ConnectForm cf = new ConnectForm(this);
                        exec.setCurrent(cf);
                }
                // 对现有用户进行通信
                else if (com == communicate) {
                        String currentPort = this.getString(this.getSelectedIndex());
                        CommunicateForm cf = (CommunicateForm) (allForms.get(currentPort));
                        exec.setCurrent(cf);
                }
        }

        // 恢复列表的显示
        public void displayList() {
                exec.setCurrent(this);
        }

        // 添加新的通信人窗体
        public void addForm(String title) {
                CommunicateForm cf = (CommunicateForm) (allForms.get(title));
                if (cf == null) {
                        this.append(title, null);
                        CommunicateForm newForm = new CommunicateForm(title, this);
                        newForm.append("已经连接/n");
                        allForms.put(title, newForm);
                }
        }

        // 在已有通信人窗体加入新的内容
        public void setForm(String key, String value) {
                CommunicateForm form = (CommunicateForm) allForms.get(key);
                form.append(value);
        }

        public String getLocalPort() {
                return localPort;
        }
}

// 监听线程
class RecieveInfo implements Runnable {
        String localPort;
        PersonList pl;
        ServerSocketConnection scn = null;
        SocketConnection sc = null;
        InputStream is = null;

        public RecieveInfo(String localPort, PersonList pl) {
                this.localPort = localPort;
                this.pl = pl;
        }

        // 启动监听线程,每次请求建立一次连接,接受完信息后即结束该连接
        public void run() {
                try {
                        scn = (ServerSocketConnection) Connector.open("socket://:"
                                        + localPort);
                        while (true) {
                                try {
                                        sc = (SocketConnection) scn.acceptAndOpen();
                                        is = sc.openInputStream();
                                        (new Thread(new Runnable() {
                                                public void run() {
                                                        try {
                                                                int c = 0;
                                                                StringBuffer sb = new StringBuffer();
                                                                while (((c = is.read()) != '/n') && (c != -1)) {
                                                                        sb.append((char) c);
                                                                }
                                                                String remotePort = sb.toString();
                                                                sb = new StringBuffer();
                                                                pl.addForm(remotePort);
                                                                while (((c = is.read()) != '/n') && (c != -1)) {
                                                                        sb.append((char) c);
                                                                }
                                                                if (!sb.toString().equals("")
                                                                                && sb.toString() != null)
                                                                        pl.setForm(remotePort, "对方:"
                                                                                        + new String(sb.toString()
                                                                                                        .getBytes("ISO-8859-1"),
                                                                                                        "GB2312") + "/n");

                                                        } catch (Exception e) {
                                                                System.out.println(e.getMessage());
                                                        } finally {
                                                                try {
                                                                        is.close();
                                                                        sc.close();
                                                                } catch (Exception e) {
                                                                        System.out.println(e.getMessage());
                                                                }
                                                        }
                                                }
                                        })).start();
                                } catch (Exception e) {
                                        System.out.println(e.getMessage());
                                }
                        }
                } catch (Exception e) {
                        System.out.println(e.getMessage());
                } finally {
                        try {
                                scn.close();
                        } catch (Exception e) {
                                System.out.println(e.getMessage());
                        }
                }
        }
}

// 负责通讯的表单
class CommunicateForm extends Form implements CommandListener {
        PersonList pl;
        TextField content = new TextField("输入:", "", 20, TextField.ANY);
        Command chooseCommand = new Command("确定", Command.OK, 1);
        Command exitCommand = new Command("退出", Command.BACK, 1);

        public CommunicateForm(String title, PersonList pl) {
                super(title);
                this.pl = pl;
                this.append(content);
                this.addCommand(chooseCommand);
                this.addCommand(exitCommand);
                this.setCommandListener(this);
        }

        public void commandAction(Command com, Displayable arg1) {
                if (com == exitCommand) {
                        pl.displayList();
                } else if (com == chooseCommand) {
                        pl.setForm(this.getTitle(), "自己:" + content.getString() + "/n");
                        SendInfo si = new SendInfo(pl, this.getTitle(), content.getString());
                        Thread thread = new Thread(si);
                        thread.start();
                }
        }
}

// 负责连接的表单
class ConnectForm extends Form implements CommandListener {
        PersonList pl;
        TextField remotePort = new TextField("远程端口:", "", 20, TextField.ANY);
        Command chooseCommand = new Command("确定", Command.OK, 1);
        Command exitCommand = new Command("退出", Command.BACK, 1);

        public ConnectForm(PersonList pl) {
                super("");
                this.pl = pl;
                this.append(remotePort);
                this.addCommand(chooseCommand);
                this.addCommand(exitCommand);
                this.setCommandListener(this);
        }

        public void commandAction(Command com, Displayable arg1) {
                if (com == exitCommand) {
                        pl.displayList();
                } else if (com == chooseCommand) {
                        pl.addForm(remotePort.getString());
                        pl.displayList();

                        // 将当前监听端口发送过去,便于多方回传信息
                        SendInfo si = new SendInfo(pl, remotePort.getString(), "/n");
                        Thread thread = new Thread(si);
                        thread.start();
                }
        }
}

// 发送信息的线程
class SendInfo implements Runnable {
        PersonList pl;
        String remotePort;
        String value;
        SocketConnection sc;
        OutputStream os;

        public SendInfo(PersonList pl, String remotePort, String value) {
                this.pl = pl;
                this.remotePort = remotePort;
                this.value = value;
        }

        public void run() {
                try {
                        sc = (SocketConnection) Connector.open("socket://localhost:"
                                        + remotePort);
                        os = sc.openOutputStream();
                        os.write(pl.getLocalPort().getBytes());
                        os.write("/n".getBytes());
                        os.write(value.getBytes());
                        os.write("/n".getBytes());
                        os.close();
                        sc.close();
                } catch (Exception e) {
                        System.out.println(e.getMessage());
                }
        }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于多点通信的PtoP聊天程序 的相关文章

  • 从字符串中删除特定字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何从字符串中删除特定字符 我有一个 Arraylist 测试数组 String line testingarray get index
  • 如何在 Python 中反转字符串?

    没有内置的reversePython 的函数str目的 实施此方法的最佳方式是什么 如果提供非常简洁的答案 请详细说明其效率 例如 是否str对象转换为不同的对象等 Using slicing https stackoverflow com
  • Python 中的“断言”有什么用?

    什么是assert意思是 它是如何使用的 The assert语句几乎存在于所有编程语言中 它有两个主要用途 它有助于在程序早期发现问题 原因明确 而不是等到其他操作失败时才发现问题 例如 Python 中的类型错误在实际引发错误之前可能会
  • Spring @ControllerAdvice 与 ErrorController

    在我的 REST 服务应用程序中 我计划创建一个 ControllerAdvice捕获控制器抛出的异常并返回的类ResponseEntity根据错误类型的对象 但我已经有一个 RestController类实现ErrorController
  • 从数组中提取值并将其转换为字符串的最佳方法是什么(允许 ES6)?

    我正在尝试采用这样的数组 location Id 000 000 Name Foo Id 000 001 Name Bar etc 提取 Id 并将它们组合成单个字符串 同时在每个值前面附加一个静态字符串 myId 的最有效 最干净的方法是
  • 在Java中执行.lnk文件

    我需要在java中执行 lnk文件 指向exe文件的lnk文件 我能怎么做 在 VB net 中我做 Process Start path 它有效 谢谢你的帮助 Use a 流程构建器 http download oracle com ja
  • 使用 Elmah 进行异常处理

    我用 Elmah 记录异常 想知道我使用的技术是否是好的设计 现在 我捕获并重新抛出各种类和方法中发生的异常 并将它们记录到程序的主 try catch 块中的 Elmah 主程序 try Some code that fires off
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • PHP中用逗号分解复杂字符串

    我需要分割一个包含逗号的字符串 我已经找到了类似字符串的东西 str getcsv A B with a comma eh C 但我的字符串是这样的 例如值没有包含字符 A B one two C 我需要分解它并获得 array 3 0 g
  • 字符串插值搜索

    对于那些不熟悉插值搜索的人来说 这是一种在排序数组中搜索值的方法 可能比二分搜索更快 您查看第一个和最后一个元素 并 假设数组的内容均匀分布 线性插值以预测位置 例如 我们有一个长度为 100 的数组 其中 array 0 0 和 arra
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • 服务具有零个应用程序(非基础设施)端点

    我最近创建了一个WCF服务 dll 和一个服务主机 exe 我知道我的 WCF 服务工作正常 因为我能够成功地将服务添加到 WcfTestClient 但是 当我从服务主机 exe 使用 WCF 时 我似乎遇到了问题 我可以将对 WCF d
  • 获取ERLANG中的最长公共子序列

    我是这个 ERLANG 的新手 我了解基础知识 这就像计划 但范围更广 我知道如何创建一个函数 但在创建一个获取最长公共子序列的函数时遇到问题 lcs str1 str2 是一个接受两个字符串并输出一个整数的函数 lcs algorithm
  • System.Drawing.Image.Save 抛出ExternalException:GDI 中发生一般错误

    我有一个函数 它需要一个位图 复制它的一部分并将其保存为 8bpp tiff 结果图像的文件名是唯一的并且文件不存在 程序有权写入目标文件夹 void CropImage Bitmap map Bitmap croped new Bitma
  • 为什么replaceAll在这行代码中不起作用? [复制]

    这个问题在这里已经有答案了 String weatherLocation weatherLoc 1 toString weatherLocation replaceAll how weatherLocation replaceAll wea
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • Java中字符串中特殊字符的替换

    Java中如何替换字符串 E g String a adf sdf 如何替换和避免特殊字符 您可以删除除此之外的所有字符可打印的 ASCII 范围 http en wikipedia org wiki ASCII ASCII printab
  • Python:字符串不会转换为浮点数[重复]

    这个问题在这里已经有答案了 我几个小时前写了这个程序 while True print What would you like me to double line raw input gt if line done break else f

随机推荐

  • 百度搜索自动补全(百度搜索常见api)

    一 百度搜索常用api 百度搜索常用api 一 搜索关键字自动补全 一 数据源 https sp0 baidu com 5a1Fazu8AA54nxGko9WTAnF6hhy su wd 关键词 json 1 二 代码 可以使用前端插件 B
  • DDT数据驱动+yaml/csv(自动化测试,接口测试)

    目录 1 ddt读取yaml文件 2 ddt读取csv文件 3 ddt式测试报告怎么填用例描述 背景 对于输入框来言 使用等价类边界值 场景法等进行数据输入 接口相同 输入的内容都非常相似 却有不同的响应结果 如果我们对于每次输入都编写一条
  • Linux中的$0、$1、$@、$?、$*等特殊变量介绍

    特殊变量 是传给脚本的参数个数 0 是脚本本身的名字 1 是传递给该shell脚本的第一个参数 2 是传递给该shell脚本的第二个参数 是传给脚本的所有参数的列表 是以一个单字符串显示所有向脚本传递的参数 与位置变量不同 参数可超过9个
  • Invalid prop: type check failed for prop “data“. Expected Array, got Object[已解决]

    Vue warn Invalid prop type check failed for prop data Expected Array got Object 要处理这个bug就必须先明白这个bug到底是什么类型是怎么一回事 那字面意思就是
  • Mirai环境搭建

    20200805 引言 关于Mirai的环境搭建 我记得能搜到很多结果 不过我当时并没有想要启动mirai的所有功能 毕竟其实他的代码也有缺陷 现在想扫出来结果也有点难了 后面可能还是需要这些功能来辅助扫描结果 其他功能还是要开启 这里先记
  • C语言基础_文件操作-1

    目录 写在前面 学习目标 学习总结 正文 1 文件打开 关闭 2 getc putc 3 fprintf fscanf gets不安全 用fgets 4 fgets gputs 5 文件光标操作 a fseek ftell long范围内操
  • C++语言分号的使用

    C 语言中 表达式的一部分能够组成独立的语句 所以必须加分号分割 c a b 成立 c a b 也成立 if 1 1 do something 成立 if 1 1 do something 也成立 class foo bar 成立 含义为独
  • c++能不能给类的成员变量在声明的时候初始化?

    能 可能早先的版本不能 但是c 11标准下能 有人说在声明的时候初始化相当于在构造函数中初始化 其实不是的 成员变量初始化的顺序为 先进行声明时初始化 然后进行初始化列表初始化 最后进行构造函数初始化 如下代码 另外初始化列表中初始化的顺序
  • STM32启动BOOT0 BOOT1设置方法

    转载自 https www jianshu com p 38c4a90bac19 不同的下载方式对应STM32启动方式也不同 如下图是STM32三种启动方式 第一种启动方式是最常用的用户FLASH启动 正常工作就在这种模式下 STM32的F
  • webpack4 sideEffects实战轻松搞懂

    sideEffects 译作副作用 函数副作用是指函数在正常工作任务之外对外部环境所施加的影响 具体地说 函数副作用是指函数被调用 完成了函数既定的计算任务 但同时因为访问了外部数据 尤其是因为对外部数据进行了写操作 从而一定程度地改变了系
  • Vue的过渡

    目录 单元素过渡 1 css过渡 2 过渡的类名介绍 3 CSS动画 4 自定义过渡的类名 5 元素过渡使用JavaScript钩子函数 多元素过渡 1 基础用法 2 key属性 3 过渡模式 多组件过渡 列表过渡 单元素过渡 1 css过
  • Android Zebra斑马打印机 打印面单不清楚 解决方法

    刚开始的效果 字体模糊 分析原因 1 打印机的打印浓度太低 2 文本字体不对 3 bitmap的问题 因为这个面单是通过view 获取到bitmap再喂给打印机打印的 下载打印机的驱动 设置打印机打印浓度 没有效果 调整字体类型没有效果 分
  • Java 加解密技术系列之 SHA

    序 上一篇文章中介绍了基本的单向加密算法 MD5 也大致的说了说它实现的原理 这篇文章继续之前提到的单向加密 主要讲的是 SHA 同 MD5 一样 SHA 同样也是一个系列 它包括 SHA 1 SHA 224 SHA 256 SHA 384
  • 服务器怎么开虚拟用户,Linux文件服务器实战详解(虚拟用户)

    vsftpd基于系统用户访问ftp服务器 系统用户越多越不利于管理 不利于系统安全 这样就以vsftp虚拟防护的方式来解决 虚拟用户没有实际的真实系统用户 而是通过映射到其中一个真实用户以及设置相应权限来访问验证 虚拟用户不能登陆系统 1
  • android项目迁移到androidX:类映射(android.support.design*)

    支持库类 AndroidX 类 android support design animation AnimationUtils com google android material animation AnimationUtils and
  • 01. 实现登录功能的UI自动化测试脚本

    在软件开发过程中 登录功能是一个非常重要且常见的功能 为了确保登录功能的稳定性和正确性 我们可以利用UI自动化测试来自动验证登录流程 本文将介绍如何编写一个登录功能的UI自动化测试脚本 并通过使用Selenium和pytest库实现自动化测
  • rbf神经网络预测matlab_MATLAB 基于灰色神经网络的预测算法研究—订单需求预测...

    点击上方蓝字关注 公众号 MATLAB 神经网络变量筛选 基于BP的神经网络变量筛选 灰色系统理论是一种研究少数据 贫信息 不确定性问题的新方法 它以部分信息已知 部分信息未知的 小样本 贫信息 不确定系统为研究对象 通过对 部分 已知信息
  • aot类型的自定义算子能编译成功,也能被调用,但运行时报错(官网leakyrelu示例)

    环境 mindspore gpu 2 0 cuda 11 1 代码 执行到这行报错 报错 解答 根据日志我们可以看到是dlopen失败 该行日志对应的完整截图信息 需要查看日志里的error message以进一步定位原因
  • 自动刷新网页代码(可多个网页)

    前言 在我们的日常工作中 有时候会遇到这种需求 就是需要不停的刷新当前页面 看看是否有变化 但是又不想手动去刷新 当然了 在浏览器的开发者工具里面点击拓展 会发现有一些现成的工具 但是不一定好用 而且很难同时刷新多个网页 因此本篇博客利用p
  • 基于多点通信的PtoP聊天程序

    import java io InputStream import java io OutputStream import java util Hashtable import javax microedition io Connector