Java网络编程

简介: Java网络编程

Java网络编程


Socket技术

通过Socket技术(它是计算机之间进行通信一种约定或一种方式),我们就可以实现两台计算机之间的通信

Socket也被翻译为套接字,是操作系统底层提供的一项通信技术,它支持TCP和UDP

而Java就对socket底层支持进行了一套完整的封装,我们可以通过Java来实现Socket通信

//服务端
public static void main(String[] args) {
    try(ServerSocket server = new ServerSocket(8080)){    //将服务端创建在端口8080上
        System.out.println("正在等待客户端连接...");
        while (true){   //无限循环等待客户端连接
            Socket socket = server.accept();
            System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
        }
    }catch (IOException e){
        e.printStackTrace();
    }
}


//客户端
public static void main(String[] args) {
    try (Socket socket = new Socket("localhost", 8080)){
        System.out.println("已连接到服务端!");
    }catch (IOException e){
        System.out.println("服务端连接失败!");
        e.printStackTrace();
    }
}

一旦TCP连接建立,服务端和客户端之间就可以相互发送数据,直到客户端主动关闭连接。


Socket进行数据传输

短链接一收一发:

public static void main(String[] args) {
    try (Socket socket = new Socket("localhost", 8080);
         Scanner scanner = new Scanner(System.in)){
        System.out.println("已连接到服务端!");
        OutputStream stream = socket.getOutputStream();
        OutputStreamWriter writer = new OutputStreamWriter(stream);  //通过转换流来帮助我们快速写入内容
        System.out.println("请输入要发送给服务端的内容:");
        String text = scanner.nextLine();
        writer.write(text+'\n');   //因为对方是readLine()这里加个换行符
        writer.flush();
        System.out.println("数据已发送:"+text);
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println("收到服务器返回:"+reader.readLine());
        socket.close(); //关闭链接
    }catch (IOException e){
        System.out.println("服务端连接失败!");
        e.printStackTrace();
    }finally {
        System.out.println("客户端断开连接!");
    }
}


public static void main(String[] args) {
    try(ServerSocket server = new ServerSocket(8080)){    //将服务端创建在端口8080上
        System.out.println("正在等待客户端连接...");
        Socket socket = server.accept();
        System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));  //通过
        System.out.print("接收到客户端数据:");
        System.out.println(reader.readLine());
        OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
        writer.write("已收到!");
        writer.flush();
        socket.close(); //关闭链接
    }catch (IOException e){
        e.printStackTrace();
    }
}

Socket相关使用

手动关闭单向的流:

socket.shutdownOutput();  //关闭输出方向的流
socket.shutdownInput();  //关闭输入方向的流


设定IO超时时间:

socket.setSoTimeout(3000);


当超过设定时间都依然没有收到客户端或是服务端的数据时,会抛出异常

链接构造分离方式:

try (Socket socket = new Socket(); //调用无参构造不会自动连接
     Scanner scanner = new Scanner(System.in)){ 
    socket.connect(new InetSocketAddress("localhost", 8080), 1000);  //手动调用connect方法进行连接


心跳链接检测:

socket.setKeepAlive(true);


如果设置了keeplive为 true,当对方没有发送任何数据过来,超过一个时间(看系统内核参数配置),那么我们这边会发送一个ack探测包发到对方,探测双方的TCP/IP连接是否有效。

TCP在传输过程中,实际上会有一个缓冲区用于数据的发送和接收,手动调整其大小来优化传输效率:

socket.setReceiveBufferSize(25565);   //TCP接收缓冲区
socket.setSendBufferSize(25565);    //TCP发送缓冲区


相关文章
|
2月前
|
Java 数据格式
最新Java基础系列课程--Day15-网络编程(三)
最新Java基础系列课程--Day15-网络编程
|
8天前
|
消息中间件 网络协议 Java
使用Java进行网络编程
使用Java进行网络编程
|
12天前
|
Java
[Java]Socket套接字(网络编程入门)
[Java]Socket套接字(网络编程入门)
26 0
|
24天前
|
网络协议 Java
Java网络通讯精讲
Java网络通讯精讲
20 0
|
1月前
|
网络协议 Java 数据处理
Java基础深化和提高 ---- 网络编程
Java基础深化和提高 ---- 网络编程
100 0
|
1月前
|
人工智能 运维 网络协议
Java网络编程
Java网络编程
33 0
|
1月前
|
存储 安全 Java
【网络安全】网络防护之旅 - Java安全机制探秘与数字证书引爆网络防线
【网络安全】网络防护之旅 - Java安全机制探秘与数字证书引爆网络防线
33 1
|
2月前
|
存储 网络协议 安全
从零开始学习 Java:简单易懂的入门指南之网络编程(三十七)
从零开始学习 Java:简单易懂的入门指南之网络编程(三十七)
|
小程序 Java 程序员
Java Socket:飞鸽传书的网络套接字(2)
Java Socket:飞鸽传书的网络套接字
103 0
Java Socket:飞鸽传书的网络套接字(2)
|
安全 Java 数据安全/隐私保护
Java Socket:飞鸽传书的网络套接字(1)
Java Socket:飞鸽传书的网络套接字
144 0
Java Socket:飞鸽传书的网络套接字(1)

相关产品

  • 云迁移中心