Socket,IP,端口,TCP,UDP

来源:互联网 发布:吃饭前拍照知乎 编辑:程序博客网 时间:2024/06/05 19:21
1.网络编程三要素:
(1)IP地址
 概念:网络计算机的唯一标识,将IP地址上的每个字节上的数据换算成十进制,然后,分开来表示:“点分十进制”
 组成:网络号段+主机后段
  A类:第一段号为网络断号+后三段主机后段(一个网络号:256*256*256)
  B类:前二段号为网络断号+后二段主机后段(一个网络号:256*256)
  C类:第三段号为网络断号+后一段主机后段(一个网络号:256,最为常见)
 10.X.X.X,192.168.X.X 是私有地址,在互联网上不适用,而被用在局域网在。

 两个dos命令:ipconfig 查看本机IP地址
       ping 后面跟IP地址,测试本机通信指定IP地之间的通信是否有问题
 特殊的IP地址:127.0.0.1 回环地址(表示本机)
 X.X.X.255  X.X.X.0 分别是广播地址和网络地址,不建议使用
   Java中提供InetAddress类来操作IP
 如果一个类中没有构造方法,以下原因
 A:成员全部是静态的(Math,Arrays,Collections)
 B:单例设计模式(Runtime)
 C:类中有静态方法返回该类的对象(InetAddress)
 方法:    InetAddress ia = InetAddress.getByName("Lenovo-PC");
           //获取主机名和IP地址
            String name = ia.getHostName();
            String ip = ia.getHostAddress();
(2)端口
 概念:正在运行的程序的标识。有效端口:0~65535,其中0-1024系统使用或者做为保留端口。
(3)网络协议
 UDP:
把数据打包,数据有限制,每次不能超过64k,不建立连接,速度快,不可靠。
 TCP:建立连接通道,在连接中建立大量数据传输,通过三次握手完成连接,是可靠协议,必须建立连接,效率会低。
  举例:UDP:发短信   TCP:打电话
2.Socket网络编程(套接字编程)
(1)概念:包含IP+端口,
通信两端都要有Scoket,网络通信其实就是Socket间的通信,数据底层其实就是IO流。

UDP:
 *  发送数据:

 *  A:创建发送端Socket对象
 *  B:创建数据,将数据打包
 *  C:调用Socket对象的发送方法发送发到数据包
 *  D:释放资源
 *  类 DatagramSocket 此类表示用来发送和接收数据报包的套接字。


 //创建发送端Socket对象
   DatagramSocket ds = new DatagramSocket();
        byte[] bytes = "yanxi love you".getBytes();
        int length = bytes.length;
        InetAddress address = InetAddress.getByName("172.20.0.129");
        int port = 10086;
 //数据打包
        DatagramPacket dp =new DatagramPacket(bytes,length,address,port);
        //发送数据
 ds.send(dp);
 //释放资源
        ds.close();


 * 接收数据:

 * A:创建接收端的Socket对象
 * B:创建数据包,用来接收数据
 * C: 接受数据
 * D:解析数据,显示在控制台
 * E:释放资源


  //创建接收端的Socket对象
        DatagramSocket ds = new DatagramSocket();
        //创建数据包,用来接收数据
        byte[] bytes = new byte[1024];
        int length = bytes.length;
        DatagramPacket dp = new DatagramPacket(bytes,length);
        //接受数据
        ds.receive(dp);//阻塞式方法
        //获取对方的IP
        InetAddress address = dp.getAddress();
        String ip = address.getHostAddress();
        String name = address.getHostName();
        //解析数据,显示在控制台
        int  len = dp.getLength();
        byte[] bytes1 = dp.getData();
        String s = new String(bytes1,0,len);
        System.out.println(name+"--" +ip +"--" + s);
        //释放资源
        ds.close();
 
TCP
:(注意:要先开接收端,接下来在开发送端)

 * TCP接收数据:
 * A:创建接收端的Socket对象
 * B:监听客户端
 * C:获取输入流,读取数据
 * D:释放资源

  ServerSocket ss = new ServerSocket(8888);
 //返回的直接是一个Socket对象
        Socket s = ss.accept();
        InputStream is = s.getInputStream();

        byte[] bytes = new byte[1024];
        int len = is.read(bytes); //阻塞式方法
        System.out.println(new String(bytes,0,len));

        s.close();

 * TCP发送数据
 * A:创建发送端的Socket对象,指定IP,端口
 *      这一步成功,说明已经建立了连接
 * B:获取输入流,写数据
 * C:释放资源

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

        OutputStream os = socket.getOutputStream();
        os.write("yanxi love you".getBytes());
        socket.close();

  在用TCP来进行上传文件,并对文件进行复制时,客户端得不到反馈数据,因为读取文本文件是可以以null作为结束信息的,但是,通道是不能这样结束信息的,所以服务器根本不知道已经读完了,导致两个互相等待。
解决方法一:在客户端传数据可以多写一句话,来作为结束语句。(不好)
解决方法二:Socket对象提供了一种终止功能,Shutdo()通知服务器终止传输。

 一个服务器多个客户端的方法:
 方法一:将服务器从监听开始用while循环改进。(不好)
方法二:开启一个线程,每次传入要监听的Socket,然后服务器在调用start执行。
0 0
原创粉丝点击