Java Socket套接字

1. Socket

Socket主要用来收发服务器数据。

  • 主要方法

    socket.getInputStream()     // 接收服务器输入
    socket.getOutputStream()    // 发送服务器输出
    socket.getInetAddress()     // 服务器地址
    socket.getPort()            // 服务器端口号
    socket.getLocalAddress()    // 本地地址
    socket.getLocalPort()       // 本地端口号
    socket.shutdownInput()      // 半关闭输入
    socket.shutdownOutput()     // 半关闭输出
    
  • Socket 的选项

    • TCP_NODELAY,是否使用Nagle算法。对应方法setTcpNoDelay(boolean) 设置为true表示立即发送数据包。
    • SO_TIMEOUT,指定系统等待的时间。对应方法setSoTimeout(int) 设置0为一直等待,为默认值。
    • SO_LINGER,指定Socket关闭后如何处理尚未发送的数据包。对应方法setSoLinger(boolean, int)设置为true时,close()方法会被阻塞指定的秒数,等待发送数据和接受确认。
    • SO_SNDBUF,设置发送缓存区大小。对应方法setSendBufferSize(int)
    • SO_RCVBUF,设置接收缓存区大小。对应方法setReceiveBufferSize(int)
    • SO_KEEPALIVE,设置是否与服务器保持连接。对应方法setKeepAlive(boolean)
    • SO_OOBINLINE,发送单字节紧急数据。socket.setOOBInline(boolean)socket.sendUrgentData(int)
    • SO_REUSEADDR,是否允许重用Socket所绑定的本地地址。对应方法setReuseAddress(boolean)
    • IP_TOS,设置不同性能要求。对应方法setTrafficClass(int)

2. Socket进行TCP通信

  • 服务端

    int TCP_SERVER_PORT = 1234;
    
    // 创建一个ServerSocket对象
    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(TCP_SERVER_PORT);
        // 监听连接请求
        Socket socket = serverSocket.accept();
        // 获取输入流
        BufferedReader in = new BufferedReader(new 	
                InputStreamReader(socket.getInputStream()));
        // 获取输出流
        BufferedWriter out = new BufferedWriter(new	
                OutputStreamWriter(socket.getOutputStream()));
        // 读取接收信息,转换为字符串
        String incomingMsg = in.readLine();
        System.out.println(incomingMsg);
    
        String outgoingMsg = "receive data from port " + TCP_SERVER_PORT
                + System.getProperty("line.separator");
        out.write(outgoingMsg);
        out.flush();
    
        socket.close();
    } catch (Exception e) {	
        e.printStackTrace();
    } finally {
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
            }
        }
    }
    
  • 客户端

    String serverIp = "127.0.0.1";
    int TCP_SERVER_PORT = 1234;
    
    try {
        Socket socket = new Socket(serverIp, TCP_SERVER_PORT);
        // 获取输入流
        BufferedReader in = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        // 生成输出流
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream()));
    
        String outMsg = "Socket TCP connecting to " + TCP_SERVER_PORT
                + System.getProperty("line.separator");
        out.write(outMsg);
        out.flush();
    
        String inMsg = in.readLine();
        System.out.println(inMsg);
    
        // 关闭连接
        socket.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    

3. Socket进行UDP通信

  • 服务端

    int UDP_SERVER_PORT = 1234;
    int MAX_LEN = 1024;
    
    byte[] buffer = new byte[MAX_LEN];
    DatagramPacket dp = new DatagramPacket(buffer, MAX_LEN);
    
    // 新建一个DatagramSocket类
    DatagramSocket ds = null;
    try {
        // UDP服务器监听的端口
        ds = new DatagramSocket(UDP_SERVER_PORT);
        // 准备接收数据
        ds.receive(dp);
        System.out.println(new String(dp.getData(), 0, dp.getLength()));
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (ds != null) {
            ds.close();
        }
    }
    
  • 客户端

    String serverIp = "127.0.0.1";
    int UDP_SERVER_PORT = 1234;
    byte[] buffer = ("data from UDP client " + UDP_SERVER_PORT).getBytes();
    
    // 新建一个DatagramSocket对象
    DatagramSocket ds = null;
    try {
        ds = new DatagramSocket();
        // 初始化InetAddress对象
        InetAddress serverAddr = InetAddress.getByName(serverIp);
    
        // 初始化DatagramPacket对象
        DatagramPacket dp = new DatagramPacket(buffer, buffer.length,
                serverAddr, UDP_SERVER_PORT);
        ds.send(dp);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (ds != null) {
            ds.close();
        }
    }
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值