Java web学习记录(一)Java网络编程

复习完JavaSE以后,终于开始了Java Web的学习生涯。

计算机网络编程基础

利用通信线路和设备可以将两台不同的电脑连接在一起,以完善的网络软件来实现资源共享和信息传递,这就构成了计算机网络。
既然说是两台不同的电脑,那么肯定可以可以通过某一些标记来进行区分,这个区分的标志就是IP地址。通过不同的IP地址可以区分不同的电脑。
电脑上面有很多不同的软件,每一个软件都有可能进行信息的传递,那么这些软件又怎么去区分呢?可以通过端口号来区分。
在这里插入图片描述
因此我们看到的一般是192.168.0.11:8080,就是IP:端口的形式来访问一个应用程序。
IP地址分为IPv4和IPv6,IPv4类似于192.168.0.11,四组数字,每一个占8个字节,也就是00000000.00000000.00000000.00000000。但IPv4现在其实已经被用完了,因此就需要更多的表述方式,于是有了IPv6。
Ps : 在终端输入:ipconfig.exe可以查看自己的IPv4 和IPv6地址。

两种不同的传输层协议:TCP和UDP

  • TCP:两计算机之间通信流畅且可靠,能保证数据的不遗失,保证正确收发数据。TCP更适合一些可靠的数据传输场景
  • UDP:无连接协议,数据想发就发,不会建立可靠传输,可能会造成部分数据的遗失,但它更加高效,适合视频直播之类。
    在这里插入图片描述

Socket的使用

通过Socket可以实现两台电脑的通信,它支持TCP和UDP。要实现Socket通信需要通常需要写创建一个信息发送者和一个数据接收者,也就是客户端和服务端,需要先启动服务端,来等待客户端的链接。

//服务端
public static void main(String[] args) {
    try (ServerSocket server = new ServerSocket(8080)){    //将服务端创建在端口8080上
        System.out.println("正在等待客户端连接...");
        Socket socket = server.accept();  //当没有客户端连接时,线程会阻塞,直到有客户端连接为止
        System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
    }catch (IOException e){
        e.printStackTrace();
    }
}
//客户端
public static void main(String[] args) {
    try (Socket socket = new Socket("localhost", 8080)){
        System.out.println("已连接到服务端!");
    }catch (IOException e){
        System.out.println("服务端连接失败!");
        e.printStackTrace();
    }
}

使用Socket来进行数据传输

// 客户端
public class Client {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try (Socket socket = new Socket("localhost", 8080)) {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream());
            System.out.println("请输入你想输入的信息:");
            outputStreamWriter.write(sc.nextLine() + "\n");
            outputStreamWriter.flush();
            System.out.println("数据已发送!等待服务端确认...");

            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println("收到服务端响应:" + reader.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// 信息端
public class Server {
    public static void main(String[] args) {
        try (ServerSocket server = new ServerSocket(8080)) {
            System.out.println("正在等待客户端连接...");
            Socket socket = server.accept();
            System.out.println("客户端已连接,IP地址为:" + socket.getInetAddress().getHostAddress());
            BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            System.out.println(buffer.readLine());

            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write("收到\n");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

手动关闭单向的流

socket.shutdownOutput();  //关闭输出方向的流
socket.shutdownInput();  //关闭输入方向的流

如果我们不希望服务端等待太长的时间,我们可以通过调用setSoTimeout()方法来设定IO超时时间:

socket.setSoTimeout(3000);

使用浏览器访问Socket服务器

首先进入到谷歌浏览器,输入http://localhost:8080(端口号),然后运行代码

public static void main(String[] args) {
        try(ServerSocket server = new ServerSocket(8080)){    //将服务端创建在端口8080上
            System.out.println("正在等待客户端连接...");
            Socket socket = server.accept();
            System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
            InputStream in = socket.getInputStream();  //通过
            System.out.println("接收到客户端数据:");
            while (true){
                int i = in.read();
                if(i == -1) break;
                System.out.print((char) i);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }

因为代码并没有内容所以是没有响应的,浏览器会一直加载,所以我们需要给他一个响应码:HTTP/1.1 200 Accepted,下面是相应内容:

public static void main(String[] args) {
        try (ServerSocket server = new ServerSocket(8080)) {
            Socket socket = server.accept();
            OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write("HTTP/1.1 200 Accepted\r\n\r\n");
            writer.write("访问成功");
            writer.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值