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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飘影 中级黑马   /  2015-7-22 21:51  /  664 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  • OSI参考模型,注意看一下
  • TCP,UDP的协议名字,英文
  • 网络传输的三要素:   IP地址,端口,协议。
  • 网络中计算机的唯一标识
  • IP地址表示形式是“点分十进制”
  • IP组成:网络好短+主机号段。
  • IP地址的分类:

    • A类:1.0.0.1----127.255.255.254          10.x.x.x是私有地址        第一号段是网络断,后三段是主机号,即主机的个数
    • B类:128.0.0.1---191.255255.254            172.16.0.0---172.31.255.255是私有地址,前二段为网络号段
    • C类:192.0.0.1--223.255.255.254            192.168.x.x是私有地址。        前三段是网络段。
    • D类:224.0.0.1--239.255.255.254
    • 240.0.0.1---247.255.255.254

  • 特殊的IP地址:127.0.0.1回环地址
    x.x.x.255广播地址
    x.x.x.0网络地址。
  • InetAddress    是IP地址类
  • 如果一个类没有构造方法

    • 成员全是静态的(Math,Arrays.Collections)
    • 单例设计模式(Runtime)
    • 类中有静态方法返回该类的对象。

  • InetAddress address=InetAddress.getByName("主机名或者IP地址");   根据主机名或者IP地址的字符串表示得到IP地址对象,    这样可以拿别人的IP地址或者主机名。
    获得主机名: address.getHostName();
    获得IP地址    address.getHostAddress();
  • 端口号:正在运行的程序的标识
    范围:0-65535其中0-1024系统使用或者保留端口。
  • 协议:

    • UDP:把数据打包,数据有限制,64k,不建立连接,速度快,不可靠,
    • TCP:建立链接,形成传输数据通道,数据无限制,在连接中进行大数据量传输,通过三次握手完成传输,速度慢,可靠

  • 常用:

    • UDP:发短信,视频
    • TCP:打电话,

  • Socket:网络套接字:需啊哟IP地址和端口
  • UDP协议:DatagramSocket 数据包Socket

    • 创建发送端Socket对象     DatagramSocket ds=new DatagramSocket()
    • 创建数据,并把数据打包         DatagramPacket dp=new DatagramPacket(byte[] buf,int length,InetAddress address,int port)
    • 调用Socket对象的发送数据包   ds.send(dp); ds.receive(dp)阻塞的接收、
    • 释放资源    ds.close();

  • 简答的发送代码:
    1. DatagramSocket ds=new DatagramSocket();
    2. byte[] buf="hello,UDP发送数据!".getBytes();
    3. int length=buf.length;
    4. InetAddress address=InetAddress.getByName("192.168.31.157");
    5. int port=12345;
    6. DatagramPacket dp=new DatagramPacket(buf, length, address, port);
    7. ds.send(dp);
    8. ds.close();
    复制代码

  • 接收代码:
    1. DatagramSocket ds=new DatagramSocket(12345);
    2. byte[] buf=new byte[1024];
    3. int length =buf.length;
    4. DatagramPacket dp=new DatagramPacket(buf, length);

    5. ds.receive(dp);
    6. InetAddress address=dp.getAddress();
    7. String hostAddress=address.getHostAddress();
    8. String computerName=address.getHostName();
    9. byte[] buf2=dp.getData();
    10. int dataLength=dp.getLength();
    11. String dataString=new String(buf2, 0, dataLength);
    12. System.out.println(computerName+":"+hostAddress+"    "+dataString);
    13. ds.close();
    复制代码

  • UDP图解

  • 多线程UDP,注意SendThread和ReceiveThread实现Runable接口
    1. DatagramSocket dsSend=new DatagramSocket();
    2. DatagramSocket dsReceive=new DatagramSocket(12345);
    3. SendThread st=new SendThread(dsSend);
    4. ReceiveThread rt=new ReceiveThread(dsReceive);

    5. Thread t1=new Thread(st);
    6. Thread t2=new Thread(rt);
    7. t1.start();
    8. t2.start();
    复制代码

  • TCP协议:客户端类是Socket类服务器端是ServerSocket
  • 服务器端的socket的  accept()和read()是阻塞式
    1. Socket s=new Socket("192.168.31.157", 12345);
    2. OutputStream os=s.getOutputStream();
    3. os.write("hello 你好".getBytes());
    4. s.close();
    复制代码

  • 服务器端:
    1. Socket s=new Socket("192.168.31.157", 12345);
    2. OutputStream os=s.getOutputStream();
    3. os.write("hello 你好".getBytes());
    4. s.close();
    复制代码


  • 优化:client
    1.     Socket s=new Socket("192.168.31.157",12345);

    2.     BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    3.     BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

    4.     String line=null;
    5.     while((line=br.readLine())!=null){
    6.         if ("886".equals(line)) {
    7.             break;
    8.         }
    9.         bw.write(line);
    10.         bw.newLine();
    11.         bw.flush();
    12.     }
    13.     s.close();
    14. }
    复制代码

  • Server
    1. ServerSocket ss=new ServerSocket(12345);
    2. Socket s=ss.accept();
    3. BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
    4. String line=null;
    5. while((line=br.readLine())!=null){
    6.     System.out.println(s.getInetAddress().getHostAddress()+":"+line);
    7. }
    8. s.close();
    复制代码

  • 读取文件时可以做为null作为结束信息的,但是在通道内不能以null为技术信息。如果这样判断,服务器会一直等待客户端传送数据,
    解决办法:需要自定义一个结束标记。但是如果文本里有就会出错,所以需要另一种解决方案。
    s.shutdownOutput()作为socket流的结束。通知对方发送完成。
  • 注意必须用flush() 否则出现字节丢失 现象
  • 服务器端如果用while(true)接收客户端容易有问题,一个需要等待另一个完成才行。
    解决办法是多线程。


5 个回复

倒序浏览
写的不错 收藏一下
回复 使用道具 举报
哈哈 套长了 不错
回复 使用道具 举报
一只不懂网络编程这块,楼主总结的不错,收藏了
回复 使用道具 举报
代码加多点注释 就 更好了
回复 使用道具 举报
看了看  还不错  赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马