网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

Socket编程

目前较为流行的网络编程模型是客户机/服务器通信模式

客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求。如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服务器进程B1同时为客户进程A1、A2和B2提供服务。

Socket概述

1   所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。

2   Socket是连接运行在网络上的两个程序间的双向通信的端点。

3   网络通讯其实指的就是Socket间的通讯。

4   通讯的两端都有Socket,数据在两个Socket之间通过IO来进行传输。

 

使用Socket进行网络通信的过程

1   服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户的连接请求。

2  客户程序根据服务器程序所在的主机和端口号发出连接请求。

3   如果一切正常,服务器接受连接请求。并获得一个新的绑定到不同端口地址的套接字。

4   客户和服务器通过读、写套接字进行通讯。

基于TCP协议的Socket编程

1   创建TCP服务端步骤:

a)         创建一个ServerSocket对象

b)         调用accept()方法接受客户端请求

c)         从Socket中获取I/O流

d)         对I/O流进行读写操作,完成与客户端的交互

e)         关闭I/O流和Socket

2   创建TCP客户端步骤:

a)         创建一个Socket对象

b)         从Socket中获取I/O流

c)         对I/O流进行读写操作,完成与服务端的交互

d)         关闭I/O流和Socket

注:客户端和服务端进行数据传输时,客户端的输入流对应服务端的输出流,客户端的输出流对应服务端的输入流。

示例:创建一个客户端与服务端通信的例子

包名:com.iotek.tcpsocket

服务端:

// 1.创建一个ServerSocket对象
        ServerSocket serverSocket = new ServerSocket(8888);
        // 2.调用accept()方法接受客户端请求
        Socket socket = serverSocket.accept();
        System.out.println(socket.getInetAddress().getHostAddress() + "连接成功");
        // 3.获取socket对象的输入输出流
        BufferedReader br = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));

        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
        String line = null;
        // 读取客户端传过来的数据
        while ((line = br.readLine()) != null) {
            if (line.equals("over")) {
                break;
            }
            System.out.println(line);
            pw.println(line.toUpperCase());
        }

        pw.close();
        br.close();
        socket.close();
        System.out.println(socket.getInetAddress().getHostAddress() + "断开连接");

客户端:

Socket socket = new Socket("127.0.0.1", 8888);
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        while (true) {
            String line = br.readLine();// 获取键盘所输入的字符串
            pw.println(line);
            if (line.equals("over")) {
                break;
            }
            System.out.println(reader.readLine());// 获取服务端传过来的大写字符串
        }
        reader.close();
        br.close();
        pw.close();
        socket.close();

为了更直观的看见通信过程,将2个java程序复制到E盘根目录下,用命令行的形式来运行。

打开cmd,编译java,步骤

1 进入e盘。  e:

2 编译所有java文件。 javac –d . *.java

3 打开服务端。    java com.iotek.tcpsocket.TCPServer

4 再打开一个cmd命令行用于打开客户端java com.iotek.tcpsocket.TCPClient

 连接成功

在客户端输入hello回车之后测试成功。

输入over,断开连接

 

基于UDP协议的Socket编程

1 创建发送端

a)     建立DatagramSocket对象。该端点建立,系统会随机分配一个端口。如果不想随机配置,可以手动指定。

b)     将数据进行packet包的封装,必须要指定目的地地址和端口。

c)     通过socket服务的send方法将该包发出。

d)     将socket关闭。

2 创建接收端

a)     建立DatagramSocket对象。要监听一个端口。

b)     通过socket的receive方法将数据存入数据包中。

c)     通过数据包dp的方法getData()、getAddress()、getPort()等方法获取包中的指定信息。

d)     将socket关闭。

 

示例:创建一个发送与接收的例子

发送端:UDPDemo1

DatagramSocket socket = new DatagramSocket();
        String str = "i love you";
        // 把数据进行封装到数据报包中
        DatagramPacket packet = new DatagramPacket(str.getBytes(),
                str.length(), InetAddress.getByName("localhost"), 6666);
        socket.send(packet);// 发送

        byte[] buff = new byte[100];
        DatagramPacket packet2 = new DatagramPacket(buff, 100);
        socket.receive(packet2);
        System.out.println(new String(buff, 0, packet2.getLength()));
        socket.close();

接收端:UDPDemo2

// 先接收数据
        DatagramSocket socket = new DatagramSocket(6666);
        byte[] buff = new byte[100];
        DatagramPacket packet = new DatagramPacket(buff, 100);
        socket.receive(packet);// 接受传来的数据包
        System.out.println(new String(buff, 0, packet.getLength()));

        // 发送数据
        String str = "me too";
        DatagramPacket packet2 = new DatagramPacket(str.getBytes(),
                str.length(), packet.getAddress(), packet.getPort());
        socket.send(packet2);
        socket.close();

将2个java程序复制到E盘根目录下,用命令行的形式来运行。

打开cmd,编译java,步骤:

1 进入e盘。  e:

2   编译以UDP开头的文件。 javac –d . UDP*.java

3   先运行接收端。  java com.iotek.tcpsocket.UDPDemo2

4   重新打开一个命令行,运行发送端。  java com.iotek.tcpsocket.UDPDemo1

 

 

TCP与UDP的区别

TCP的优点

可靠,稳定

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

TCP的缺点

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

TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 

由于TCP存在确认机制和三次握手机制,这些是导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

TCP应用场景

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

在日常生活中,常见使用TCP协议的应用比如:浏览器使用HTTP,Outlook使用POP、SMTP,QQ文件传输等。

 

UDP的优点

快,比TCP稍安全 

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

UDP的缺点

不可靠,不稳定 

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

UDP应用场景

当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。在日常生活中,常见使用UDP协议的应用比如:QQ语音、QQ视频、TFTP等。

 

TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。

 

TCP/IP是个协议组

在网络层有:IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 

在传输层中有:TCP协议与UDP协议。 

在应用层有:FTP、HTTP、TELNET、SMTP、DNS等协议。 

转载于:https://my.oschina.net/u/3684779/blog/2993267

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值