Socket通信

Socket分为``ServerSocketSocket`两大类

  • ServerSocket用于服务器端,可以通过accept方法监听请求,监听请求后返回Socket,
  • Socket用于完成具体数据传输,客户端可以使用Socket发起请求并传输数据

ServerSocket:

public class Server {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            ServerSocket server = new ServerSocket(8080);
            while (true){
                Socket socket = server.accept();// 建立连接

				// 获取客户端请求
                InputStreamReader in = new InputStreamReader(socket.getInputStream());
                BufferedReader br =  new BufferedReader(in);
                String content;
                

                //while ((content = br.readLine()) != null && content != ""){ //用content != ""或者不判断content是否为空,会导致阻塞
                while ((content = br.readLine()) != null && !"".equals(content)){
                   System.out.println(content);
                }
                
                PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
                
                printWriter.println("HTTP/1.1 200 OK");
                printWriter.println("Content-Type:text/html;charset=utf-8");
                String body = "hello,nio1";
                printWriter.println("Content-Length:" + body.getBytes().length);
                printWriter.println();
                printWriter.println(body);
                // 关闭资源
                printWriter.close();
               
                socket.close();
            }        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Socket

Socket socket = null;
try {
                // 创建客户端socket建立连接,指定服务器地址和端口
                socket = new Socket(Host(), Port()));
                String inputString = json.toString();
                inputString += "\r\n";// 回车换行  Enter
                byte[] input = inputString.getBytes("utf-8");
                log.info("准备进行socket通信 / Prepare to Communicate: \n\tREQUEST DATA:" + new String(input, "utf-8"));
                // 获取输出流,向服务器发送消息
                OutputStream outputStream = socket.getOutputStream();
                
                outputStream.write(input);// 发送请求
                outputStream.flush();
                // 输入流,读取服务端响应
                InputStream inputStream = socket.getInputStream();

                byte[] bytes = new byte[1024];
                int lenth;
                StringBuilder stringBuilder = new StringBuilder();
                while ((lenth = inputStream.read(bytes)) != -1) {
                    stringBuilder.append(new String(bytes, 0, lenth, "utf-8"));
                }
                log.info("返回报文:{}", stringBuilder);
                resultJSON = JSONUtil.parseObj(stringBuilder);
                // 缓存至redis
                redisService.set(userPhoneKey, resultJSON.toString(), 4 * 60 * 60, TimeUnit.SECONDS);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }

输出:(发送)BufferedWriter

    // 获取输出流,向服务器发送消息
                OutputStream outputStream = socket.getOutputStream();
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
                bufferedWriter.write(input);
                bufferedWriter.newLine();
                bufferedWriter.close();

Writer子类在这里插入图片描述
java的I/O操作之BufferWriter

输入:(读取)BufferedReader

BufferedReader的详细用法及注意事项

InputStream inputStream = socket.getInputStream();
  // 从字符输入流中读取文本,缓冲各个字符
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))

  • 使用BufferedReader类时,必须先创建一个Reader类的实例,然后再将其传递给BufferedReader的构造函数。

socket.shutdownOutput()

socket.shutdownOutput()详解

getBytes()方法

用于将字符串转换为字节数组

        String str="中国 china";
        // 一个字符串转化为一个字节数组byte
        byte[] bytes1 = str.getBytes();
        System.out.println("默认字符编码"+bytes1.length);
        printBytes(bytes1);

      byte[] bytes2 = str.getBytes("UTF-8");
        System.out.println("utf-8:"+bytes2.length);
        printBytes(bytes2);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值