黑马程序员技术交流社区

标题: java Socket和DatagramSocket的区别 [打印本页]

作者: 罗忠文    时间: 2012-11-25 14:10
标题: java Socket和DatagramSocket的区别
java Socket和DatagramSocket的区别,并且写出通信代码
作者: 赵红萍    时间: 2012-11-25 14:46
socket是为网络服务的提供的一种机制,网络通信就是指的socket间的通信,因为通信的两端都有socket,数据在两个socket之间通过IO通信,简单的说就是socket相当于计算机上的一个网络应用程序,这个应用程序最终通过网口传出去.
网络传输的三要素:IP,端口,协议,协议中最长用的是TCP协议和UDP协议.
你上面问的DatagramSocket就是使用UDP协议的socket传输.
UDP协议:将数据及源和目的封装成数据包,不需要建立连接,每个数据包的大小限制在64K内,因为是无连接的,所以是不可靠协议,但是速度快,聊天工具就是使用的是UDP协议.
TCP协议:建立连接形成数据的传输通道,在连接中进行大量的数据传输,通过三次握手完成连接是可靠协议,但效率会低一些,下载用的是TCP协议.
对于UDP的socket传输要有发送端和接受端
UDP的发送端:
                DatagramSocket ds = new DatagramSocket();
                byte[] buf = "udp".getBytes();
                DatagramPacket dp = new DatagramPacket(
                                buf,
                                buf.length,
                                InetAddress.getByName("127.0.0.1"),
                                10000);
                ds.send(dp);
                ds.close();
UDP接受端:
                DatagramSocket ds = new DatagramSocket(10000);
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                ds.receive(dp);
                String IP = dp.getAddress().getHostAddress();//获取IP地址
                String data = new String(dp.getData(),0,dp.getLength());//获取数据
                int port = dp.getPort();//获取端口
                System.out.println("IP:"+IP+",data:"+data+",port:"+port);
                ds.close();
我这个代码是看不到效果的,因为UDP是无连接传输,如果接受端当时是开着的,就可以接收到,如果没有接受端,那传输的那些数据就丢失了,TCP的传输,你可以看毕老师的java基础视频,老师说的很详细而且有效果,在这里打字敲太费劲而且不一定能说清楚
作者: 罗忠文    时间: 2012-11-25 15:02
能不能给个TCP的
作者: 白磊    时间: 2013-5-9 22:47
TCP用的是Socket和ServerSocket
UDP用的是DatagramSocket
接收端代码
import java.io.IOException;
import java.net.*;

public class Server {

        public static void main(String[] args) throws SocketException {
        DatagramSocket ds=new DatagramSocket(8888);
        byte[]buf=new byte[1024];
        DatagramPacket dp=new DatagramPacket(buf,buf.length);
        try {
                ds.receive(dp);
                String str=new String(dp.getData(),0,dp.getLength());
                String ip=dp.getAddress().getHostAddress();
                int port=dp.getPort();
                System.out.println(str+"::"+ip+"::"+port);
                System.out.println();
        } catch (IOException e) {
                e.printStackTrace();
        }finally{
                ds.close();
        }
}
发送端代码
import java.io.IOException;
import java.net.*;


public class Client {

        public static void main(String[] args) throws Exception {
                DatagramSocket ds=new DatagramSocket();               
                String str="abc";
                DatagramPacket dp=
                                new DatagramPacket(str.getBytes(),0,str.length(),InetAddress.getByName("localhost"),8888);
                try {
                        ds.send(dp);
                } catch (IOException e) {
                        e.printStackTrace();
                }
                finally{
                        ds.close();
                }
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2