【网络编程】

一. 网络编程

底层数据的传输`

1.1 IP

定位节点

1.2端口(port)

区分不同软件,通过端口,可以在一个主机上运行多个网络应用程序。

1.3URL

统一资源定位符,可以直接从 URL 中读取字节流数据。

二、传输层协议

UDP:
简单,效率高,开销小,不安全,大小有限制
TCP****:
面向连接,安全,效率低,大小没限制

2.1 InetAddress:

封装计算机的ip地址和DNS的类,没有公有的构造函数,只能通过静态方法来创建实例。

InetAddress.getByName(“www.4399.com”)–返回 服务器的ip
InetAddress.getLocalHost–返回本地主机的地址。
InetAddress.getHostAddress–主机地址,以文本形式返回 IP 地址字符串。
InetAddress.getHostName–获取此 IP 地址的主机名

2.2 Socket:

Socket编程 : 套接字。 传输层为应用层开辟一个小口子,不同的传输层协议对Socket的实现不同,所以网络编程称之为面向Socket编程。

Socket: 客户端
ServerSocket:服务端
客户端和服务端通过OutputStream、InputStream进行输入输出,需要数据处理流DataOutputStream、DataInputStream来保证基本数据类型和String字节流的功能流。

三、在UDP协议下数据传输

UDP协议下实现基础的数据传输基于字节数组, UDP发送端与接收端是平等的。

客户端实现步骤:

  • 定义发送端
  • 准备数据
  • 打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
    构造一个数据报包,用于将长度为length 、偏移量为offset的数据包发送到指定主机上的指定端口号。
  • 发送
  • 关闭
		//定义发送端,端口9999
        DatagramSocket socket = new DatagramSocket(9999);
        //准备数据
        byte[] bytes = "hello".getBytes();
        //打包
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length,new InetSocketAddress("localHost",9888));
        //发送
        socket.send(packet);
        //关闭
        socket.close();

接收端实现步骤:

  • 定义接受端
  • 准备一个包裹,用来接收数据
  • 接受、处理数据
  • 关闭
		//定义接收端
        DatagramSocket socket = new DatagramSocket(9888);
        //准备接收数据的包
        byte[] bytes = new byte[1024];
        DatagramPacket packet = new DatagramPacket(bytes,0,bytes.length);
        //接收
        socket.receive(packet);
        // 处理数据
        // byte[] getData() 返回数据缓冲区
        byte[] bytes1 = packet.getData();
        int length = packet.getLength();
        System.out.println(new String(bytes1,0,length));
        //关闭
        socket.close();

四、在TCP协议下数据传输

面相连接 基于三次握手连接,基于四次挥手断开;数据传输基于IO流,两端不平等.

客户端实现步骤:

  • 1.定义我是客户端,同时建立与服务器端的连接,如果连接建立不成功,抛出异常,因为连接被拒绝
  • 2.准备数据
  • 3.获取字节输出流,往服务器发送数据
  • 4.刷出
  • 5.关闭
		//1.我是发送端
        Socket client = new Socket("127.0.0.1",9999);
        //2.准备数据,
        String message ="你好";
        //3,创建连接,输出流
        DataOutputStream output = new DataOutputStream(client.getOutputStream());
        //4.写出
        output.writeUTF(message);
        //5.刷出
        output.flush();
        //6.关闭
        output.close();
        client.close();

服务端实现步骤:

  • 1.建立服务器端
  • 2.阻塞式监听
  • 3.获取输入流,读取客户端发送的数据
  • 4.处理数据
  • 5.关闭
		//我是服务端
        ServerSocket server =new ServerSocket(9999);
        //监听,建立联系
        Socket client= server.accept();
        //输入流,读取
        DataInputStream inputStream = new DataInputStream(client.getInputStream());
        String mess= inputStream.readUTF();
        System.out.println(mess);
        //关闭
        inputStream.close();
        server.close();
        client.close();

五、课后练习

1.tcp实现文件上传,客户端本地读取文件内容发送端服务器端,服务器接收数据保存到本地文件中,实现文件上传
public class FileIn {
    public static void main(String[] args) throws IOException {
        //创建客户端
        Socket socket = new Socket("127.0.0.1",8989);
        //文件输入,读取文件,作为数据
        InputStream input = new FileInputStream("D://test//1.txt");
        int len = -1;
        byte[] car = new byte[1024];
        byte[] bytes = input.readAllBytes();
        String me = new String(bytes);
       /* String message=null;
        while((len=input.read(car))!=-1) {
            message=new String(car,0,len);
        }*/
        DataOutputStream data = new DataOutputStream(socket.getOutputStream());
       //data.writeUTF(message);
        data.writeUTF(me);
        data.flush();
        data.close();

        //数据输出流
        //刷出,关闭
    }
}
public class FileOut {
    public static void main(String[] args) throws IOException {
        //定义服务端
        ServerSocket server = new ServerSocket(8989);
        //数据监听
        Socket socket =server.accept();
        DataInputStream in = new DataInputStream(socket.getInputStream());
        //读取数据
        String message = in.readUTF();
        System.out.println(message);
        //关闭
        in.close();
        socket.close();
        server.close();
        OutputStream out = new FileOutputStream("D://test//3.txt");
        out.write(message.getBytes());
        out.flush();
        out.close();
    }
}
2.tcp实现,客户端接收用户输入的用户名与密码信息,以username=zhangsan&password=123的格式发送到服务器,服务器端本地接收校验 当用户名为scott,密码为1234为登录成功,否则失败,结束服务器本地输出。
public class Login {
    public static void main(String[] args) throws IOException {
        //创建客户端
        Socket socket = new Socket("127.0.0.1",8999);
        //准备数据
        Scanner in = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = in.next();
        System.out.println("请输入用户名");
        Scanner in1 = new Scanner(System.in);
        String password = in1.next();
        String message = "username="+username+"&password="+password;
        System.out.println(message);
        //输出流,写出数据
        DataOutputStream out = new DataOutputStream(socket.getOutputStream());
        out.writeUTF(message);
        //刷出关闭
        out.flush();
        out.close();
    }
}
public class Logout {
    public static void main(String[] args) throws IOException {
        //创建服务器接收端
        ServerSocket server = new ServerSocket(8999);
        //监听
        Socket lis = server.accept();
        //输入流+接收数据
        DataInputStream data = new DataInputStream(lis.getInputStream());
        //读取数据+判断数据
        String strings = data.readUTF();
        System.out.println(strings);
        String[] arr = strings.split("&");
        String[] user = arr[0].split("=");
        /*if(user[1].equals("zhangsan")){
            System.out.println("right");
        }*/
        String[] pass = arr[1].split("=");
        if(user[1].equals("zhangsan")&&pass[1].equals("123")){
            System.out.println("login success");
        }
        //关闭
        lis.close();
        server.close();
        data.close();
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值