【JAVA 转换流,TCP,服务端与客户端发送消息】

本文档展示了Java中InputStreamReader如何作为字节到字符的转换桥梁,详细解释了其在文件读写及网络编程中的应用。通过实例代码,演示了字符流在TCP客户端和服务端的使用,以及网络编程的基础知识,包括字节流和字符流的交互。
摘要由CSDN通过智能技术生成

InputStreamReader是字节转型为字符的桥梁

InputStreamReader可以设置转换后的编码格式

package InputStreamReader01;

import java.io.*;

public class InputStreamReader01 {
    public static void main(String[] args) throws IOException {
        //InputStreamReader是字节转型为字符的桥梁,你可以指定它的编码格式
        String path="E:\\test.txt";
        InputStreamReaderC(path);
        //OutputStreamWriteC(path);
    }
    public static void InputStreamReaderC(String path) throws IOException {
        //文本是ANSI的编码,在程序中对应的就是gbk,因此转为jbk就能正常显示了
        BufferedReader bR = new BufferedReader(new InputStreamReader(new FileInputStream(path), "utf-16"));
        System.out.println(bR.readLine());
        bR.close();
        System.out.println("完成");
    }
    public static void OutputStreamWriteC(String path) throws IOException {
        String ct="UTF-16";
        BufferedWriter bow = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path), ct));
        //原本只能是字节,现在可以输入字符,并且可以指定字符格式
        bow.write("nihao,你好世界!!!   "+ct+"格式");
        bow.close();

    }
}

字节流客户端

package InetAddRess.TCP;

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

public class SockedTcpClient {
    public static void main(String[] args) throws IOException {
        //客户端先建立socket 并向端口9999 发送请求,连接成功后会生成socket对象
        System.out.println("正在连接。。。");
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        System.out.println("连接成功!");
        //可以通过输出流 写数据发送到服务端,在服务端显示。
        OutputStream outputStream = socket.getOutputStream();
        System.out.println("正在发送数据!");
        outputStream.write("你好啊,服务端!".getBytes());
        //发送完之后,写一下结束标记,给服务端一个回应说我发送完成了
        socket.shutdownOutput();
        //开启新的通道,读服务端发来的东西
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int read = 0;
        while ((read = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, read));
        }

        System.out.println("数据处理完毕,连接断开。");
        inputStream.close();
        socket.close();
        outputStream.close();
    }
}

字节流服务端

package InetAddRess.TCP;

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

public class SockedTcpServer {
    public static void main(String[] args) throws IOException {
        //首先在本机的 9999端口先监听serverSocket,等待连接
        ServerSocket serverSocket = new ServerSocket(9999);
        //当没有客户端连接9999端口时,程序会 阻塞 等待连接
        System.out.println("服务器正在等待连接。。。");

        //如果有客户端连接则会返回一个socket对象
        Socket socket = serverSocket.accept();
        //接受客户端发送的请求字节,并在终端显示
        InputStream inputStream = socket.getInputStream();
        byte[] bytes = new byte[1024];
        int read = 0;
        while ((read = inputStream.read(bytes)) != -1) {
            System.out.println(new String(bytes, 0, read));
        }
        //服务端接收到之后,设置一下结束标记,表明我读取完成了
        socket.shutdownInput();
        //就可以开启下一个新的通道,用来发送数据给客户端了
        OutputStream outputStream = socket.getOutputStream();
        System.out.println("正在发送数据!");
        outputStream.write("你好啊,客户端!".getBytes());
        //处理完成,断开连接,关闭所有流
        System.out.println("数据处理完毕,断开连接!");
        outputStream.close();
        inputStream.close();
        socket.close();
        serverSocket.close();
    }
}

字符流客户端

package InetAddRess.TCP;

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


public class SocekdTcpClientZiFu {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
        OutputStream outputStream = socket.getOutputStream();
        //OutputStreamWriter仅仅是转换流 并没有实质的其他作用
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("你好服务端,我是客户端!!!");
        bufferedWriter.flush();//使用字符流注意了:一定要有这一句不然内容发送不过去,而且报错
        socket.shutdownOutput();
        //接下来接受服务端发送的数据
        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s;
        while ((s = bufferedReader.readLine()) != null) {
            System.out.print(s);
        }
        System.out.println("服务退出!");
        socket.close();
        bufferedWriter.close();
        outputStream.close();
        outputStreamWriter.close();
    }
}

字符流服务端

package InetAddRess.TCP;

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

public class SocketTcpServerZiFu {
    public static void main(String[] args) throws IOException {
        //首先在本机的 9999端口先监听serverSocket,等待连接
        ServerSocket serverSocket = new ServerSocket(9999);
        //当没有客户端连接9999端口时,程序会 阻塞 等待连接
        System.out.println("服务器正在等待连接。。。");

        //如果有客户端连接则会返回一个socket对象
        Socket socket = serverSocket.accept();
        //接着是接受客户端发来的数据,注意是字符流
        InputStream inputStream = socket.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String s;
        while ((s = bufferedReader.readLine()) != null) {
            System.out.print(s);
        }
        socket.shutdownInput();
        //向客户端发送数据
        OutputStream outputStream = socket.getOutputStream();
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
        BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
        bufferedWriter.write("你好客户端,我是服务端!!!");
        bufferedWriter.flush();//使用字符流注意了:一定要有这一句不然内容发送不过去

        System.out.println("服务端退出!");
        socket.close();
        serverSocket.close();
        bufferedReader.close();
        inputStream.close();
        inputStreamReader.close();
    }
}

网络编程基础知识

package InetAddRess;

import org.junit.Test;
import java.net.InetAddress;
import java.net.UnknownHostException;
//网络编程基础知识
public class Api01 {
    public static void main(String[] args) throws UnknownHostException {

        //获取本机InetAddress对象 getLocalHost
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println("自动获取当前计算机名称以及IP:" + localHost);
        //根据指定主机名/域名获取ip地址对象 getByName
        InetAddress host2 = InetAddress.getByName("TMJIE5200");
        System.out.println("通过指定主机或者域名来获取ip地址对象:" + host2);
        InetAddress host3 = InetAddress.getByName("www.baidu.com");
        System.out.println("指定域名获取ip地址对象:" + host3);
        //获取InetAddress对象的主机名getHostName
        String host3Name = host3.getHostName();
        System.out.println("获取到的主机名为:" + host3Name);
        //获取InetAddress对象的地址 getHostAddress
        String host3Address = host3.getHostAddress();
        System.out.println("该主机对应的ip地址为:" + host3Address);
        fun();
    }

    @Test
    public static void fun() throws UnknownHostException {
        InetAddress localHost = InetAddress.getLocalHost();
        System.out.println(localHost);
        System.out.println(localHost.getHostName());
        System.out.println(localHost.getHostAddress());
        InetAddress byName = InetAddress.getByName("www.baidu.com");
        System.out.println(byName.getHostAddress());
    }
}

在这里插入图片描述

上面的这张图很重要,可以看出转换流,只是具有转换的作用,并没有其他作用,不能直接调用write或者read方法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Keyle777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值