网络编程简单介绍

一、网络协议和网络三要素

1.1通讯协议有很多目前最广泛的为tcp/ip协议。

TCP协议:是面向连接的通讯协议,需要经历三次握手确认连接后才传输数据,这样保证了数据的可靠安全性。

特点:

  1. 需要建立链接;

  2. 当链接后,传输数据不限制数据的大小;

  3. 安全可靠

  4. 传输效率低,每次要传输前都要三次握手链接成功后才能传输

UDP协议:是无连接的通讯协议,不需要建立连接直接发送数据,每个数据报的大小被限制在64K,不安全、不可靠但是效率高

特点:

  1. 不需要建立连接

  2. 每次数据传输大小有有限制(64K以内)

  3. 不安全,不可靠

  4. 传输效率快

1.2.网络三要素:协议、 IP地址和端口

目前大部分都是IPV4的IP地址,还有IPV6的新IP地址。

ipconfig 命令 查看本地电脑的IP

二、TCP通讯

2.1Socket类和ServerSocket类

Socket类是创建一个流套接字并将其连接到指定主机上的指定端口号

Socket socket=new Socket(ip,端口);

ip为服务端的地址,端口为服务端的端口

Socket常用的方法:

InputStream getInputStream();获得字节输入流对象,用来获取服务端发送的数据
OutputStream getOutputStream(); 获得字节输出流对象,用来给服务端发送数据
void shutdownOutput():禁用此套接字的输出流,任何先前写出的数据将被发送,随后终止输出流。 
void close():关闭此套接字。 释放Socket网络资源

注:在客户端发送完消息后,一定要执行shutdownOutput()方法,否则服务端会处于一直reading中阻塞。

2.2编写简易的客户端和服务端

客户端代码:

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

public class ClientMode {
    public static void main(String[] args) throws IOException {
        //1.创建客户端对象,指定服务端IP和端口
        Socket socket = new Socket("127.0.0.1", 6666);
        //2.获取网络输出流,发送数据
        OutputStream outputStream = socket.getOutputStream();

        //3.发送数据,字节流转换为字符流
        outputStream.write("你好!我是狗子,晚上一起学java...".getBytes());
        //4.发送完毕内容后,要告知对方(要不对方在一直等待中...)
        socket.shutdownOutput();
        //5.获取网络输入流,接收对方返回信息
        InputStream inputStream = socket.getInputStream();

        byte[] bt = new byte[1024];
        int flag;

        while ((flag = inputStream.read(bt)) != -1) {
            //打印对方回复的消息
            System.out.println(new String(bt, 0, flag));

        }
        //6.释放资源
        socket.close();
    }
}

直接启动客户端报错,原因是服务端没有启动

服务端:

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

public class ServiceMode {
    public static void main(String[] args) throws IOException {
        //1.定义服务端信息
        ServerSocket serverSocket = new ServerSocket(6666);
        System.out.println("服务端已启动..."+serverSocket);
        //2.等待客户端连接,accept一直阻塞到这里等待被访问
        Socket socket = serverSocket.accept();
        //3.获取网络输入流,获取客户端发来的信息
        InputStream inputStream = socket.getInputStream();
        byte[] bt = new byte[1024];
        int flag;
        while ((flag=inputStream.read(bt))!=-1){
            //打印客户端发来的信息
            System.out.println(new String(bt,0,flag));
        }
        //4.获取网络输出流,回信息给我客户端
        OutputStream outputStream = socket.getOutputStream();

        outputStream.write("你好,狗子,我今天晚上要去吃烧烤,不去学java了...".getBytes());
        //5.告知客户端发送完毕了
        socket.shutdownOutput();
        //释放资源,但是不能释放serverSocket,以为服务端要一直启动保持服务。
        socket.close();
    }
}

启动服务端,再启动客户端,对应的结果如下:

下篇内容将编写一个测试案例,文件的上传和下载以及利用线程池优化服务器的吞吐量,如果本文对你有帮助请帮忙点赞转发!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值