Java - 网络编程----TCP

这篇博客详细介绍了如何使用Java的ServerSocket和Socket类建立服务器和客户端之间的连接。服务器端创建ServerSocket并监听8888端口,接收客户端连接后为每个连接开启新线程进行通信。客户端通过Socket连接服务器,发送并接收数据,以空字符串作为数据结束标识。整个过程展示了TCP协议的面向连接、可靠传输特性。
摘要由CSDN通过智能技术生成

ServerSocket服务器端

  • ServerSocket ss = new ServerSocket()
    创建服务器 Socket端口
  • socket.bind(new InetSocketAddress(“localhost”, 8888), 50)
    设置 服务器 IP 和端口, 配置监听 客户端数量
  • Socket socket = ss.accpet()
    阻塞式等待客户端的连接
  • 给每一个客户端开启一个线程
  • socket.getInputStream()
    获取输入流、接收客户端数据
    • 1.将输入流转成 BufferedReader
      来接收客户端发送的数据
    • 2.将输入流转成 DataInputStream
      接收客户端发送的数据
  • socket.getOutputStream()
    获取输出流、发送数据
    • 1、将输出流转成 BufferedWriter
      调用 flush 将缓存数据 发送给客户端
    • 2、发送的数据 必须 以 \n 结尾
      告诉客户端数据发送已完成
      PS: 读取浏览器发送的数据,数据以 空字符串判断,必须通过判断isEmpty()来判断是否读取完成
public class Server {
    public static void main(String[] args) throws Exception {

        //创建一个 套接字 socket 对象
        ServerSocket ss = new ServerSocket();

        // 设置服务器 IP 和端口 ,配置监听客户端数量
        ss.bind(new InetSocketAddress("localhost",8888));

        //开启一个死循环,不断接受客户端的链接
        while (true){
            // 被动等待客户端的连接
            // 返回一个socket 用来连接客户端和服务器
            Socket socket = ss.accept();

            // 多线程版服务器 new Thread(() -> {})
            // 开启一个线程 ,给每个客户端开启一个线程
            new Thread(() ->{

                try (
                        // 接受客户端发送 的数据 , 获取输入流
                        InputStream in = socket.getInputStream();
                        // 服务器向客户端发送数据的通道
                        OutputStream out = socket.getOutputStream();

                        // 读取客户端发送的数据
                        BufferedReader bis = new BufferedReader(new InputStreamReader(in));
                        BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(out));

                ){

                    // 读取数据
                    StringBuilder sb = new StringBuilder();
                    // 约定客户端发送一个空字符串作为结束,空字符串单独一行
                    String line = "";
                    // 读取一行数据
                    while (!"".equals(line = bis.readLine())) {
                        sb.append(line);
                    }
                    System.out.println(sb);

                    // 向客户端发送消息
                    bos.write("你好,服务器!!!!");
                    bos.newLine();
                    bos.flush();
                    bos.write("test");
                    bos.newLine();
                    bos.flush();
                    bos.write("abc");
                    bos.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    //关闭流
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });


        }
    }
}

Socket客户端

  • Socket socket = new Socket()
    创建网络套接字
  • socket.connect(new InetSocketAddress(“localhost”, 8888))
    连接服务器
  • 获取输入流、输出流
    用法参考 服务端
  • socket.close()
    关闭 套接字
public class Cliant {
    public static void main(String[] args) throws Exception{

        // 构建一个 套接字对象
        Socket socket = new Socket();

        // 连接服务器
        socket.connect(new InetSocketAddress("localhost",8888));


        try (
                //
                InputStream in = socket.getInputStream();
                BufferedReader bis = new BufferedReader(new InputStreamReader(in));

                OutputStream out = socket.getOutputStream();
                BufferedWriter bos = new BufferedWriter(new OutputStreamWriter(out));
            ){
                // 发送消息
                bos.write("你好,服务器!!!!");
                bos.newLine();
                bos.flush();
                bos.write("test");
                bos.newLine();
                bos.flush();
                bos.write("");
                bos.newLine();
                bos.flush();

                // 读取数据
                StringBuilder sb = new StringBuilder();
                String line = "";
                while ((line = bis.readLine()) != null){
                    sb.append(line);
                }
                System.out.println(sb);

        }finally {
            socket.close();
        }

    }
}

特点:

一种面向连接,可靠传输的协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值