精华内容
下载资源
问答
  • JAVA实现SOCKET短连接

    千次阅读 2013-09-14 21:42:41
    先简单说概念: 1、socket就是TCP...2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。 3
      
    

    先简单说概念: 1、socket就是TCP/IP实现的套接字,就是应用层调用下层服务的接口。

    2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。

    3、长连接则指的是双方交互完毕后,不关闭连接,而让连接一直空闲着等待下一次交互,这样在一次交互前就免去了再重新建立连接的消耗,本机测试一次socket连接需要耗时23毫秒。

    优点就是性能好。缺点有二,一是实现方式比较复杂,需要单独用线程收,发倒是无所谓;二是需要增加链路检测的机制,由于连接在空闲时双方都无法确认对端是否出现异常退出,因为根据TCP/IP,如果连接的一方正常退出,对端都会收到一个信号,而当一方异常退出时,对端是无法收到信号的,这时就会出现connection reset、connection reset by peer和broken pipe异常。

    接下来说说JAVA如何实现短连接。一、先来看发送到方法,这个比较简单。直接获得socket的OutputStream流,然后用write方法,flush方法即可。这里要说明的就是,之前认为使用flush方法在底层就是一个TCP包,其实不然,上层何时按照上面策略封装TCP包上层根本无法知道,经过测试可知,下层封装的TCP包大小与flush无必然联系。这里有个参数可以设置,就是sock.setTcpNoDelay(true),如果设置为true,则对于缓冲区不进行拼接,立即发送。这里涉及nagle算法,用于解决小封包问题,感兴趣的朋友可以自己baidu。

    二、接收时有多种方式。常用的两个类是InputStream和BufferedInputStream,下面简单说一下我看JDK的理解。这里的两个类都是阻塞的读取数据。

    1、InputStream的read(byte[] b,offset,len)方法是直接从流中一个一个read()出来扔到b中的。此方法阻塞到某个事件发生,例如异常、超时、正常收到一个封包。要理解阻塞,就一定要理解好这里的事件退出,异常就不用解释了,比如对方异常关闭连接了;超时就是如果你手工设置了超时时间,当超时时间到时还没能从连接中读到任何数据,此时抛出一个Read Time Out异常;最后一个最难理解,就是从连接中读到一个数据包,此时不管数据包大小是否达到len大小,此方法都可以正常返回,当封包大于len时,只读取len长的数据,这也是它与BufferedInputStream的区别,此时方法结束。

    2、BufferedInputStream的read(byte[] b);直接调用了父类InputStream的read(byte[] b,offset,len)方法,不推荐使用,因为其实并没有用到Buffer功能;

    3、BufferedInputStream的read(byte[] b,offset,len);覆写了父类的方法,方法中用到了read1(byte[] b,offset,len)方法,read1方法中,如果缓冲数组中有数据则直接返回数据,如果缓冲队列中无数据则直接调用InputStream的read(byte[] b,offset,len)方法。可以得到一下推论,如果我调用了read(byte[] b,offset,len)方法,则将第一个封包所有内容全部缓冲到Buffer中,如果第一个封包大于Buffer,则先读取buffer大小的长度到buffer中,如果第一个封包小于Buffer,则全部读取到Buffer中。调用read(byte[] b,offset,len)方法时,如果len小于buffer大小则不用等待IO,直接从buffer中读取,免去IO等待。这里推荐用此方法。

    4、BufferedInputStream 的available()方法返回当前不阻塞就能读到的数据。

    展开全文
  • Java实现Socket短连接

    千次阅读 2012-06-28 16:08:24
    后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。 3、长连接则指的是双方交互完毕后,不关闭连接,而让连接一直空闲着等待下一次交互,这样在一 次交互前就免去了

    一、先简单说概念:

    1、socket就是TCP/IP实现的套接字,就是应用层调用下层服务的接口。
    2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕
    后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。
    3、长连接则指的是双方交互完毕后,不关闭连接,而让连接一直空闲着等待下一次交互,这样在一
    次交互前就免去了再重新建立连接的消耗,本机测试一次socket连接需要耗时23毫秒。
    优点就是性能好。缺点有二,一是实现方式比较复杂,需要单独用线程收,发倒是无所谓;二是需
    要增加链路检测的机制,由于连接在空闲时双方都无法确认对端是否出现异常退出,因为根据
    TCP/IP,如果连接的一方正常退出,对端都会收到一个信号,而当一方异常退出时,对端是无法收
    到信号的,这时就会出现connection reset、connection reset by peer和broken pipe异常。
    接下来说说JAVA如何实现短连接。一、先来看发送到方法,这个比较简单。直接获得socket的
    OutputStream流,然后用write方法,flush方法即可。这里要说明的就是,之前认为使用flush方法
    在底层就是一个TCP包,其实不然,上层何时按照上面策略封装TCP包上层根本无法知道,经过测试
    可知,下层封装的TCP包大小与flush无必然联系。这里有个参数可以设置,就是
    sock.setTcpNoDelay(true),如果设置为true,则对于缓冲区不进行拼接,立即发送。这里涉及
    nagle算法,用于解决小封包问题,感兴趣的朋友可以自己baidu。

    二、接收时有多种方式。常用的两个类是InputStream和BufferedInputStream,下面简单说一下我
    看JDK的理解。这里的两个类都是阻塞的读取数据。
    1、InputStream的read(byte[] b,offset,len)方法是直接从流中一个一个read()出来扔到b中的。
    此方法阻塞到某个事件发生,例如异常、超时、正常收到一个封包。要理解阻塞,就一定要理解好
    这里的事件退出,异常就不用解释了,比如对方异常关闭连接了;超时就是如果你手工设置了超时
    时间,当超时时间到时还没能从连接中读到任何数据,此时抛出一个Read Time Out异常;最后一个
    最难理解,就是从连接中读到一个数据包,此时不管数据包大小是否达到len大小,此方法都可以正
    常返回,当封包大于len时,只读取len长的数据,这也是它与BufferedInputStream的区别,此时方
    法结束。
    2、BufferedInputStream的read(byte[] b);直接调用了父类InputStream的read(byte[] 
    b,offset,len)方法,不推荐使用,因为其实并没有用到Buffer功能;
    3、BufferedInputStream的read(byte[] b,offset,len);覆写了父类的方法,方法中用到了read1
    (byte[] b,offset,len)方法,read1方法中,如果缓冲数组中有数据则直接返回数据,如果缓冲队
    列中无数据则直接调用InputStream的read(byte[] b,offset,len)方法。可以得到一下推论,如果
    我调用了read(byte[] b,offset,len)方法,则将第一个封包所有内容全部缓冲到Buffer中,如果第
    一个封包大于Buffer,则先读取buffer大小的长度到buffer中,如果第一个封包小于Buffer,则全
    部读取到Buffer中。调用read(byte[] b,offset,len)方法时,如果len小于buffer大小则不用等待
    IO,直接从buffer中读取,免去IO等待。这里推荐用此方法。
    4、BufferedInputStream 的available()方法返回当前不阻塞就能读到的数据。


    本文引自:http://hi.baidu.com/9prior/blog/item/48e20a99cba33e046f068c12.html

    展开全文
  • 2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。 3、长连接则指的是双方交互完毕后...

    先简单说概念: 1、socket就是TCP/IP实现的套接字,就是应用层调用下层服务的接口。

    2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。

    3、长连接则指的是双方交互完毕后,不关闭连接,而让连接一直空闲着等待下一次交互,这样在一次交互前就免去了再重新建立连接的消耗,本机测试一次socket连接需要耗时23毫秒。

    优点就是性能好。缺点有二,一是实现方式比较复杂,需要单独用线程收,发倒是无所谓;二是需要增加链路检测的机制,由于连接在空闲时双方都无法确认对端是否出现异常退出,因为根据TCP/IP,如果连接的一方正常退出,对端都会收到一个信号,而当一方异常退出时,对端是无法收到信号的,这时就会出现connection reset、connection reset by peer和broken pipe异常。

    接下来说说JAVA如何实现短连接。一、先来看发送到方法,这个比较简单。直接获得socket的OutputStream流,然后用write方法,flush方法即可。这里要说明的就是,之前认为使用flush方法在底层就是一个TCP包,其实不然,上层何时按照上面策略封装TCP包上层根本无法知道,经过测试可知,下层封装的TCP包大小与flush无必然联系。这里有个参数可以设置,就是sock.setTcpNoDelay(true),如果设置为true,则对于缓冲区不进行拼接,立即发送。这里涉及nagle算法,用于解决小封包问题,感兴趣的朋友可以自己baidu。

    二、接收时有多种方式。常用的两个类是InputStream和BufferedInputStream,下面简单说一下我看JDK的理解。这里的两个类都是阻塞的读取数据。

    1、InputStream的read(byte[] b,offset,len)方法是直接从流中一个一个read()出来扔到b中的。此方法阻塞到某个事件发生,例如异常、超时、正常收到一个封包。要理解阻塞,就一定要理解好这里的事件退出,异常就不用解释了,比如对方异常关闭连接了;超时就是如果你手工设置了超时时间,当超时时间到时还没能从连接中读到任何数据,此时抛出一个Read Time Out异常;最后一个最难理解,就是从连接中读到一个数据包,此时不管数据包大小是否达到len大小,此方法都可以正常返回,当封包大于len时,只读取len长的数据,这也是它与BufferedInputStream的区别,此时方法结束。

    2、BufferedInputStream的read(byte[] b);直接调用了父类InputStream的read(byte[] b,offset,len)方法,不推荐使用,因为其实并没有用到Buffer功能;

    3、BufferedInputStream的read(byte[] b,offset,len);覆写了父类的方法,方法中用到了read1(byte[] b,offset,len)方法,read1方法中,如果缓冲数组中有数据则直接返回数据,如果缓冲队列中无数据则直接调用InputStream的read(byte[] b,offset,len)方法。可以得到一下推论,如果我调用了read(byte[] b,offset,len)方法,则将第一个封包所有内容全部缓冲到Buffer中,如果第一个封包大于Buffer,则先读取buffer大小的长度到buffer中,如果第一个封包小于Buffer,则全部读取到Buffer中。调用read(byte[] b,offset,len)方法时,如果len小于buffer大小则不用等待IO,直接从buffer中读取,免去IO等待。这里推荐用此方法。

    4、BufferedInputStream 的available()方法返回当前不阻塞就能读到的数据。

     

    展开全文
  • Java实现Socket长连接和短连接

    千次下载 热门讨论 2014-09-21 11:32:43
    Java实现Socket长连接和短连接,实现原理可参见个人博客
  • public class SocketClient { private static Log logger = LogFactory.getLog(SocketClient.class); private static Socket... //socket连接 private static boolean connection = false;//socket是否连接 pr...
    public class SocketClient {
    	
    	private static Log logger = LogFactory.getLog(SocketClient.class);
    	private static Socket socket; //socket连接
    	private static boolean connection = false;//socket是否连接
    	private static int connectcount = 0;
    	
    	
    	/**
    	 * 打开socket
    	 * @param data  能耗数据xml
    	 * @return 是否成功 0-成功
    	 * @throws IOException 
    	 * @throws DocumentException 
    	 */
    	public static String csocket(String sendData, int type) throws IOException, DocumentException {
    		open();
    		if(connection==false) {			
    			return null;
    		}
    		
    		// 处理发送的报文 转换成byte[]
     		byte[] message = getTcpMessage(sendData, type);
    	    // 发送报文并获取返回报文
     		Document receiveData = sendAndRecMsg(message);
     		
    		return XmlService.formatXML(receiveData,"utf-8");
    	}
    
    	/**
    	 * 发送数据
    	 * @param message 报文
    	 * @return 服务器回复 style
    	 */
    	public static byte[] sendAndRecMsg(byte[] message){
    		
    		if (message == null) {
    			return null;
    		}
    		
    		Document document = null;
    		try{
    			InputStream in = socket.getInputStream();  //获取输入流,并创建相应的数据输入流
    			OutputStream out = socket.getOutputStream();//获取输出流,并创建相应的数据输出流
    			
    			out.write(message);
    			out.flush();
    			
    			int count = 0;
    			int k = 0;
    			while( count ==0 && k<100 ){
    				count = in.available();
    				k++;
    				Thread.sleep(200);
    			}
    			byte[] receive = new byte[count];
    			int readCount = 0; // 已经成功读取的字节的个数
    			while (readCount < count) {
    				readCount += in.read(receive, readCount, count - readCount);
    			}
    			
    			if(receive.length == 0){
    				return null;
    			}
    		 		
    						
    		
    			 
    		} catch (Exception e) {
    			logger.error(e+"  发送异常,重新认证发送数据!");
    			e.printStackTrace();
    		}
    		return receive;
    	}
    	
    	/**
    	 * 打开socket连接
    	 */
    	public static boolean open(){
    		while(connectcount<60 && !connection){
    			try{
    				socket = new Socket(); //重新连接需要new Socket,否则报错
    				String ipAddr = GetSysConfService.tcp_ip;
    				int port =GetSysConfService.tcp_port;
    				
    				//ipAddr="172.18.3.31";
    				
    				socket.connect(new InetSocketAddress(ipAddr, port),0);
    				connection = true;
    				connectcount = 0;
    				Thread.sleep(1000);//创建连接休眠1s,若不sleep等待,将无法接受到认证信息
    			}catch(Exception ex){
    				connectcount++;
    				logger.error("与服务器建立socket连接第"+connectcount+"次失败",ex);
    				try {
    					if(connectcount<=30) Thread.sleep(10000);
    					else if(connectcount<20) Thread.sleep(30000);
    					else if(connectcount<30) Thread.sleep(60000);
    					socket.close();//建立失败,以防万一,close
    				} catch (InterruptedException e) {
    					logger.error(e);
    					e.printStackTrace();
    				} catch (IOException e) {}
    			}
    		}
    		return connection;
    	}
    		
    	/**
    	 * 关闭socket
    	 */
    	public void close(){
    		if(connection){
    			try {
    				socket.close();
    			} catch (IOException e) {
    				logger.error(e);
    				e.printStackTrace();
    			}
    			connection = false;
    		}
    		
    	  }
    	
    	
    	
    }

     

    展开全文
  • 讨论Socket必讨论长连接和短连接一、长连接和短连接的概念 1、长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接;后者是每次请求,都新建一个Socket,处理完一个...
  • Java实现socket连接

    2020-11-02 12:48:59
    https://blog.csdn.net/weixin_43513644/article/details/83444018 长连接链接区别是 : f
  • (java)Socket短连接双端通信

    千次阅读 2016-08-18 17:00:48
    一、TCP连接简介 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接, 当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接连接的建立是需要三次握手的,而...
  • 讨论Socket必讨论长连接和短连接 一、长连接和短连接的概念  1、长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接;后者是每次请求,都新建一个Socket,处理完...
  • 之前没有接触过socket,现在项目中临时用到socket编程,更奇特的是要求异步短连接单工模式,连接的对方是银行,求各位高手赐我一份完整的源码实例,会有高分酬谢。急用!
  • java   socket   长连接  短连接 ...短连接是客户端每发一个请求就与服务器建立一个连接,交易完成后关闭连接,这种技术实现较长连接 简单。 长:connect连上后不断开, 进行N次收发操作. 短...
  • java Socket 短连接和长连接的区别

    千次阅读 2016-03-23 12:37:15
    长连接与短连接  所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。   短连接是指通信双方有数据交互时...
  • 一、java socket短连接的基本概念 1.socket套接字 TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。 即TCP/IP实现的套接字,是应用层调用下层服务的接口。 备注...
  • 网络编程都是最底层都是基于socket的,鉴于客户端需要一直发送消息,使用短连接就不适合了,因为建立socket连接后发送完数据又马上断开连接。而长连接通过客户端的心跳机制一直保持连接,不管当前是否接收和发送数据...
  • 简单解释就是: 短连接:jian
  • Java socket连接链接

    千次阅读 2014-09-30 15:39:41
     ... ...短连接是客户端每发一个请求就与服务器建立一个连接,交易完成后关闭连接,这种技术实现较长连接简单。 长:connect连上后不断开,进行多次收发操作.  短:每次都connect,完成任务后
  • java socket连接服务端

    万次阅读 2017-08-03 23:06:30
    网络编程都是最底层都是基于socket的,鉴于客户端需要一直发送消息,使用短连接就不适合了,因为建立socket连接后发送完数据又马上断开连接。而长连接通过客户端的心跳机制一直保持连接,不管当前是否接收和发送数据...
  • java--socket长连接与短连接介绍

    千次阅读 2014-05-23 14:21:17
    长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。  短连接是指通信双方有数据交互时,...
  • 采用这种方式可以实现客户端和服务器之间的通信! 百度百科的解释:  Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链...
  • java socket基础-长连接与短连接

    千次阅读 2017-10-08 16:30:00
    1概念 Socketsocket实际上是对TCP/IP进行的封装,我们可以使用socket套接字通过socket来...长短连接:显而易见,长连接也就是这个socket连接一直保持连接,也就是通道一直保持通畅,两个对端可以随时发送和接收数
  • 连接Java Socket实现

    千次阅读 2020-07-29 19:39:43
    Socket默认是不关闭的,除非手动关闭,建立连接的两端可互相发送信息,连接的长短主要针对的是连接的时间,长时间不关闭的连接即长连接,短连接即建立连接的两端在发送一次或几次数据后很快关闭Socket的连接。
  • java socket连接事例

    万次阅读 2014-02-16 19:12:05
    我们知道javasocket是基于TCP的连接,而ServerSocket 的accept()方法是阻塞的,直到有客户端连接到服务器端,我们常用多线程的方式来实现服务器端响应多个客户端,以下是代码:
  • 浅析socket短连接和长连接

    千次阅读 2015-04-02 16:07:31
    http和socket,这两个词在编程中,相信大家不陌生,说到网络编程,下载文件,大家很快就想到了这些名词,使用也很简单。但是http和socket内部机制是怎样的呢,http和socket有什么联系和区别呢。相信大家对这些机制...
  • TCP/IP之socket短连接

    2019-01-28 12:51:00
    简单的socket短连接 文中讲述数据流,字节流,对象分别输入和输出的简单实现。 客户端类,模拟客户端发送数据: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException;...
  • 我有一个类,负责通过SOCKET连接与服务器端通讯。 这个循环读取一个队列来发送。 问题来了,在本类的MAIN方法中向队列中添加数据,就可以发送出去,在SERVLET中,通过HTTP请求添加,就是发送不出去!请大家帮忙...
  • Socket通信是一种非常重要的通信方式,它使用起来简单方便,也很容易学会,下面就我所知道的简单记录一下。 首先是UDP的方式。(通过Android与PC端进行通信) 发送端: package com.zww.socket; import java...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,812
精华内容 11,124
关键字:

java实现socket短连接

java 订阅