A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

UDP与TCP是网络传输数据的两种方式。这两种方式各自的特点是:        UDP的特点:
        把数据、源、目的封装在包中,不需要建立连接,

每个包的大小控制在64k之内

是无连接的,是不可靠的协议

不需要建立连接,因而传输速度快

TCP的特点:

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

在连接中进行大量数据的传递

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

必须建立连接,效率相对比较低


打一个比方,UDP之间的通信就像是邮寄包裹,只有找到当地的邮局才能邮寄出去,这个邮局就是DatagramSocket,而邮寄的包裹 就是DatagramPacket。它只管寄,至于寄出去成功还是不成功,它是不管的。

而TCP通信则像是打电话,必须A方先打出去,B方拿起电话,告诉A已经接收到了,A再告诉B说是已经知道B接收到了,才能进行通信,一旦这个信息通道建立,就可以不断的进行传递数据。

UDP适合高效率的传输,而TCP适合大数据和稳定的传输。

网络编程的实质是Socket编程,Socket是网络编程的一种机制,而TCP和UDP只是建立了两种连接主机的方式,而两个主机要完成通信,还是需要用IO流进行的。因而在进行Socket通信的时候,如果已经导入了.net.*包,一般伴随而来的还要导入.IO.*包。

再打一个比方,两地之间进行数据通信就像是两地之间运送石油。UDP通信是把石油装进集装箱(DatagramPacket),然后装进油轮(DatagramSocket),最后告诉油轮去哪里,油轮出去之后是否能够 运送到,就不管了。

TCP通信则是在两地之间建立一条石油管道,只有通过建立管道(connect),再接收 (accept),再对得到的石油进行提炼(getInputStream),再向外发送需要的石油(getOutputStream),这样才能完成石油的传送 ,管道一旦建立,就确定 了,也就是两台主机的信息通道建立了,就可以进行信息通信了。

使用UDP进行信息传输的示例代码(以本机为例):

import java.io.IOException;
import java.net.*;
public class UDPDemo {
        public static void main(String[] args) throws IOException, InterruptedException {
                // TODO Auto-generated method stub               
                Thread.sleep(1000);
                ReceiveData rd=new ReceiveData();
                Thread t2=new Thread(rd);
                t2.start();
                SendData sd=new SendData();
                Thread t1=new Thread(sd);
                t1.start();
        }
}
class SendData implements Runnable{

        @Override
        public void run() {
                // TODO Auto-generated method stub
                try {
                        DatagramSocket ds = null;
                        ds = new DatagramSocket();//建立带发送端口的DatagramSocket       
                       
                        byte[] data="djaosifdaio".getBytes();//确立要发送的信息
                       
                        DatagramPacket dp=new DatagramPacket(data,data.length,InetAddress.getByName("192.168.1.106"),20005);//打包要发送的数据、IP地址和端口号
                       
                        ds.send(dp);//发送
                       
                        ds.close();//关闭流资源
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
}

class ReceiveData implements Runnable{

        @Override
        public void run() {
                try {
                        DatagramSocket ds=new DatagramSocket(20005);
                       
                        byte[] buf=new byte[1024];
                        DatagramPacket dp=new DatagramPacket(buf,buf.length);
                       
                        ds.receive(dp);//监听指定端口的信息
                        String ip=dp.getAddress().getHostAddress().toString();//获取信息的IP地址
                        String data=new String(dp.getData(),dp.getData().length);//获取信息
                        int port=dp.getPort();//获取发送信息的端口号
                       
                        System.out.println("ip="+ip);
                        System.out.println("data="+data);
                        System.out.println("port="+port);
                        ds.close();
                       
                       
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
       
}

运行结果:

ip=192.168.1.106
data=how are you
port=64605

注:端口号是在发送线程创建DatagramSocket的时候指定的,如果在创建的时候不加端口号,那么会随机的选择一个空闲的端口号发送。


TCP使用的具体示例:

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

class Client implements Runnable{
        public void run() {
                // TODO Auto-generated method stub
                try {
                        Socket s=new Socket("192.168.1.106",10057);
                       
                        OutputStream os=s.getOutputStream();
                       
                        os.write("how are you ".getBytes());
                       
                        InputStream is=s.getInputStream();
                        byte[] buf=new byte[1024];
                        int k=is.read(buf);
                        System.out.println(new String(buf,0,k));
                       
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }       
}


class Server implements Runnable{

        public void run() {
                // TODO Auto-generated method stub
                ServerSocket ss;
                try {
                        ss = new ServerSocket(10057);               
                       
                        Socket s=ss.accept();
                       
                        InputStream is=s.getInputStream();
                        String line=null;
                        byte[] buf=new byte[1024];
                        int len;
                        while((len=is.read(buf))!=-1){
                                System.out.println(new String(buf,0,len));
                        }
                        OutputStream os=s.getOutputStream();
                        os.write("hao are you too!".getBytes());
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
       
}

public class SocketDemo {
        public static void main(String[] args) throws InterruptedException {
                // TODO Auto-generated method stub
                new Thread(new Client()).start();
                Thread.sleep(1000);
                new Thread(new Server()).start();               
        }
}

运行的结果是:

how are you

注意:一定要先运行Server,再运行Client。


2 个回复

倒序浏览
赞一个!
回复 使用道具 举报
支持总结。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马