zoukankan      html  css  js  c++  java
  • 黑马程序员_网络编程

    网络编程的实现方式

    网络编程有两种实现方式:即通过TCP协议和UDP协议。

    问:TCP和UDP有什么区别:

    答:

    1)        TCP协议:属于可靠的连接,在发送数据报之前建立连接,采用三次握手原则,可以保证数据能够完整的传输到目的地,因而传输速度也会比较慢。

    2)        UDP协议:属于不可靠的连接,发送数据包之前不会建立连接,不会保证数据报到没到达目的地。

    (1)UDP:
      a、将数据及源和目的封装成数据包,不需要建立连接
      b、每个数据包的大小限制在64K内
      c、因无连接,是不可靠协议
      d、不需要建立连接,速度快
     (2)TCP:
      a、建立连接,形成传输数据的通道
      b、在连接中进行大数据量传输
      c、通过三次握手完成连接,是可靠协议
      d、必须建立连接,效率会稍低

    TCP程序

    Java中TCP程序的实现:

    |-  使用ServerSocket类来代表服务器端,public class ServerSocket extends Object

    |-  使用Socket类来代表客户端,public class Socket extends Object。

    2、UDP传输

     (1)DatagramSocket,建立发送端send(DatagramPacket p)、接收端receive(DatagramPacket p)
     (2)DatagramPacket,数据报包用来实现无连接包投递服务,构造函数有DatagramPacket(byte[] buf,int length,InetAddress address,int port)等
     (3)通信实现(发送端):
      a、建立udpsocket服务,例如DatagramSocket ds = new DatagramSocket()对象
      b、提供数据,并将数据封装到数据包中,即将数据转换成字节数组,再使用DatagramPacket进行封装,例如byte[] buf = "udp is sending".getByte();DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByname("192.168.0.100"),10000)
      c、通过socket服务的发送功能,将数据包发出去,ds.send(dp);
      d、关闭资源,例如ds.close();
     (4)通信实现(接收端):
      a、建立udpSocket服务,例如 DatagramSocket ds = new DatagramSocket(10000);
      b、建立一个数据包,因为接收到的是一个字节数据,数据包对象中有更多的功能用于提取字节数据的信息,例如 byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);
      c、通过socket服务的接收方法将收到的数据获取到DatagramPacket中,ds.receive(dp);
      d、通过DatagramPacket的功能将数据流解读出来,并输出到需要的地方,例如,String ip = dp.getAddress().getHostAddress();String data = new String(dp.getData(),0,dp.getLength());
      e、关闭资源,ds.close();

    3、TCP传输

     (1)Socket建立客户端,SeverSocket建立服务器端
     (2)建立连接后,通过Socket中的IO流进行数据传输
     (3)关闭Socket
     (4)通信实现(客户端):
      a、建立socket服务,tcp是面向连接的,在建立socket服务时就要指定要连接的主机和端口以建立连接,例如Socket soc = new Socket("192.168.0.100",10003);
      b、建立用于获取或写入socket输入输出流的IO流对象,例如OutputStream out = s.getOutputStream;InputStream in = new InputStream();
      c、向输出流写入数据,数据即可从socket输出流输出,out.write("tcpmsg is sending".getByte());使用输入流读取即可获取socket输入流的数据,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
      d、关闭资源,soc.close();
     (5)通信实现(服务端):
      a、建立SeverSocket服务,并监听一个端口,SeverSocket ss = newSeverSocket(10003);
      b、通过accept方法获取连接过来的客户端对象,Socket s = ss.accept();
      c、客户端如果发来数据,服务端使用上一步获取的对应客户端对象读取数据,InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);String str = new String(buf,0,len);
      d、关闭客户端,释放资源,s.close()
      e、关闭服务端,(如果还要等待下一个客户端连接的话,也可以不关闭服务端),ss.close();

    TCP传输

    Socket和ServerSocket

    建立客户端和服务器端

    建立连接后,通过Socket中的IO流进行数据的传输

    关闭socket


    同样,客户端与服务器端是两个独立的应用程序。

     基本思路(客户端)

    客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异 常。

    连接成功,说明客户端与服务端建立了通道,那么 通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过 getInputStream(),getOutputStream()获取即可。

    与服务端通讯结束后,关闭Socket。


    通过Socket建立对象并指定要连接的服务端主机以及端口。
    Socket s = new Socket(“192.168.1.1”,9999);
    OutputStream out = s.getOutputStream();
    out.write(“hello”.getBytes());
    s.close();

     基本思路(服务端)

    服务端需要明确它要处理的数据是从哪个 端口进入的。

    当有客户端访问时,要明确是哪个客户 端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。

    当该客户端访问结束,关闭该客户端。


    建立服务端需要监听一个端口
    ServerSocket ss = new ServerSocket(9999);
    Socket s = ss.accept ();
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int num = in.read(buf);
    String str = new String(buf,0,num);
    System.out.println(s.getInetAddress().toString()+”:”+str);
    s.close();
    ss.close();

  • 相关阅读:
    在Eclipse中使用Checkstyle 检查Java代码规范
    文件缓存法的具体实现
    hdu 4454 Stealing a Cake
    uva 11922
    uva 11020
    uva 12206
    uva 11107
    uva 11796
    uva 11178
    uva 11437
  • 原文地址:https://www.cnblogs.com/yaochao/p/3983293.html
Copyright © 2011-2022 走看看