首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >java套接字与服务器端断开连接

java套接字与服务器端断开连接
EN

Stack Overflow用户
提问于 2012-05-07 09:36:52
回答 2查看 3.6K关注 0票数 2

我正面临着一个关于服务器端套接字的问题。我的代码是客户端。每当我发送第二条消息(无论是心跳或任何其他消息)时,它在服务器上都会失败,服务器端会记录一个“消息格式错误”,但同样的消息会在第一次成功。请帮我解决这个问题。我的客户端代码:

代码语言:javascript
运行
AI代码解释
复制
    public class Main {

        String Host = "";
        int port = 1111;
        Socket ss;
        BufferedReader in;
        BufferedWriter out;
        String recv;

        public void connection() {
            try {

                ss = new Socket(Host, port);
                ss.setSoTimeout(30000);

                in = new BufferedReader(new InputStreamReader(ss.getInputStream()));
                out = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));

            } catch (UnknownHostException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        public void sender(String regTag) {

            if (ss == null || !ss.isConnected()) {
                connection();
            }
            try {

                if (out != null && regTag != null) {
                    out.write(regTag + "\n");
                    System.out.println("message::" + regTag);
                    out.flush();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public String Reciver() {

            try {

                recv = in.readLine();
                if (ss != null && recv != null) {
                    return recv;
                } else {
                    disconnect();
                    String Str = "nothing...Sorry";
                    return Str;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return "Exception";
            }
        }

        public void disconnect() {
            try {
                System.out.println("socket discoonected.");
                ss.close();
                in.close();
                out.close();
                connection();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        public static void main(String[] args) {


            Main me = new Main();
            me.connection();
            String hbhb = "`SC`0004HBHBB7BDB7BD";
            String login = "`SC`00581.000000CRBTSRVM    00000001DLGLGN    00000002 TXBEG    LOGIN:USER=cvbs,PSWD=password   DEB2CCA8";
            String cut = "`SC`00631.000000CRBT00PPSPHS00000002DLGCON    00000003 TXBEG    CUT PPS FEE:MDN=9610023,CUTFEE=1000,REASON=1   BDB7DA88";
            me.sender(hbhb.trim());
            String str = me.Reciver();
            System.out.println("Response :::" + str);
            me.sender(login.trim());
            String str1 = me.Reciver();
            System.out.println("Response hb:::" + str1);
}

它接收到null ...每隔一秒发送一条消息

来自服务器端的日志

代码语言:javascript
运行
AI代码解释
复制
[121_SERVER] 2012-05-03 14:26:37:213 [ERROR] [ServerAccptor.java:254] ->
errorCode = [UIP-80015] errorDesc = [Uip server has a exception when receiving data from the client,will remove the client,Server [adapter id=121],.]
        at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.listenMsg(ServerAccptor.java:252)
        at com.ztesoft.zsmart.bss.uip.adapter.socket.server.ServerAccptor.run(ServerAccptor.java:117)
Caused by: errorCode = [UIP-9102] errorDesc = []  Describing= [read client message error,will remove client.]
        at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.readByteField(MMLServerAdapter.java:784)
        at com.ztesoft.zsmart.bss.uip.adapters.socket.server.mml.MMLServerAdapter.reciveWholeMsg(MMLServerAdapter.java:671) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-07 10:08:48

您的代码包含了许多糟糕的实践和谬误。

  1. 你正在记录异常,否则就会忽略它们,并做一些奇怪的事情,比如让程序继续运行,返回"Exception“等。这是糟糕的编程。例外是为了帮助你,而不是用创可贴来隐藏血迹。代码在创可贴下不会自我修复。例如,您应该只声明connection()抛出IOException,并让调用者处理它。
  2. 作为(1)您有许多ss != null测试的结果。您甚至不应该处于需要执行I/O并且ss可以为null的状态。同样,正确的异常处理和传播可以避免这种情况。
  3. 作为(1)的进一步结果,您有许多!ss.isConnected()测试,显然是因为错误地认为此API会告诉您连接是否已断开。它不会。它只会告诉你你是否已经连接了Socket。在您的代码中,当您调用ss = new Socket(...)时,您已经连接了它,或者您还没有执行该代码。调用isConnected()不会增加任何值。
  4. 您将在关闭输出流之前关闭套接字输入流。这是不正确的。您应该在finally块中只关闭输出流和套接字本身。这样,输出流就会被刷新。关闭输入流将关闭套接字和输出流,而不刷新它。不要那样做。
票数 4
EN

Stack Overflow用户

发布于 2014-08-17 07:50:46

实际上,正确的答案是MML响应中没有\n。所以这永远不会起作用:

代码语言:javascript
运行
AI代码解释
复制
recv = in.readLine();   

您必须读取响应的消息头部分中给出的消息长度,并读取到该长度。

更新:

  1. 您的MML命令中存在语法错误。看起来您使用的是1.00版本的协议,所以这是一个有效的示例(查找差异):

SC00741.00CRBT PPS 00000001DLGCON 00000004TXBEG PPS CUT FEE:mdn=93784050910,fee=300,id=20140812165011003 F3E0ADDF

你必须用0填充额外的空格,在其他地方你必须用空格填充它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10479779

复制
相关文章
协议栈-断开连接,删除套接字
客户端调用socket程序库的close程序,该程序会委托协议栈生成一个包含断开连接信息的tcp头部(fin比特为1),委托ip模块将数据发送给服务端,并更改当前socket状态(断开连接)
小柔
2022/10/09
1.8K0
协议栈-断开连接,删除套接字
套接字连接状态检测
主动断开连接 主动断开连接会发送,关闭事件 connec函数检测连接状态,getlasterror send发送(tcp keeplive心跳包或者有数据时检测),recv接收判断异常(无数据判断异常) linux中的 select(socket用户和内核传递数组,大小有限制) poll(同select大小无限制,链表维护) epoll(内核态数据) 拔网线 拔网线后,关闭事件不能传递,连接状态不好检测 设置连接或者发送超时,同步套接字超时设置 // platform-specific switch #i
sofu456
2021/12/06
1K0
Java套接字
  本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。
云海谷天
2022/08/09
7880
Java套接字
Python与套接字
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时 客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应 数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束
星陨1357
2023/03/14
2.4K0
Python与套接字
套接字
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/88673990
zy010101
2019/05/25
1.3K0
Java网络编程--套接字Socket
一、套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序)。 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通信占用。 当两个程序需要通信时,可以通过Socket类建立套接字对象并连接在一起。(端口号与IP地址的组合得出的一个网络套接字) 二、示例 (1)客户端服务器端一对一;聊天 1 package mychat; 2 3 import java.io.BufferedReader; 4 import ja
听着music睡
2018/05/18
1.6K0
Java NIO套接字【源码笔记】
本文以代码示例跟踪调用Native函数,看下原型函数的具体释义。例子中“客户端”从文件test02.tmp读取内容后,通过socket发送到“服务端”后写入test01.tmp文件中。
瓜农老梁
2020/02/26
9020
套接字 socket 和 tcp 连接过程
Unix/Linux 基本哲学之一就是"一切皆文件",即一切都可以用 "open -> read/write -> close" 来操作,socket 也可以理解成是一种特殊的文件。
JMCui
2020/12/21
2.5K0
套接字 socket 和 tcp 连接过程
Java NIO之套接字通道
前面一篇文章讲了文件通道,本文继续来说说另一种类型的通道 -- 套接字通道。在展开说明之前,咱们先来聊聊套接字的由来。套接字即 socket,最早由伯克利大学的研究人员开发,所以经常被称为Berkeley sockets。UNIX 4.2BSD 内核版本中加入了 socket 的实现,此后,很多操作系统都提供了自己的 socket 接口实现。通过 socket 接口,我们就可以与不同地址的计算机实现通信。
田小波
2018/04/26
1.2K0
Java NIO之套接字通道
套接字选项
选项影响套接字操作,如 封包路由,OOB数据传输,获取和设置套接字选项分别是 getsockopt  setsockopt 用法如下: int getsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); int setsockopt(SOCKET s,int level,int optname,char* optval,int* optlen); 每个协议层套接字的选项有不同的级别: 应用层:SOL_SOCKET 传输层:IPPR
用户1154259
2018/01/17
1.3K0
Socket(套接字)
TCP/IP只是一个协议栈,Socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。
老马的编程之旅
2022/06/22
1.3K0
Python套接字
Python只支持AF_UNIX(基于文件)、AF_NETLINK(使用标准的BSD套接字接口进行用户级别和内核级别代码之间的IPC)、AF_TIPC(透明的进程间通信)、AF_INET(基于网络)家族。
用户4845306
2019/03/14
1.6K0
浅谈TCP协议(建立与断开连接)
TCP是面向连接的,可靠的进程到进程通信的协议。 TCP提供全双工服务,即数据可在同一时间双向传输,每一个TCP都有发送缓存,用来临时存储数据。 TCP将若干个字节构成一个分组,成为报文段(segment) TCP报文段封装在IP数据报中:
小手冰凉
2019/09/10
2.7K0
浅谈TCP协议(建立与断开连接)
16(套接字)
套接字描述符在Unix系统中是用文件描述符实现的。事实上,许多处理文件描述符函数(read和write)都可以处理文件描述符 要创建一个套接字,可以调用socket函数
提莫队长
2019/02/21
9910
ShadowMove套接字劫持技术分析,巧妙隐藏与C2的连接
在这篇文章中,我们将跟大家介绍如何使用ShadowMove技术在合法程序的网络连接中隐藏自己的恶意链接。我们将展示两个使用ShadowMove技术的PoC,并隐藏我们的恶意软件所建立的连接。第一种方法是完全可靠的,但是第二种方法有自己的问题,如果你要在实际操作中使用它,就必须解决这些问题,我们将在文章的最后讨论这些问题。
FB客服
2021/03/09
1.4K0
ShadowMove套接字劫持技术分析,巧妙隐藏与C2的连接
【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )
Socket 套接字 是一种 进程之间的 通信机制 , 通过套接字可以在 不同的进程之间 进行数据交换 ;
韩曙亮
2023/10/11
5110
【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )
套接字Socket编程
Socket,原意插座、插口。写软件程序时,可以想象成一根网线,一头插在客户端,一头插在服务端,然后进行通信。所以通信前,双方都要建立一个Socket。
JavaEdge
2021/12/07
1.3K0
套接字Socket编程
Socket 套接字协议
A network socket is an internal endpoint for sending or receiving data within a node on a computer network. Concretely, it is a representation of this endpoint in networking software (protocol stack), such as an entry in a table (listing communication protocol, destination, status, etc.), and is a form of system resource.
vanguard
2020/03/18
1.5K0
IPC|网络套接字
为了访问由UDP提供的服务,你需要像以前一样使用套接字和close系统调用,但你需要用两个
heidsoft
2022/04/18
1.1K0
套接字随笔1
accept函数接受一个客户端请求后会返回一个新的SOCKFD值,当有不同的客户端同时有不同请求时,会返回不同的SOCKFD的值。这个不同的值和建立SOCKET 时生成的SOCKFD还是不同的。服务器与客户端之间的通信就是在这些不同的SOCKFD上进行的。
随心助手
2022/11/30
5640

相似问题

JAVA :处理套接字断开连接

40

套接字与节点断开连接

15

在java中断开与套接字的连接

31

套接字断开连接

20

Java套接字断开报告与C#断开

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文