一、TCP/UDP,Socket,Http,Ftp简介

1、TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层、传输层和应用层:

网络层:IP协议(支持网间互联的数据报协议)

传输层:TCP协议、UDP协议

应用层:FTP协议、HTTP协议等

2、TCP协议:当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据,TCP提供超时重发功能,TCP一旦建立连接,客户端和服务端任何一方主动关闭连接前,TCP连接都将保持下去。TCP最大的优点是可靠,一般网页、邮件、远程连接传输就用TCP.

TCP连接的三次握手:发送数据前需要建立连接,这个连接就是“三次握手”,握手完了才可以开始发送数据。第一次连接:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态;第三次握手:客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLESHED状态,即完成三次握手。

3、UDP协议:UDP是一个无连接的简单的面向数据报的传输层协议,UDP不提供可靠性,只是把应用程序传给IP层的数据报发送出去,并不保证他们能到达目的地,UDP不用在客户端和服务器间建立连接,故而传输速度快。一般语音广播,视频,QQ等传输就用UDP.

4、Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是实现传输层协议的一种API,Socket可以支持不同的传输层协议,可以是TCP,也可以是UDP,当使用TCP协议建立连接时,该Socket连接就是一个TCP连接。通常情况下建立TCP连接,Socket连接一旦建立通信双方就可以互相发送消息,直到连接断开。Socket连接步骤:服务器监听,客户端请求,连接确认。

5、Http协议,即超文本传输协议,是客户端浏览器与web服务器之间的应用层通信协议,web服务器上存储的都是超文本信息,客户端通过http协议传输所要访问的超文本信息,服务器通过http将超文本信息提取出来呈现给客户端。Http连接是建立在请求/响应模型上的,首先需要客户端建立一条与服务器端的TCP连接(不使用UDP连接是因为TCP协议提供传输控制,按顺序组织数据和错误纠正等功能),然后客户端发送一个请求到服务器,服务器才能回复数据。在请求结束后会主动释放TCP连接,从建立连接到释放连接称为“一次连接”。

6、FTP协议:文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和Internet上最早使用的协议之一,属于网络协议的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。

二、Java网络编程

1、InetAddress类代表IP地址,InetAddress类下还有 两个子类:Inet4Address、Inet6Address,分别代表IPV4地址和IPV6地址。

InetAddress ia = InetAddress.getLocalHost();//得到本机

IP对象

ia.getHostAddress();//得到IP地址

ia.getHostName();//获得此IP地址的主机名

ia.getCanonicalHostName();//获得此IP地址的全限定域名

byte[] bs = ia.getAddress();//得到的IP存进数组

System.out.println(Arrays.toString(bs));//打印出来的值会有负数,超过127,最高位会变为1,所以会打印出负数

InetAddress ia1 = InetAddress.getByAddress(bs);//根据原始IP地址获取对应InetAddress对象

InetAddress ia2 =      //根据主机获取对应InetAddress对象

InetAddress.getByName("WIN-2TTIKAESLV6");

2、基于TCP协议的网络编程:

ServerSocket和Socket:ServerSocket类用于监听来自客户端的Socket连接,如果没有连接,将会一直处于等待状态。

accept();//如果接收到一个客户端Socket的连接请求,该方法将返回一个与客户端Socket对应的Socket;否则该方法将一直处于等待状态,线程也被阻塞。

ServerSocket(int port);//构造方法,用指定端口创建一个ServerSocket,没有指定IP地址,则该ServerSocket将会绑定到本机默认的IP地址。客户端连接时需指定与此相同的端口号。

示例代码:

服务器端

客户端

socket.getInputStream();//返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据

socket.getOutputStream();//得到socket的输出流,程序将输出信息保存到socket中返回给客户端

实际生活中客户端和服务器端需要不断地进行通信,所以为了不阻碍线程,应该使用多线程。示例代码如下:

服务器端:

客户端:

3.基于UDP协议的网络编程:

UDP协议是一种不靠谱的协议,他在通信实例两端各建立一个Socket,但这两个Socket之间并没有连接,这两个Socket只是发送、接收数据报的对象,Java提供DatagramSocket对象作为基于UDP协议的Socket,使用DatagramPacket类包装一条要发送的消息,之后使用DatagramSocket类完成信息的发送、接收操作,使用DatagramSocket发送消息时并不能指定消息到底发往何处,而是由DatagramPacket包装消息时指定消息发往的目的地。示例代码如下:

客户端:

服务器端:

由上程序可知:接收数据之前应该采用的DatagramPacket构造器有:DatagramPacket(byte[] buf, int length);

DatagramPacket(byte[] buf, int offset,int length);

发送数据之前应该采用的DatagramPacket构造器有:DatagramPacket(byte[] buf, int length,InetAddress addr,int port);

DatagramPacket(byte[] buf, int offset,int length, InetAddress addr,int port);

DatagramSocket.receive(DatagramPacket p);//从该DatagramSocket中接收数据

DatagramSocket.send(DatagramPacket p);//向外发送数据

4、URL、URLConnection、URLDecoder和URLEncoder

URLDecoder和URLEncoder类用于转换字符串,示例代码如下:

URL:url.openStream()会返回一个读取该URL资源的InputStream流,之后就可将网址上的内容以流的方式输入进来。如下代码所示:

URLConnection:通过这个类可以建立与远程服务器的连接,检查远程资源的一些属性,如下代码所示:

---------------这些博客都是我之前在学习过程中自书中摘出的重点,以及一些前辈总结的经验,外加一些自己的感悟,如果有前辈看到,有不对的地方希望大家指出,非常感谢。

java网络编程 听_java网络编程 - 亲亲媛的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. java方法调用机制_Java方法调用机制 - osc_bkdv2it5的个人空间 - OSCHINA - 中文开源技术交流社区...

    最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中.奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制.本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内 ...

  2. java 写入环境变量_Java环境变量配置 - import_key的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java 环境变量和路径 在 Solaris 系统上,必须先设置 JAVA_HOME 和 PATH 环境变量,Sun Management Center 3.6 安装向导.设置向导和 Java 控制台 ...

  3. java的Teacher类_java类的继承 - osc_tauwfamo的个人空间 - OSCHINA - 中文开源技术交流社区...

    类的继承是类的一个重要概念,通过类的继承子类可以继承父类的属性和方法,提高代码的复用性. eg: //** *创建一个父类Teacher,父类有两个属性name,age,两个方法sleep(),tea ...

  4. java连连看项目汇报_java连连看小项目 - osc_x4wlt5vu的个人空间 - OSCHINA - 中文开源技术交流社区...

    /* *本人也是刚入门,希望各位多多指教 *该项目主要代码在于连线 *1.2个连线没有拐弯 *2.2个连线有一个拐弯 *3.2个连线有2个拐弯 *采用递归算法 */ package llk; impo ...

  5. java创建两个foo方法_Java类实例化原理 - osc_foo7glsg的个人空间 - OSCHINA - 中文开源技术交流社区...

    Java对象的创建过程包括类初始化(类实例化两个阶段. 一.Java对象创建时机 (1)使用new关键字创建对象 (2)反射创建对象 使用Class类的newInstance方法 Student st ...

  6. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  7. java脚本项目_java项目部署脚本 - xixingzhe的个人空间 - OSCHINA - 中文开源技术交流社区...

    #!/bin/sh #java export JAVA_HOME=/root/java/jdk #日志目录 export LOG_HOME=`pwd`/ #项目名称 APP_NAME=xxx.jar ...

  8. java 锁的类型_Java锁的种类 - shawnplaying的个人页面 - OSCHINA - 中文开源技术交流社区...

    Java锁和并发需要结合在一块了理解,涉及到了多个话题. 本文主要参考了 http://ifeve.com/java_lock_see1/ 但是我认为原文中有某些错误,我在下面的代码中做了修改. 公平 ...

  9. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...

    java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...

最新文章

  1. mongodb输错命令后不能删除问题
  2. android gone动画_Android动画之淡入淡出
  3. uni-app和php交互DES加密解密数据
  4. android AVB2.0(四)libavb库介绍
  5. STM32网络之SMI接口
  6. AttributeError: Can‘t get attribute ‘Net‘ on module ‘__main__‘
  7. Word 中文编号标题与数字编号题注
  8. ArcGIS 计算地类净面积工具
  9. Hard!168 · 吹气球
  10. CF 449E Jzzhu and Squares解题报告
  11. mysql远程主机强迫关闭了_HAProxy出现远程主机强迫关闭了一个现有的连接 的错误及解决...
  12. redo synch writes在什么情况下发生
  13. 超实用的Excel自动排序小技巧,原来这么简单,早点知道就好了!
  14. 计算机系男生生的都是女儿吗,IT男只能生女孩,生男孩几率很小吗?
  15. 程序员吐槽:四年被三家公司裁员补偿,网友:去BAT转转?
  16. linksys 打印软件_评论:Linksys WRT1900AC双无线路由器是WRT54G的第二代产品
  17. jsch sftp工具包连接未释放
  18. 安全认证系列之-(三)成为数字认证机构CA
  19. cas 4.0——cas的新版本可以下载了
  20. 【软件定义汽车】【架构篇】OTA、FOTA、SOTA解决方案

热门文章

  1. 逻辑谬误收集,以后辩论用
  2. c语言中一元钱币的算法,c – 确定硬币组合的算法
  3. 开机弹出网页msftconnecttest.com/redirect解决方法
  4. 云服务器下行速率降低排查
  5. 【软工文档】机房收费系统之详细设计说明书
  6. merge java方法_Java HashMap merge() 方法
  7. Load Switch介绍与使用
  8. 计算机学校速成班,电脑学校有没有速成班啊?想快点学完
  9. 区块链:面临迟早会突破上涨的行情,你敢在关键压力位建空仓吗
  10. QFW:更快的优化,更低的传输成本,无投影法