JAVA socket通信

本文详细解释了长连接与短连接的概念、操作过程,并探讨了它们在不同场景下的应用,如数据库连接、HTTP通信等,强调了长连接在操作频繁、点对点通讯场景的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

长连接与短连接
长连接: 指在一个TCP连接上可以连续发送多个数据包,
        在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接;
        一般需要自己做在线维持。 
短连接: 指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;
        一般银行都使用短连接。 
        它的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段 

比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。 
其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

长连接与短连接的操作过程 
通常的短连接操作步骤是: 
  连接→数据传输→关闭连接;

而长连接通常就是: 
  连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接; 

这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,
短连接在没有数据传输时直接关闭就行了

什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。
每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,
所以每个操作完后都不断开,下次次处理时直接发送数据包就OK了,不用建立TCP连接。

例如:数据库的连接用长连接, 
如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

这是我学SOCKET时敲得例子,非常简单,TCP协议:
客户端代码:
import java.net.*;
import java.io.*;
public class SocketClient{
public static void main(String args[]){
try{
//客户端连接服务器
      Socket socket1 = new Socket("127.0.0.1",1989);
      InputStream is = socket1.getInputStream();
      DataInputStream dis = new DataInputStream(is);
//客户端接受服务器端的信息
      System.out.println(dis.readUTF());
      dis.close();
      socket1.close();
    }
    catch(IOException e){
     System.out.println("IO异常");
     }
}
}
服务器代码:
import java.net.*;
import java.io.*;
public class SocketServer{
  public static void main(String args[]){
  try{
  ServerSocket ss = new ServerSocket(1989);
  Socket socket1 = ss.accept();
  OutputStream os = socket1.getOutputStream();
   DataOutputStream  dos = new DataOutputStream(os);
//服务器端发给客户端的信息
   dos.writeUTF("anyway,i need u!"+socket1.getInetAddress()+"port:"+socket1.getPort());
   dos.close();
   socket1.close();
    }
    catch(IOException e){
      System.out.println("IO错误!");
     }
  }
}

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

public class Client {
    public static void main(String[] args) {
        String s=null;
        Socket mysocket;
        DataInputStream in=null;
        DataOutputStream out=null;
        try {
            mysocket=new Socket("127.0.0.1",4331);
            in=new DataInputStream(mysocket.getInputStream());
            out=new DataOutputStream(mysocket.getOutputStream());
            for(int k=1;k<100;k=k+2){
                out.writeUTF(""+k);
                s=in.readUTF();
                System.out.println("客户收到"+s);
                Thread.sleep(500);
            }
        catch (Exception e) {
            System.out.println("服务器已断开"+e);
        }
    }
}
 
public class Server {
    public static void main(String[] args) {
        ServerSocket server=null;
        Socket you=null;
        String s=null;
        DataOutputStream out=null;
        DataInputStream in=null;
        try {
            server=new ServerSocket(4331);
        catch (Exception e) {
            System.out.println(e);
        }
        try {
            System.out.println("等待客户呼叫");
            you=server.accept();
            out=new DataOutputStream(you.getOutputStream());
            in=new DataInputStream(you.getInputStream());
            while(true){
                s=in.readUTF();
                int m=Integer.parseInt(s);
                out.writeUTF("你好,我是服务器");
                out.writeUTF("你说的数乘2后是:"+2*m);
                System.out.println("服务器收到:"+s);
                Thread.sleep(500);
            }
        catch (Exception e) {
            System.out.println("客户端已断开"+e);
        }
    }
}
 
很简单的服务器客户端程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值