当前位置: 首页 > news >正文

做视频网站 许可证/seo外贸公司推广

做视频网站 许可证,seo外贸公司推广,手机网站怎么制作内容,了解龙岗网站建设JAVA网络编程Socket常见问题 一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind。 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的…
JAVA网络编程Socket常见问题

一. 网络程序运行过程中的常见异常及处理


第1个异常是 java.net.BindException:Address already in use: JVM_Bind。

该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。


第2个异常是java.net.ConnectException: Connection refused: connect。

该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。


第3个异常是java.net.SocketException: Socket is closed,

该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。


第4个异常是java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。

该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。


第5个异常是java.net.SocketException: Broken pipe。

该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出 SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。前两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。


二.编写网络程序时需要注意的问题
第1个问题是要正确区分长、短连接。所谓的长连接是一经建立就永久保持。短连接就是在以下场景下,准备数据—>建立连接— >发送数据—>关闭连接。很多的程序员写了多年的网络程序,居然不知道什么是长连接,什么是短连接。


第2个问题是对长连接的维护。所谓的维护包括两个方面,首先是检测对方的主动断连(既调用 Socket的close方法),其次是检测对方的宕机、异常退出及网络不通。这是一个健壮的通信程序必须具备的。检测对方的主动断连很简单,主要一方主动断连,另一方如果在进行读操作,则此时的返回值只-1,一旦检测到对方断连,则应该主动关闭己方的连接(调用Socket的close方法)。而检测对方的宕机、异常退出及网络不通常用方法是用“心跳”,也就是双方周期性的发送数据给对方,同时也从对方接收“心跳”,如果连续几个周期都没有收到对方心跳,则可以判断对方或者宕机或者异常推出或者网络不通,此时也需要主动关闭己方连接,如果是客户端可在延迟一定时间后重新发起连接。虽然Socket有一个keep alive选项来维护连接,如果用该选项,一般需要两个小时才能发现对方的宕机、异常退出及网络不通。

第3个问题是处理效率问题。不管是客户端还是服务器,如果是长连接一个程序至少需要两个线程,一个用于接收数据,一个用于发送心跳,写数据不需要专门的线程,当然另外还需要一类线程(俗称Worker线程)用于进行消息的处理,也就是说接收线程仅仅负责接收数据,然后再分发给Worker进行数据的处理。如果是短连接,则不需要发送心跳的线程,如果是服务器还需要一个专门的线程负责进行连接请求的监听。这些是一个通信程序的整体要求,具体怎么设计你的程序,就看你自己的设计水平了。

-------------------------------------------------------------

Socket 通信(发送&接收)

最近工作需要,做了一点Socket通讯的东西,积累一点经验,与大家共分享
其中通过短连接方式接收Socket返回消息,死循环,分别判断接收和超时,来确定连接连接状况
通过字节流的形式获取socket返回消息,主要是因为通过readline的方式,在我们系统通讯中存在异常。
具体客户端代码如下:

import java.net.*;
import java.io.*;
import org.apache.log4j.Logger;
public class SocketClient {
static Logger log = Logger.getLogger(SocketClient.class.getName());   //日志记录信息
    private String hostName;
    private int portNum;
    private int delaySecond;    // 发文接收返回报文延时
public SocketClient() {
        this.hostName = "192.168.0.1";
        this.portNum = 7000;
        this.delaySecond = 50000;
        pFileOp = null;
    }
private Socket getSocket() {
        Socket socket = null;
        try {
            socket = new Socket(hostName, portNum);
        } catch (UnknownHostException e) {
            System.out.println("-->未知的主机名:" + hostName + "    异常");
        } catch (IOException e) {
            System.out.println("-hostName=" + hostName + "   portNum="
                    + portNum + "---->IO异常错误" + e.getMessage());
        }
        return socket;
    }
    public String sendMessage(String strMessage) {
        String str = "";
        String serverString = "";
        Socket socket;
        try {
            socket = getSocket();
            // socket.setKeepAlive(true);
            if (socket == null) { // 未能得到指定的Socket对象,Socket通讯为空
                return "0001";
            }
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            //log.info("---->发送报文="+strMessage);
            out.println(strMessage);
            out.flush();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            long sendTime = System.currentTimeMillis();
            long receiveTime = System.currentTimeMillis();
            boolean received = false; // 成功接收报文
            boolean delayTooLong = false;
            serverString = null;
            while (!received && !delayTooLong) {
                if (socket.getInputStream().available() > 0) {
                    // serverString = in.readLine();
                    char tagChar[];
                    tagChar = new char[1024];
                    int len;
                    String temp;
                    String rev = "";
                    if ((len = in.read(tagChar)) != -1) {
                        temp = new String(tagChar, 0, len);
                        rev += temp;
                        temp = null;
                    }
                    serverString = rev;
                }
                receiveTime = System.currentTimeMillis();
                if (serverString != null)
                    received = true;                                        // 字符串不为空,接收成功
                if ((receiveTime - sendTime) > delaySecond)
                    delayTooLong = true;                                    // 接收等待时间过长,超时
            }
            in.close();
            out.close();
str=serverString;
            if (delayTooLong) str="2190";                                   //超时标志为真,返回超时码
            if (!received) str ="2190";
            socket.close();
        } catch (UnknownHostException e) {
            log.error("---->出现未知主机错误! 主机信息=" + this.hostName + "   端口号="
                    + this.portNum + "  出错信息=" + e.getMessage());
            str = "2191";
            // System.exit(1);
        } catch (IOException e) {
            log.error("---->出现IO异常! 主机信息=" + this.hostName + "   端口号="
                    + this.portNum + "  出错信息=" + e.getMessage());
            e.printStackTrace();
            str = "2191";
        } catch (Exception e) {
            str="2177";
            log.error("---->出现未知异常" + e.getMessage());
        } finally {
            socket = null;
            str.trim();
            //log.info("--->返回的socket通讯字符串="+str);
            return str;
        }
    }
  
}
-------------------------------------------------------


Socket客户端与服务器建立连接A,连接B 
A,B 连接得到服务器确认后 
A承担工作,发送接受命令与服务端通讯,同时每隔6秒发送心跳包到服务端 
B承担工作,接受服务端返回心跳 包,30秒接受不到心跳包,判断出连接断开
网上很多写自定义心跳实现长连接,却没有Java方面客户端的代码实现

http://www.lbrq.cn/news/826831.html

相关文章:

  • 建设微信商城网站制作/优化seo方案
  • ecshop网站价格/重庆森林经典台词梁朝伟
  • 邯郸疫情最新情况 最新消息/北京seo公司工作
  • 网站新闻发布后前台不显示/seo关键词查询
  • 事业单位网站备案/百度seo多久能优化关键词
  • 微信分销网站建设哪家好/重庆网站页面优化
  • 企业网站建设方式/企业营销型网站建设
  • 河北交通建设投资集团公司网站/千峰培训可靠吗?
  • 太原网页设计师/seo技术学院
  • 企业自助建站软件/免费的api接口网站
  • 公司网站建设完成通知/seo优化按天扣费
  • 宜兴做网站的联系方式/市场seo是什么
  • 内容电商的网站如何做/发稿服务
  • 哈尔滨网站制作公司/seo免费诊断联系方式
  • 网站建设服务领域/公司网站优化
  • 怎么用新浪云做网站/网站优化排名软件网
  • 专业网站制作公司/商丘搜索引擎优化
  • 网站运营计划书/企业培训机构有哪些
  • 利为汇网站建设/国内最新消息新闻
  • 摄影网站建立/网络营销公司怎么注册
  • 金融网站可以做公安备案/推广关键词
  • 会展网站建设情况/html网页制作代码大全
  • linux系统网站建设/百度搜索热度指数
  • o2o网站建设如何/快速搭建网站的工具
  • 简单的网站/免费网站建设哪家好
  • 交通设施东莞网站建设/网络营销方案案例
  • 部门做网站优点/淘宝网店的seo主要是什么
  • 有做公司网站/上海快速排名优化
  • 深度开发/网店seo关键词
  • 老网站不要了做新站需要怎么处理/网络舆情管控
  • 06 51单片机之矩阵键盘
  • 链表的基本操作
  • 【愚公系列】《MIoT.VC》002-构建基本仿真工作站(布局一个基本工作站)
  • [spring6: AspectJAdvisorFactory AspectJProxyFactory]-源码解析
  • 从丢包到恢复:TCP重传机制的底层逻辑全解
  • sql练习二