网络编程(TCP/IP协议+UDP/IP协议)

又是在华清远见培训快乐学习知识的一天!今天学习了网络编程,其中包括网络通信介绍、TCP/IP协议(重点掌握)、UDP/IP协议以及这两个协议的具体对比(掌握)。


前言

我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?本文就介绍了其相关的基础内容。

一、网络通信介绍

网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据。网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到和通信的目的。通信是人与人之间通过某种媒体进行的信息交流与传递。网络通信即是通过网络将各个孤立的设备进行连接,通过信息交换实现人与人,人与计算机,计算机与计算机之间的通信。网络通信中最重要的就是网络通信协议。

二、TCP网络通信

1、TCP/IP协议(掌握)

1)三次握手

 

三次握手详细解释:

第一次握手:客户端发起,发送SYN请求报文,序列化:X;服务器收到SYN请求报文。

第二次握手:服务器端发起,发送ACK确认报文,确认号:X+1;发送SYN请求报文,序列号Y,客户端收到SYN/ACK请求确认报文。

第三次握手:客户端发送ACK确认报文,确认号Y+1,服务器端收到ACK确认报文。

2)TCP/IP协议

TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送

TCP可以保证从一端数据传至连接的另一端时,数据能够确实送达

TCP协议适合可靠性比较高的场合,就像拨打电话。

客户端:

输入流:服务器给客户端发送(对应服务器端的输出流)

输出流:客户端给服务器发送(服务器的输入流)

服务器:

输入流:客户端给服务器端。(就是客户端通过输出流输出的数据)

输出流:服务器给客户端发送(服务器输出流对应客户端的输入流)

2、TCP网络通信实例代码

服务器端过程:

第一步:创建服务端套接字(socket)对象,定端口为6666(随意设置),用来接收客户端发来的socket对象。

第二步:接收客户端发来的socket,当服务器没有接收到socket时,会处于阻塞状态。

第三步:用流(输入流)来接收客户端发来的内容。从套接字中获取字节输入流;准备字节数组,作为进行读取的介质;从字节流中读取内容,读取到数组中,并返回读取的字节数量;将字节数组拼成字符串。

第四步:通过输出流向客户端发送回复。获取字节输出流,进行回复;准备一个回复语句;将回复语句转换为字节数组进行传递。

第五步:关闭所有流(不要忘记哦)。

注意:不要忘记抛出异常!

服务器端代码如下(示例):

package com.hqyj.test;

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

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

        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        OutputStream os = null;
            try {

                // 创建服务端套接字对象,定端口为6666,用来接收客户端发来的socket对象
                ss = new ServerSocket(6666);
                // 接收客户端发来的socket,当服务器没有接收到socket时,会处于阻塞
                socket = ss.accept();

                // 用流来接收客户端发来的内容
                // 从套接字中获取字节输入流
                is = socket.getInputStream();
                // 准备字节数组,作为进行读取的介质
                byte[] bytes = new byte[1024];
                // 从字节流中读取内容,读取到数组中,并返回读取的字节数量
                int length = is.read(bytes);
                // 将字节数组拼成字符串
                String content = new String(bytes, 0, length);

                System.out.println(content);

                // 通过输出流向客户端发送回复
                
                //获取字节输出流,进行回复
                os = socket.getOutputStream();
                //准备一个回复语句
                String response = "恭喜你,连接成功,可以下课订饭了";
                //将回复语句转换为字节数组进行传递
                
                switch (content) {
                case "1":
                    response = "1";
                    break;
                case "2":

                    break;
                case "3":

                    break;
                case "4":
                    break;
                default:
                    break;
                }
                os.write(response.getBytes());

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                    os.close();
                    socket.close();
                    ss.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    }
}
客户端代码如下(示例):package com.hqyj.test;

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

public class ClientTest {

    public static void main(String[] args) {
        Socket socket = null;
        OutputStream os = null;
        InputStream is = null;

        try {
            socket = new Socket("127.0.0.1", 9999);
            Scanner scan = new Scanner(System.in);
            while (true) {
                //输出流
                os = socket.getOutputStream();
                String request = scan.next();
                os.write(request.getBytes());               
                //输入流
                is = socket.getInputStream();
                byte bytes[] = new byte[1024];
                int length = 0;
                String str = "";
                length = is.read(bytes);
                str += new String(bytes, 0, length);

                System.out.println(str);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            try {
                is.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

三、UDP/IP协议(了解过程)

1、UDP/IP协议实例代码

UDP协议无连接通信协议,不保证可靠数据的传输,但能够同时向若干目标发送数据。

UDP协议适合于一些对数据准确性要求不高的场合,如网络聊天室,在线影片等。

接收端代码如下(示例):

package com.hqyj.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UDPRecevier {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket(8848);
            byte data[] = new byte[1024];
            DatagramPacket dp = new DatagramPacket(data, data.length);
            socket.receive(dp);
            System.out.println(dp.getAddress());
            System.out.println(new String(data,0,data.length));

        } catch (SocketException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            socket.close();
        }

    }

}
发送端代码如下(示例):package com.hqyj.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPSender {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        DatagramSocket socket = null;
        while(true) {
            try {
                socket = new DatagramSocket();
                String str = "UDP发送";
                for(int i = 2;i<=255;i++) {
                    String ipAddress = "192.168.31."+i;
                    DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName(ipAddress),8848);
                    socket.send(dp);
                }
                
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                socket.close();
            }
        }
    }

}

四、TCP/IP和UDP/IP对比

 1)TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建 立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送 或接收操作。

 2)UDP是一种无连接的协议,每个数据报都是一个独立的地址信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

 3)UDP每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

 4)UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

 5)UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方

 6TCP 面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中需要连接时间。

 7)TCP传输数据无大小限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大的数据。

 8)TCPTCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。

 9)TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。但是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。

 10)UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。例如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。

对比总结(重点):

1)TCP/IP:基于三次握手,面向连接的固线双向通路,安全可靠,收发顺序一致,大小无限制,相对时间慢。准确性高,适用于对数据准确性有要求的场合

2)UDP/IP:无连接,每一个数据报文都有独立的信,每个报文不能超过64K,相对时间快。但是无序不准确,适用于准确要求不高的场合,78总结9提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值