1、网络通信三要素(掌握)

IP

     端口号
     协议(UPD&TCP)

2、UDP协议与TCP协议各自特点(掌握)

UDP

1.不需要建立连接;
     2.有数据大小限制,每个数据报的大小在限制在64k;
     3.无连接,是不可靠协议;

4.速度快。

TCP

1.在连接中进行大数据量传输(数据无限制);

2.通过三次握手完成连接;

3.是可靠协议;

4.必须建立连接,效率会稍低。


3、Socket

通过IP地址和端口号可以 创建一个Socket对象,也就是说Socket由IP和端口组成

     网络通信其实就是Socket之间的通信,比如Socket对象1和Socket对象2 两个对象之间的通信
     Socket通信中数据底层是通过IO流来传输的

4、InetAddress

  概述:

           IP信息的包装类
           本机ip 127.0.0.1
           ping 192.168.1.xxx

 常用方法:
  获取本地主机:getLocalHost

获取任意主机:getByName(String ip)

主机名:getHostName

  主机Ip地址:getHostAddress

5、DatagramPacket

概述:
     数据包对象,两个Socket之间是通过发送和解析DatagramPacket来交互的

构造方法:
    
DatagramPacket(byte[] buf, int length)

          构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)

          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

成员方法:

 InetAddress getAddress()

          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
 byte[] getData()

          返回数据缓冲区。
 int getLength()

          返回将要发送或接收到的数据的长度。
 int getPort()

          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
 SocketAddress getSocketAddress()

          获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
 void setAddress(InetAddress iaddr)

          设置要将此数据报发往的那台机器的 IP 地址。
 void setData(byte[] buf)

          为此包设置数据缓冲区。
 void setData(byte[] buf, int offset, int length)

          为此包设置数据缓冲区。
 void setLength(int length)

          为此包设置长度。
 void setPort(int iport)

          设置要将此数据报发往的远程主机上的端口号。

6、UDP代码

客户端代码

  1. package udp;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. /**
  6. * 创建码头
  7. * 创建集装箱
  8. * 发送
  9. * @author haoyongliang
  10. *
  11. */
  12. public class Client {
  13. public static void main(String[] args) throws Exception{
  14. System.out.println("客户端启动了啊");
  15. byte[] data = "nihao a".getBytes();
  16. DatagramSocket socket = new DatagramSocket();
  17. DatagramPacket packet = new DatagramPacket(data, data.length,InetAddress.getByName("192.168.48.10"),12306);
  18. socket.send(packet);
  19. socket.close();
  20. }
  21. }


服务端代码
  1. package udp;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. /**
  5. * 1、创建码头
  6. * 2、创建集装箱
  7. * 3、将码头拿到的数据装入集装箱
  8. * 4、通过集装箱获取数据
  9. * @author haoyongliang
  10. *
  11. */
  12. public class Server {
  13. public static void main(String[] args)throws Exception {
  14. DatagramSocket socket = new DatagramSocket(12306);
  15. DatagramPacket packet = new DatagramPacket(new byte[1024*64], 1024*64);
  16. socket.receive(packet);
  17. byte[] data = packet.getData();
  18. int length = packet.getLength();
  19. System.out.println(new String(data,0,length));
  20. }
  21. }


4、TCP代码

TCP 三次握手:

客户端 给服务器发送数据第一次
服务器给客户端响应数据第二次
客户端再次给服务端发送数据第三次

客户端代码
  1. package tcp;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.Socket;
  5. public class Client {
  6. public static void main(String[] args) throws Exception{
  7. //1、创建soket
  8. Socket socket= new Socket("127.0.0.1", 12306);
  9. /*
  10. * A 客户端向服务端写数据
  11. */
  12. OutputStream os = socket.getOutputStream();
  13. os.write("nihao,server,I'm client".getBytes());
  14. os.flush();
  15. /*
  16. * D 客户端读取服务端发送过来的数据
  17. */
  18. InputStream inputStream = socket.getInputStream();
  19. byte[] data = new byte[1024];
  20. int len = inputStream.read(data);
  21. System.out.println(new String(data,0,len));
  22. socket.close();
  23. }
  24. }


服务端代码
  1. package tcp;
  2. import java.io.InputStream;
  3. import java.io.OutputStream;
  4. import java.net.ServerSocket;
  5. import java.net.Socket;
  6. public class Server {
  7. public static void main(String[] args) throws Exception{
  8. //1、创建ServerSocket
  9. ServerSocket ss = new ServerSocket(12306);
  10. //2、与客户端建立连接
  11. Socket socket = ss.accept();//从请求队列中拿到Socket对象
  12. /*
  13. * B 服务端读取客户端发过来的数据
  14. */
  15. InputStream inputStream = socket.getInputStream();
  16. byte[] data = new byte[1024];
  17. int len = inputStream.read(data);
  18. System.out.println(new String(data,0,len));
  19. /*
  20. * C 服务端向客户端写入数据
  21. */
  22. OutputStream outputStream = socket.getOutputStream();
  23. outputStream.write("hehe".getBytes());
  24. outputStream.flush();
  25. socket.close();
  26. }
  27. }



5、练习

1、UPD客户端发送键盘录入数据,服务端打印客户端发送的消息

2、大写转换服务器
3、判断用户登陆
4、上传文件



6、今天必须掌握的内容,面试题,笔试题。(掌握这个就可以放心学习后面的知识了)

1、说说网络编程三要素
2、说说UDP和TCP的区别
3、说说TCP的三次握手协议过程
4、用TCP完成文件上传代码

day26_网络编程第一天的更多相关文章

  1. c#网络编程-第一章

    1.需求 获得网页数据,并填充到webbrowser空间中 2.代码示例 private void button1_Click_1(object sender, EventArgs e) { //1. ...

  2. unix网络编程第一章demo

    之前一直以为time_wait状态就是主动关闭的那一方产生.然后这个端口一直不可以用.实际我发现服务端监听一个端口.客户端发来连接后.传输数据后.服务端关闭客户端套接字后.用netstat -nat ...

  3. 网络编程[第一篇]基于tcp协议的套接字编程

    将服务端-客户端的连接比作双方打电话的过程 2019-07-24 一.客户端 主动的一方: 客户端实例化一个socket对象--> 主动像服务端发送连接请求--> (服务端接受请求后即可进 ...

  4. 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  5. 《java入门第一季》之网络编程初探

    由于在写有关javaweb的博客,在写到web服务器的时候需要回顾网络编程的知识,提前把网络编程放在前面写. 直接上代码解释: import java.net.InetAddress; import ...

  6. 《Go语言网络编程》第一章:体系

    原书地址:http://tumregels.github.io/Network-Programming-with-Go 如果不知道想要构建什么,是不可能创建一个系统的.而且如果不知道它工作的环境,也同 ...

  7. Python高级网络编程系列之第一篇

    在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...

  8. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  9. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

随机推荐

  1. JS实现页面加载完毕之前loading提示效果

    1.获取浏览器页面可见高度和宽度 var _PageHeight = document.documentElement.clientHeight, _PageWidth = document.docu ...

  2. div随意拖动小例子

    <html> <head> <title> Drag Demo 1 </title> <style type="text/css&quo ...

  3. myeclipse编译问题

    这个问题困扰了两天,在用springmvc编写Controller层的时候.我前台js跳转时@RequestMapping无法捕获到,但是之前的编写的都可以捕获正常执行.然后我更改js的跳转地址,发现 ...

  4. mysql连接查询和子查询

    一.连接查询 1.交叉连接 就是从一张表的一条记录去连接另一张表中的所有记录,并且保存所有的记录,其中包括两个表的所有的字段! 从结果上看,就是对两张表做笛卡尔积! 笛卡尔积也就是两个表中所有可能的连 ...

  5. C/C++函数调用的几种方式及函数名修饰规则以及c++为什么不允许重载仅返回类型不同的函数

    我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构,是一块连续的内存区域.这句话的意思是栈顶的地址和栈的最大容量是系统预 ...

  6. a标签

    a链接是一种触发行为元素,行内元素 属性:href/target/class/id/title href: <a href="www.baidu.com"></a ...

  7. 当你刷新当前Table时,刷新后如何回到你上一次所在位置呢?

    第一: 在你刷新前保存所在位置的行号 procedure XXXClass.LockPositionEx;begin DisableControls; FHistoryRecNo := 0; FHis ...

  8. Spearman秩相关系数和Pearson皮尔森相关系数

    1.Pearson皮尔森相关系数 皮尔森相关系数也叫皮尔森积差相关系数,用来反映两个变量之间相似程度的统计量.或者说用来表示两个向量的相似度. 皮尔森相关系数计算公式如下:

  9. Bootstrap CSS概览代码文字标注篇

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. STM32 Cube固件库编程之新建工程

    Cube固件库是ST现在主推的固件库,并且在它的官网已经找不到原来的标准库可供下载.Cube固件库的构架图如下 这种新式构架可以有效的加快软件工程师的工程进度. 新建一个工程项目主要包括以下的步骤: ...