java网络编程TCP/UDP笔记

Posted 宏远小七

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java网络编程TCP/UDP笔记相关的知识,希望对你有一定的参考价值。

关于java的网络编程,我在网上看了一些视频,学到了很多,然后就把学习到的东西总结起来。

简介

网络编程就是通过两台或多台主机之间的数据通信。想要实现这一目标,首先要在主机之间建立一条连接通道,然后按照事先规定好的格式(或者说规定的协议)进行数据传输,从而完成主机之间的信息传输。

TCP协议

TCP(Transmission Control Protocol)称为传输控制协议,是一种面向连接的可靠的传输协议。例如:QQ聊天

代码

这代码是我看视频里面的例子,我自己稍微有一些改动。
客户端

package com.ZXF.Net;

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

public class TcpClientDemo1 {
    public static void main(String[] args) {

        Socket socket=null;
        OutputStream os=null;
        FileInputStream fis=null;
        InputStream is=null;
        ByteArrayOutputStream baos=null;

        try {
            //1.创建一个socket连接
            socket=new Socket(InetAddress.getByName("127.0.0.1"),9000);
            //2.创建一个输出流
             os=socket.getOutputStream();
             //3.读取文件
             fis=new FileInputStream(new File("林允儿.jpg"));
             //4.写出文件
            byte[] buffer=new byte[1024];
            int len=-1;
            while ((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }

            //通知服务端,我已结束
            socket.shutdownOutput();//我已经传输完了
            //确认服务器接收完成,才能断开连接
            is=socket.getInputStream();
            //由于服务发过来的确认信息是字符数组,所以创建数组管道流
            baos=new ByteArrayOutputStream();
            byte[] buffer2=new byte[2014];
            int len2=-1;
            while ((len2=is.read(buffer2))!=-1){
                baos.write(buffer2,0,len2);
            }
            System.out.println(baos.toString());



        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            //关闭资源,先开后关
            if (baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (os!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    fis.close();
                } catch (IOException e) {

                }
            }
        }
    }
}

服务端

package com.ZXF.Net;

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

public class TcpServerDemo1 {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream in=null;
        FileOutputStream fos=null;
        OutputStream os=null;
        try {
            //1.创建连接
             serverSocket=new ServerSocket(9000);
             //2.监听客户端的连接
             socket=serverSocket.accept();//阻塞式监听,会一直等待客户端连接,直到连接成功就关闭
            //3.获取输入流
             in=socket.getInputStream();
             //文件输出
            fos=new FileOutputStream(new File("copy.jpg"));
            byte[] buffer=new byte[1024];
            int len=-1;
            while((len= in.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }

            //通知客户端我已接收完成
            os=socket.getOutputStream();
            os.write("我已经接收完成,你可以关闭连接了!".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭资源,先开后关
            if (os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (serverSocket!=null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }
}

TCP简单例子总结

1:客户端:
		1.创建连接(serversocket)然后给出一个指定端口;
		2.监听客户端的连接 socket.accept()方法;
		3.获取输入流 socket.getInputStream()方法;
		4.输入文件或者其他(直接运用io知识);
		5.通知服务端我已经传输完毕 socket.shutdownOutput();
		6.(可有可无的)通过io流输出信息在控制台提示,已经结束传输;
		7.关闭资源 先开后关原则;
2:服务端:
		1.创建socket连接 然后给出指定IP和端口 socket(IP,port)
				例如:Socket(InetAddress.getByName("127.0.0.1"),9000)2.创建一个输出流 socket.getOutputStream()3.读取文件 InputStream()4.写出文件 正常io流操作;
		5.(可有可无的)通过io流输出信息在控制台通知程序员,已经结束传输;
		6.关闭资源 先开后关原则。

UDP协议

UDP(User Datagram Protocol)称为用户数据报协议,是一种面向无连接的传输协议。例如:发短信、东风快递。

代码

这代码是我看视频里面的例子,我自己稍微有一些改动。
客户端(没有明确的概念)

package com.ZXF.Net;

import java.io.IOException;
import java.net.*;

//不需要连服务器
public class UdpClientDemo1 {
    public static void main(String[] args) {
        DatagramSocket socket= null;
        try {
            //1.创建一个socket连接
            socket = new DatagramSocket();
            //2.建个包
            String msg="UDP,第一次尝试";
            InetAddress localhost = InetAddress.getByName("localhost");
            int port=9001;
            //数据,数据长度起始、结束,发给谁
            DatagramPacket packet=new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
            //3.发送包
            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (socket!=null){
                //4.关闭源
                socket.close();
            }
        }
    }
}

服务端(没有明确的概念)

package com.ZXF.Net;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpServerDemo1 {
    public static void main(String[] args)  {
        DatagramSocket socket= null;
        try {
            //1.开放端口
            socket = new DatagramSocket(9001);
            //接收数据包
            byte[] buffer=new byte[1024];
            DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);
            socket.receive(packet);//阻塞接收
            System.out.println(packet.getAddress().getHostAddress());//获得包来自的地址
            System.out.println(new String(packet.getData(),0, packet.getLength()));

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (socket!=null){
                //关闭源
                socket.close();
            }
        }
    }
}

UDP简单例子总结

1:客户端(没有明确的概念):
		1.创建一个socket连接(数据报 DatagramSocket)
		2.建立一个需要发送的包(DatagramPacket)
			确定把这个包发送给谁:DatagramPacket(包内容,0,包长度,地址,端口号);
			例子:DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
		3.发送包 socket.send(packet);
		4.关闭资源
2:服务端(没有明确的概念):
		1.开放端口 DatagramSocket(port);
		2.接收包 DatagramPacket(包名,0,包长);
			例:DatagramPacket(buffer,0,buffer.length);
		3.阻塞接收  socket.receive(packet);
		4.可以通过packet.get*()方法获取包的信息。

结语

细心的朋友可能会发现,我的代码有林允儿[手动狗头]
既然看到这里了,就看一下美女放松一下吧↓
在这里插入图片描述

本篇文章到这就结束了。每次在网上看视频,都会做一些笔记,如果各位有好的做笔记方式方法可以跟我交流交流,共同进步;如果这篇文章有可以优化的地方希望大佬指教指教。

以上是关于java网络编程TCP/UDP笔记的主要内容,如果未能解决你的问题,请参考以下文章

《网络协议》笔记-TCP/UDP

网络 应用&传输层笔记

Python学习笔记__16.3章 UDP编程

Socket网络编程学习笔记 网络编程Socket与TCP/UDP

Qt TCP/UDP 网络协议入门实操TCP通讯

java 网络流 TCP/UDP