首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java中的持久客户端-服务器套接字连接

Java中的持久客户端-服务器套接字连接
EN

Stack Overflow用户
提问于 2015-10-27 14:59:08
回答 1查看 3.5K关注 0票数 2

我试着用Java建立双向通信。为此,我创建了一个简单的客户机-服务器程序(我甚至不确定这是否是正确的方法,因为它们都被认为是客户端!)。我的要求是,两个程序一旦连接,就应该维护连接,并且能够偶尔发送消息。但是,目前我的套接字一旦发送数据(客户端的main方法已经执行)就终止了。

如何维护连接,以便使其持久?

有什么方法可以使它以一种更适合我的需求的异步方式工作(我不希望服务器总是在while中循环)?

客户端:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class EchoClient2 {
    String serverHostname = new String("127.0.0.1");
    BufferedReader stdIn;
    Socket echoSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;

    public void open(){
        System.out.println("Attemping to connect to host " + serverHostname
                + " on port 9999.");
        try {
            echoSocket = new Socket(serverHostname, 9999);
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(
                    echoSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + serverHostname);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for " + "the connection to: "
                    + serverHostname);
        }
    }

    public void send(String s){
        out.println(s);
    }

    public String receive(){
        String result = "";
        try {
            result = in.readLine();
            System.out.println("client received: "+result);
            if(result==null)
                return "0";
        } catch (IOException e) {
        }
        return result;
    }


    public static void main(String[] args) {
        EchoClient2 ec = new EchoClient2();
        ec.open();
        ec.send("1");
        ec.receive();
    }
}

服务器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer extends Thread {
    protected Socket clientSocket;

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;

        try {
            serverSocket = new ServerSocket(9999);
            System.out.println("Connection Socket Created");
            try {
                while (true) {
                    System.out.println("Waiting for Connection");
                    new EchoServer(serverSocket.accept());
                }
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.exit(1);
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port: 9999.");
            System.exit(1);
        } finally {
            try {
                serverSocket.close();
            } catch (IOException e) {
                System.err.println("Could not close port: 9999.");
                System.exit(1);
            }
        }
    }

    private EchoServer(Socket clientSoc) {
        clientSocket = clientSoc;
        start();
    }

    public void run() {
        System.out.println("New Communication Thread Started");

        try {
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
                    true);
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    clientSocket.getInputStream()));

            String inputLine;

            while ((inputLine = in.readLine()) != null) {
                System.out.println("Server received: " + inputLine);
                out.println(inputLine);

                if (inputLine.equals("Bye."))
                    break;
            }

//          out.close();
//          in.close();
//          clientSocket.close();
        } catch (IOException e) {
            System.err.println("Problem with Communication Server");
            System.exit(1);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-21 04:33:31

首先,对迟来的答复表示歉意。我也被困在这个java套接字编程中。我还想打开一个套接字,并保持它为客户端和服务器之间的通信打开。在搜索和阅读了许多书籍和文章之后,我找到了最简单的解决方案。您可以将android生命周期用于

在onStart方法上打开套接字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  protected void onStart() {
        super.onStart();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    client = new Socket(ip,Integer.valueOf(port) );
                    client.setKeepAlive(true);

                   dataInputStream = new DataInputStream(client.getInputStream());
                  //  readdata=readdata+" "+dataInputStream.readUTF();

                    readdata=dataInputStream.readUTF();
                }
                catch (Exception e){
                    e.printStackTrace();
                }
            }
        }).start();
    }

并关闭onStop方法上的套接字

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 protected void onStop() {
        super.onStop();
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33379987

复制
相关文章
增量接口的设计及实现
高爽
2017/12/28
2.9K0
浅谈接口diff设计实现应用
1 背景 随着业务量和业务复杂度度增加,每次业务迭代都需要考虑业务影响域进行回归,效率低 业务重构导致覆盖度一定程度上不完全,质量不高 tcp接口众多,http接口更接近业务场景 因为上述业务特点,故选择了接口diff的方式改进测试过程中效率和质量问题 2 实现目标 根据环境数据配置进行接口数据对比,找出结果中的差异 用例集成,使用csv文件管理用例case,支持不同业务线用例统一管理 jenkins集成,自动化下载代码、执行用例、生成测试报告 入口集成,统一集成到开放平台中形成数据闭环,可选择具体业务线
雷子
2021/03/15
1K0
浅谈接口diff设计实现应用
Golang 基础:接口使用、实现原理(eface iface)和设计模式
本文是我学习 Go Tour 和 Go 语言第一课 接口相关章节的笔记,如有理解不当之处,恳请留言指出,感谢!
张拭心 shixinzhang
2022/05/10
6130
Golang 基础:接口使用、实现原理(eface iface)和设计模式
HBase设计结构和原理
既然是Write-Ahead-Log,为何先写内存再写WAL? 先写内存的原因:HBase提供了一个MVCC机制,来保障些数据阶段的数据可见性。先写MemStore再写WAL,是为了一些特殊场景下,内存中的数据能够更及时的返回。如果先写WAL失败的话,MemStore助攻的数据会被回滚。
俺也想起舞
2019/07/25
2.4K0
HBase设计结构和原理
接口设计技巧和最佳实践
你的响应应该是在代码中严格定义的嵌套数据业务模型,不要依赖数据库查询结果映射,或者其他操作
公众号_松华说
2019/07/16
1.4K0
接口设计技巧和最佳实践
RESTful接口设计原则和优点
RESTful架构优点: 前后端分离,减少流量 安全问题集中在接口上,由于接受json格式,防止了注入型等安全问题 前端无关化,后端只负责数据处理,前端表现方式可以是任何前端语言(android,ios,html5) 前端和后端人员更加专注于各自开发,只需接口文档便可完成前后端交互,无需过多相互了解 服务器性能优化:由于前端是静态页面,通过nginx便可获取,服务器主要压力放在了接口上 RESTful架构设计原则(不同公司具体细节可能不同): 在接口命名时应该用名词,不应该用动词,因为通过接口操作到是资源。
用户1558882
2018/04/03
3.7K0
RESTful接口设计原则和优点
接口测试平台代码实现11: 用户管理模块设计和开发
上节,我们已经做完了首页,那么针对于一个平台来说,这并不仅仅是一个有界面的工具/脚本,而是实实在在可多人协同使用的平台。那么就必然不可缺少 用户概念。
我去热饭
2022/05/19
6770
接口测试平台代码实现11: 用户管理模块设计和开发
数字证书结构描述+解析的C程序设计和实现
版本(version)为整数格式。到目前为止,证书格式的版本只有v1、v2、v3,分别用整数0、1、2表示。
梦飞
2022/06/23
7700
数字证书结构描述+解析的C程序设计和实现
Zencart模板结构和设计详解[通俗易懂]
Zen Cart的设计很简单,和其他HTML页面是一样的。只是整个页面分成了几个部分,并加入了PHP代码。 通常分为页眉 (header),页脚(footer),边框(sideboxes)。页面通过CSS样式表来控制,样式表控制了包括表格单元的背景图案、字体颜色和样 式等等,所以假如你需要修改边框标题栏的字体,那么就去查看样式表文件。 Zen Cart在页面添加图像有两种方式。可以使用图像目录的相对路径,或者在模板中用php变量定义图像。如果你使用https服务器,并且采用相对图像路 径,那么https的图像目录下也要有同样的图像,否则https服务器很可能会给出警告提示。 Zen Cart可以设置成任意的html/flash的界面,只是比通常的html页面的设计费时。你可以从修改缺省的模板开始,先修改CSS文件和三栏格式的 界面。开始先采用不同的颜色,很快就可以设计出完全不同的风格。
全栈程序员站长
2022/09/18
7970
乒乓结构和流水线设计
乒乓结构 l 通过“输入数据选择单元”和“输出数据选择单元”按节拍、相互配合的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算与处理。 l 节约缓存空间 流水线操作 l 流
瓜大三哥
2018/02/24
1.9K0
乒乓结构和流水线设计
Redis 设计 --- 高效数据结构实现剖析
即使有链表来处理键冲突,但是当节点数量远远大于 size 时,如果不扩充哈希表规模,请自行想象。这也是 rehash 的存在意义,笔者认为这也是 redis 扩展性的展现。
Arbiter
2018/07/17
5220
微信授权接口的使用设计与实现
今天给大家演示一下微信授权的接口的实现,首先这个接口的实现有好多种方法,所以咱们有必要根据需求设计一下,将接口设计的通用和灵活。
挥刀北上
2019/07/19
1.4K0
微信授权接口的使用设计与实现
设计模式之接口隔离原则C++实现
实现方法:要为各个类建立它们需要的专用接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。
用户9831583
2022/06/16
4890
设计模式之接口隔离原则C++实现
Go通关06:struct和interface,结构体和接口的使用
结构体是种聚合类型,里面可以包含任意类型的值,这些值就是结构体的成员,或成为字段,定义结构体,需要使用 「type+struct」 关键字组合
微客鸟窝
2021/08/18
2.5K0
怎样设计接口?
众所周知,接口是提供给其它模块或者系统使用的一种约定或者规范。因此接口必需要保 证足够的稳定性和易用性。这是设计接口的基本要求。
全栈程序员站长
2022/07/13
9060
HTTP接口设计
一个HTTP/2连接是运行在TCP连接上的应用层协议。客户端是TCP连接的发起者。
陌无崖
2020/07/27
1.8K0
面向接口设计与角色接口
问题:在做项目的时候,是不是所有包含非静态方法的类,都要写一个接口?是因为这样的目的是为了解耦,然后通过DI注入实现吗?
张逸
2018/07/27
7110
微信小程序的Web API接口设计及常见接口实现
微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示。
极乐君
2020/09/08
2.7K0
微信小程序的Web API接口设计及常见接口实现
Spring Boot 实现json和jsonp格式数据接口Spring boot 实现json和jsonp格式数据接口
1.新建一个类继承AbstractJsonpResponseBodyAdvice,重写父类构造方法, 传入callback和jsonp参数。
一个会写诗的程序员
2018/08/17
1K0
数据结构顺序表C实现(14个用户接口)
将顺序表(ADT SqList)的数据对象,数据关系及基本操作(函数)用C语言实现,并测试。
里克贝斯
2021/05/21
4710
数据结构顺序表C实现(14个用户接口)

相似问题

实现/接口继承设计问题

20

C#接口设计指南,实现接口的接口

30

C#:接口实现结构和覆盖

10

设计服务接口以允许同步和异步实现

20

Haskell:用接口和多态函数实现设计

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文