记录socket的使用 | TCP/IP协议下服务器与客户端之间传送数据 | java学习笔记

谨以此篇,记录TCP编程,方便日后查阅笔记

注意:用BufferedWriter write完后,一定要flush;否则字符不会进入流中。去看源码可知:真正将字符写入的不是write(),而是flush()。

服务器端代码:

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

public class theServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9999); // 该行代码作用:让服务器监听9999端口
        Socket socket = serverSocket.accept();

        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//        byte[] bytes = new byte[1024];
//        int readLine = 0;
//        while ((readLine = inputStream.read(bytes)) != -1) {
//            System.out.print(new String(bytes, 0, readLine));
//        }
//        socket.shutdownInput();
        String readStr = reader.readLine();
        System.out.println(readStr);

        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
//        outputStream.write("server: hi client".getBytes());
//        socket.shutdownOutput(); // 结束标记,让对方(客户端)socket可以使用outputStream流
        writer.write("server: hi client");
        writer.newLine(); // 使用字符流的话,可以用"socket.shutdownInput()"作为结束标记,也可以用"writer.newLine()"作为结束标记;使用newLine作为结束标记,对应的,在读的时候需要使用readLine来读数据
        writer.flush(); // 用BufferedWriter write完后,一定要flush

        writer.close(); // 后打开的流,先关闭
        reader.close();
        socket.close();
        serverSocket.close(); // 先打开的流,后关闭
    }
}

客户端代码:

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

public class theClient {
    public static void main(String[] args) throws IOException {
        Socket socket =  new Socket(InetAddress.getLocalHost(),9999); // 该行代码作用:让客户端连接到服务器的9999端口

        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
//        outputStream.write("client: hi server".getBytes());
        writer.write("client: hi server");
//        socket.shutdownOutput(); // // 结束标记,让对方(服务器端)socket可以使用outputStream流
        writer.newLine(); // 使用字符流的话,可以用"writer.newLine()"作为结束标记
        writer.flush(); // 用BufferedWriter write完后,一定要flush

        InputStream inputStream = socket.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
//        byte[] bytes = new byte[1024];
//        int readLine = 0;
//        while ((readLine = inputStream.read(bytes)) != -1) {
//            System.out.print(new String(bytes, 0, readLine));
//        }
//        socket.shutdownInput();
        String readStr = reader.readLine();
        System.out.println(readStr);

        reader.close();
        writer.close();
        socket.close();
    }
}

运行后结果:

服务器端:

客户端:

参考资料:
https://www.bilibili.com/video/BV1fh411y7R8?p=669&vd_source=07ed824bba84f399accbac1be9f9f505

相关推荐
·薯条大王7 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO10 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
小小、码农10 小时前
Linux进程控制:从fork到exec,手写一个简易Shell
linux·运维·服务器
程序员黑豆10 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光11 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林11 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
不会就选b11 小时前
Linux之进程间通信(二)---模拟进程池
linux·运维·服务器
marvelyu12 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
NeilYuen12 小时前
用UDP实现向DNS服务器请求IP地址
服务器·tcp/ip·udp
shengnan_wsn13 小时前
【协议】【TCP】
网络·网络协议·tcp/ip