JAVA - ”服务端与客户端”原来还可以这么搭建?

     练习1.服务端

package Dom.com;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class WHLFWDsocket {
    public static void main(String[]args) throws Exception {
        // 监听指定的端口
         int port = 55533;
         ServerSocket server = new ServerSocket(port);

         //一:输入和输出概念
        //输入流(inputstream):对于java程序来说,从程序写入文件叫做输出
        //输出流(outputstream):对于java程序来说,从文件读取数据,到java程序叫做输入。
        //二:字节流输出(outputstream)
        //该类是抽象类,public abstract class OutputStream extends Object implements Closeable, Flushable
        //所以如果想调用他的方法,需要通过子类来进行调用,该类的操作是字节,所以叫做字节输出流
        //操作文件可以是任意文件。
        //1: close()关闭字节输出流,释放资源,类似python中操作文件,最后需要close一样。
        //2:write()该方法为重载方法,将相应的内容写入文件中。
        //3:flush()是将缓存的数据刷入永久存储(文件)中。


         System.out.println("server一直等待连接的到来...");
         // server将一直等待连接的到来
         Socket socket = server.accept();
         // 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
         InputStream inputStream = socket.getInputStream();
         byte[] bytes;
         // 因为可以复用Socket且能判断长度,所以可以一个Socket用到底
         while (true){
             // 首先读取两个字节表示的长度
             int first = inputStream.read();
             //如果读取的值为-1 说明到了流的末尾,Socket已经被关闭了,此时将不能再去读取
             if(first==1){
                 break;
             }
             int second = inputStream.read();
             int length = (first<<8) + second;
             // 然后构造一个指定长的byte数组
             bytes = new byte[length];

             // 然后读取指定长度的消息即可
             inputStream.read(bytes);
             System.out.println("get message from client:"+new String(bytes,"UTF-8"));
         }
         inputStream.close();
         socket.close();
         server.close();
    }
}

练习2.客户端

package Dom.com;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class WHLKHDsocket {
    public static void main(String[]args) throws IOException {
        String host = "127.0.0.1";
        int port = 55533;
        // 要连接的服务端IP地址和端口
        // 与服务端建立连接

        Socket socket = new Socket(host,port);
        // 建立连接后获得输出流

        OutputStream outputStream = socket.getOutputStream();
        String message = "你好,yiwangd";
        //首先需要计算得知消息的长度

        byte[] sendBytes = message.getBytes(StandardCharsets.UTF_8);
        //然后将消息的长度优先发送出去

        outputStream.write(sendBytes.length>>8);
        outputStream.write(sendBytes.length);
        //然后将消息再次发送出去

        outputStream.write(sendBytes);
        outputStream.flush();
        //如果中途调用close()方法
        // 输出区也还是有数据的
        // 就像水缸里有水
        // 只是在缓冲区遗留了一部分
        // 这时如果我们先调用flush()方法
        // 就会强制把数据输出,缓存区就清空了
        // 最后再关闭读写流调用close()就完成了

        //==========此处重复发送一次,实际项目中为多个命名,此处只为展示用法

        message = "第二条信息";
        sendBytes = message.getBytes(StandardCharsets.UTF_8);
        outputStream.write(sendBytes.length>>8);
        outputStream.write(sendBytes.length);
        outputStream.write(sendBytes);
        outputStream.flush();
        //==========此处重复发送一次,实际项目中为多个命名,此处只为展示用法

        message = "the third message!";
        sendBytes = message.getBytes(StandardCharsets.UTF_8);
        outputStream.write(sendBytes.length>>8);
        outputStream.write(sendBytes.length);
        outputStream.write(sendBytes);


        outputStream.close();
        socket.close();

    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值