java学习笔记——网络编程

网络编程  

网络编程:

          网络编程的实质就是不同设备之间的数据传输或程序与程序之间的数据通信。

网络通讯三要素:

IP地址(InetAddress对象)  

IP地址是为了Internet上实现不同设备之间的通信,每个设备都必须有个全球唯一地址。

端口号,传输协议(常用的是TCP、UDP)。

UDP:(User  Datagram  Protocol)用户数据报协议,是非面向连接的,不可靠,不安全,速度快。

(聊天、网络视频会议……就是采用UDP,数据不重要只求速度快)

将数据及源和目的封装成数据包中,不需要建立连接

每个数据报的大小在限制在64K内

因是无连接的,所以是不可靠协议

不需要连接,速度快

TCP:(Transfer Control Protocol)是面向连接,可靠,安全的连接。

建立连接,形成传输数据的通道

在连接中进行大数据量传输

通过三次握手完成连接,是可靠协议

必须建立连接,效率会稍低

Socket:

Socket是为网络服务提供的一种机制,

通信的两端都要有Socket

网络通信其实就是Socket间的通信

数据在两个Socket间通过IO传输

UDP:

创建发送UDP的流程:

1、建立UDPSocket服务通过DatagramSocket对象

2、提供数据,并将数据封装到数据包中

(DatagramPacket(byte[] buf,int length,InetAddress address,int port))

3、通过Socket服务的发送功能,将数据发送出去通过send()方法

4、关闭资源。close()方法

创建接收UDP的流程:

1、定义UDPSocket服务通过DatagramSocket对象。通常会监听一个端口。其实就是给这个接收网络应用程序定义数据标识。

2、定义一个数据包(DatagramPacket(byte[] buf,int length))

3、通过socket服务的receive()方法将收到的数据存入已定义好的数据包中

4、通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上

5、关闭资源

Socket与线程结合就能完成聊天小程序。

TCP:

TCP传输采用Socket(客户端对象)和ServerSocket(服务端对象)

Socket:

1、创建客户端的Socket服务,指定目的主机的端口

Socket socket=new Socket("172.18.70.136",8888);

2、为了发送数据,应该获取socket流中的输出流

OutputStream out=socket.getOutputStream();

ServerSocket端:

1、创建服务器端的Socket服务,并监听一个端口。ServerSocket();

2、获取连接过来的客户端对象,通过ServerSocket的accept方法,没有连接就会等,这个方法是阻塞式的。

3、客户端如果发过来数据,服务端要使用对应的客户端对象 ,并获取到该客户端对象的读取流来该读取发过来的数据,并打印在控制台。

4、关闭服务端(可选)

使用UDP编写一个聊天程序。

有收数据和发数据两部分需要同时执行。

所以需要用到多线程技术,一个线程控制收,一个线程控制发。

 

public class ThreadUdpSend implements Runnable {

    private  DatagramSocket datagram;

    public ThreadUdpSend(DatagramSocket datagram) {

        this.datagram = datagram;

    }

//重写run方法

    public void run() {

        try {

            datagram = new DatagramSocket();            

            BufferedReader buffered = new BufferedReader(new InputStreamReader(System.in));

            String line = null;

            while((line=buffered.readLine())!=null){

                if("byebye".equals(line)){

                     break;

                }

                byte[] bt = line.getBytes();

                DatagramPacket sp =new DatagramPacket(bt,bt.length,InetAddress.getByName("192.168.0.102"),10005);

                 datagram.send(sp);

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

//接收端

public class ThreadUdpReceive implements Runnable {

    private  DatagramSocket datagram;

   

    public ThreadUdpReceive(DatagramSocket datagram) {

        this.datagram = datagram;

    }

   

    @Override

    public void run() {

        while(true){

             byte[] buff = new byte[1024];

             DatagramPacket dpt = new DatagramPacket(buff,buff.length);

             try {

                datagram.receive(dpt);

                 String ip = dpt.getAddress().getHostAddress();

                 String da = new String(dpt.getData(),0,dpt.getData().length);

                 System.out.println(ip+":"+da);

            } catch (IOException e) {

                e.printStackTrace();

            }

         }

    }

}

public class ChatDemo01 {

    

     public static void main(String[] args)throws Exception{

         DatagramSocket send = new DatagramSocket();

         DatagramSocket receive = new DatagramSocket(10005);//接收端需要指明端口

         

         new Thread(new ThreadUdpReceive(receive)).start();

         new Thread(new ThreadUdpSend(send)).start();

     }

}

服务器端ServerSocket实例监听TCP链接请求,并为每个请求创建新的Socket实例。

服务器端要同时处理ServerSocket实例和Socket实例,而客户端只需要使用Socket实例

//Client客户端

public class SocketCilent01 {

     public static void main(String[] args) throws Exception {

            Socket s = new Socket("192.168.0.102",9998);

            OutputStream outStream = s.getOutputStream();

            outStream.write("ScoketClient is Come!".getBytes());

            InputStream  inStream = s.getInputStream();

            byte[] buff = new byte[1024];//字符数组

            int len = inStream.read(buff);

            System.out.println(new String(buff,0,len));

            s.close();

     }

}

 

//Server服务器端

public class SocketServer01 {

     public static void main(String[] args) {

         try {

            ServerSocket socServer = new ServerSocket(9998);

            Socket s = socServer.accept();

            String ip = s.getInetAddress().getHostAddress();

            

            System.out.println(ip+"connected");

            InputStream inStream = s.getInputStream();

            byte[] bt = new byte[1024];

            int byteRead = inStream.read(bt);

            System.out.println(new String(bt,0,byteRead));

            

            OutputStream outStream = s.getOutputStream();

            Thread.sleep(1000);

            outStream.write("i am happy to hear from you message!".getBytes());

            s.close();

            socServer.close();

            

        } catch (Exception e) {

            e.printStackTrace();

        }

     }

}

补充

面试题:什么情况下适合用UDP协议,什么情况下适合用TCP协议?


TCP的优点:

可靠,稳定

TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点:

慢,效率低,占用系统资源高,易被攻击

TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,

事实上,每个连接都会占用系统的CPU、内存等硬件资源。

而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOSDDOSCC等攻击。

UDP的优点:

快,比TCP稍安全

UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDPTCP被攻击者利用的漏洞就要少一些。

UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点:

不可靠,不稳定

因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

 

什么时候应该使用TCP

当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTPHTTPSFTP等传输文件的协议,POPSMTP等邮件传输的协议。

在日常生活中,常见使用TCP协议的应用如下:

 

浏览器,用的HTTP

FlashFXP,用的FTP

Outlook,用的POPSMTP

Putty,用的TelnetSSH

QQ文件传输等等。

什么时候应该使用UDP

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP

比如,日常生活中,常见使用UDP协议的应用如下:

 

QQ语音

QQ视频

网络电视

电视电话会议

TFTP等等。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值