简单解释就是:
短连接:建立连接,发送数据包,关闭连接
长连接:建立连接,发送数据包,发送心跳包,发送数据包,发送心跳包,发送心跳包。。。。。。
所以又频繁的数据收发的话,短连接会频繁创建TCP连接,而对于长连接,则始终用的是同一个TCP连接
- package com.tree.demo.socket;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class ServerSocketDemo {
- private static final int PORT = 1234;
- private static final int BUFFER_SIZE = 1024;
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- ServerSocket ss = new ServerSocket(PORT);
- Socket s = ss.accept();
- System.out.println("这是服务端,监听本机"+PORT+"端口");
- byte[] recData = null;
- InputStream in = s.getInputStream();
- OutputStream out = s.getOutputStream();
- while(true) {
- recData = new byte[BUFFER_SIZE];
- int r = in.read(recData);
- //int r = in.read(recData);
- if(r>-1) {
- String data = new String(recData);
- if(data.trim().equals("over")) {
- s.close();
- }
- System.out.println("读取到客户端发送的来数据:"+data);
- out.write("这是服务端发给客户端的数据:".getBytes());
- out.write(recData);
- }else {
- System.out.println("数据读取完毕!");
- s.close();
- System.exit(0);
- //ss.close();
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
以上这种服务端读数据是阻塞式,如果客户端没有数据写过来,服务端就会一直阻塞在那不动
客户端开启一个telnet即可测试服务端的socket程序了,当然你也可以自己写一个socket客户端,如下:
- package socket;
- import java.io.IOException;
- import java.io.OutputStream;
- import java.net.Socket;
- import java.net.UnknownHostException;
- public class ClientSocketDemo {
- private static final String HOST = "192.168.8.14";
- private static final int PORT = 1234;
- public static void main(String[] args) throws UnknownHostException,
- IOException {
- Socket client = new Socket(HOST, PORT);
- OutputStream out = client.getOutputStream();
- try {
- while (true) {
- Thread.sleep(1000);
- System.out.println("发送心跳数据包");
- out.write("send heart beat data package !".getBytes());
- }
- } catch (Exception e) {
- e.printStackTrace();
- out.close();
- client.close();
- }
- }
- }
accept()等待连接,该方法阻塞当前线程直到建立连接为止
以上服务端的网络程序只能和一个客户端程序连接,拒绝多个客户端的连接。
我们可以通过线程来解决这个问题:每当程序建立一个新的套接字连接,也就是调用accept方法时,将启动一个新的线程来处理服务器和客户端的连接,而主程序将立即返回并等待下一个连接。
具体内容请见:http://blog.csdn.net/simonchi/article/details/40785441