Java_TCP网络通信编程

应用案例1(使用字节流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",然后退出

4.服务器段接收到 客户端发送的信息,输出,并退出

*ServerSocket可以创建多个Socket对象,ServerSocket只要有一次accept就会返回一个Socket对象

服务器端:

java 复制代码
package com.javaWeb.Socket;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class SocketTCP01server {
    public static void main(String[] args) throws IOException {
        //1.在本机的9999端口监听,等待连接
        //要求9999端口没有被占用,没有其他服务在监听此端口
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte buf[] = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1){
            System.out.print(new String(buf,0,readLen)); //根据读取到的实际长度显示内容/字符串
        }

        //5.关闭流和socket
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
package com.javaWeb.Socket;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端,发送消息给服务端
public class SocketTCP01client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道
        outputStream.write("hello,server".getBytes());

        //4.关闭流对象和socket,不然会造成资源浪费
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}

应用案例2(使用字节流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出

4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出

*设置写入结束标记(没有这个标记就无法接收):

java 复制代码
shutdownOutput();

服务器端:

java 复制代码
package com.javaWeb.Socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketTCP02server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取
        byte buf[] = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1) {
            System.out.print(new String(buf, 0, readLen)); //根据读取到的实际长度显示内容/字符串
        }

        //5.获取socket相关联的输出流
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello,client".getBytes());
        //设置结束标记
        socket.shutdownOutput();

        //6.关闭流和socket
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
package com.javaWeb.Socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class SocketTCP02client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道
        outputStream.write("hello,server".getBytes());
        //设置结束标记
        socket.shutdownOutput();

        //4,获取和socket关联的输入流,读取数据(字节)并显示
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while ((readLen = inputStream.read(buf)) != -1){
            System.out.println(new String(buf,0,readLen));
        }

        //5.关闭流对象和socket,不然会造成资源浪费
        inputStream.close();
        outputStream.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}

应用案例3(使用字符流):

1.编写一个服务器端,和一个客户端

2.服务器端在9999端口监听

3.客户端连接到服务器端,发送"hello,server",并接收服务器端回发的"hello,client",再退出

4.服务器端接收到客户端发出的信息,输出,并发送"hello,client"再退出

*如果使用字符流,需要手动刷新,否则数据不会写入通道

java 复制代码
bufferedWriter.flush();

*设置写入结束标记(没有这个标记就无法接收),也可以使用

java 复制代码
writer.newLine();//要求对方使用readLine()方式读取才能读到

*这里需要使用转换流:

服务器端:

java 复制代码
package com.javaWeb.Socket;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//使用字符流读写
public class SocketTCP03server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); //代表在本机的9999端口监听
        System.out.println("服务端在9999端口监听,等待链接.....");   //此时端口已被占用,无法被其他程序使用

        //2.当没有客户端链接9999端口时,程序会阻塞,等待连接
        //如果有客户端链接,则会返回一个socket对象,程序继续执行
        Socket socket = serverSocket.accept();
        System.out.println("服务器端socket=" + socket.getClass());//当没有链接时,程序会阻塞在上面的语句,并不会输出这句话

        //3.通过socket.getInputStream()读取客户端写入到数据通道的数据,并显示
        InputStream inputStream = socket.getInputStream();

        //4.IO读取,使用字符流
        //使用InputStreamReader 将字节流inputStream转成字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        //5.获取socket相关联的输出流,使用字符输出流方式回复
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,client字符流....");
        bufferedWriter.newLine();//插入一个换行符,表示回复内容结束
        bufferedWriter.flush();

        //6.关闭流和socket
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        serverSocket.close();
    }
}

客户端:

java 复制代码
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

//使用字符流读写
public class SocketTCP03client {
    public static void main(String[] args) throws IOException {
        //1.链接服务端(ip,端口)
        //链接InetAddress.getLocalHost()(本机)的9999端口,如果链接成功,会返回一个socket对象
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//InetAddress.getLocalHost()这里可以改为要链接对象的IP地址
        System.out.println("客户端socket返回=" + socket.getClass());

        //2.连接上后,生成Socket,通过socket.getOutputStream()
        //得到和socket对象关联的输出流对象
        OutputStream outputStream = socket.getOutputStream();//会返回一个outputStream

        //3.通过输出流,写入数据到数据通道,使用字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
        bufferedWriter.write("hello,server字符流.....");
        bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束,要求对方使用readLine方式读取
        bufferedWriter.flush();//如果使用字符流,需要手动刷新

        //4,获取和socket关联的输入流,读取数据(字节)并显示
        InputStream inputStream = socket.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        //5.关闭流对象和socket,不然会造成资源浪费
        bufferedReader.close();//关闭外层流
        bufferedWriter.close();
        socket.close();
        System.out.println("客户端退出.....");
    }
}
相关推荐
程序员黑豆4 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年5 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅5 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠6 小时前
AI相关的自我学习
java·人工智能·学习
波波0076 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
数智化管理手记8 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
隔窗听雨眠8 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
cfm_29149 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统10 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
那年窗外下的雪.10 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php