中的网络编程TCP/IP常用知识点总结
1 首先什么是网络编程
网络编程的本质是两个设备之间的数据交换。就是把一个数据发送给另一个数据,然后接收数据的设备
反馈数据信息的过程。基于 请求/响应方式 在网络编程中,发起连接的程序也就是第一次请求的程序,被称为客户端,
等待其它程序连接的程序被称作服务器。客户端可以需要时启动,服务端必须一致启动以便于接收客户端的请求。
网络模型 参考
OSI 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 简单的来说就是“物数网传会表应”
TCP/IP TCP/IP参考模型共有五层:应用层、传输层、互联网层和主机至网络层。 与OSI参考模型相比,TCP/IP参考模型没有表示层和会话层。
2 网络通讯要素
IP地址
InetAddress 网络中设备的标识 不易记忆 可以用主机名
本地会换地址 127.0.0.1 主机名:localhost
端口号
用于表示进程的逻辑地址 不同进程的标识
有效端口 0--65535其中0-1024为系统保留端口(不是所谓的物理端口号)
传输协议
通讯的规则
常见有 TCP UDP
3 TCP和UDP的联系和用途
一、区别
二者都是常用的传输协议,一般从功能上进行区分。
在功能上这两种传输协议也就适合不同的业务和不同的硬件终端
在使用中,类似于图像、声音等对可靠性要求没有那么高的业务可以使用UDP
需要准确的存储对准确性无要求但要求速度快。
对系统资源的要求:cp较多UDP少
程序结构:UDP程序结构简单,TCP复杂
流模式与数据报模式:TCP保证数据的正确性,UDP可能会丢失包,TCP保证数据的传输顺序,UDP不保证
注:
(1)TCP是面向连接的传输控制协议,而UDP提供了无连接的数据报服务; (2)TCP具有高可靠性,确保传输数据的正确性,不出现丢失或乱序;UDP在传输数据前不建立连接,不对数据报进行检查与修改,无须等待对方的应答,所以会出现分组丢失、重复、乱序,应用程序需要负责传输可靠性方面的所有工作; (3)也正因为以上特征,UDP具有较好的实时性,工作效率较TCP协议高; (4)UDP段结构比TCP的段结构简单,因此网络开销也小。
二 用途:
TCP 是面向连接的有比较高的可靠性 如FTP TELENT SMTP POP3 HTTP
UDP 是面向无连接的,使用这个协议常见的有NDS SNMP QQ(2003之前后续也是用TCP)
UDP是一种面向无连接的通信协议,该协议是的数据传输的速度得到大幅度的
提高。视频聊天语音聊天基于UDP协议
UDP:
1 将数据源和目的封装到数据包中,不需要建立连接
2 每个数据包的大小限制在64K以内
3 因无连接,是不可靠协议
4 不需要建立连接,速度快
TCP:
1 建立连接,形成传输数据的通道
2 在连接中进行大量数据的传输
3 通过三次握手完成连接、是可靠协议
4 必须建立连接 效率会稍低
如电话通话 必须建立连接对方同意才可以发送数据不然就等待
4、InetAddress 与Socket
InetAddress 构造方法私有,不能直接创造对象
InetAddress getByName(String host):在给定主机名的情况下确定主机的IP地址
InetAddress getLocalHost():返回本地主机
InterAddress[] getAllByName(String host)
ip.getHostAddress()
ip.getHostName()
package com.itheima;
import java.net.InetAddress;
public class Demo {
public static void main(String[] args ) throws Exception
{
//获取本地的IP地址
InetAddress i =InetAddress.getLocalHost();
System.out.println(i);
//获取域名百度的IP
i=InetAddress.getByName("www.baidu.com");
System.out.println(i);
System.out.println(i.getHostAddress());//域名地址
System.out.println(i.getHostName());//主机名
}
}
Socket
Socket 就是为网络服务提供的一种机制
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
5 UDP传输
1 只要是网络传输,必须有socket
2 数据一定要封装到数据包中,数据包中包括目的地址 端口 数据等
直接操作UDP不可能,对于java语言应该将udp封装成对象,利于我们使用
这个对象就是DatagramSocket 封装了UDP传输协议的socket对象
数据包中信息较多也将其封装为对象:DatagramPacket.通过这个对象中的
方法就可以获取数据包中的信息
DatagramSocket具备发送和接收的功能,在进行udp传输时,需要明确一个是发送端一个是接收端
udp的发送端:
1 建立udp的socket服务,创建对象时如果没有明确端口系统会自动分配
2 明确要发送的具体数据
3 将数据封装成了数据包
4 用socket服务的send方法将数据包发送出去
5 关闭资源
udp的接收端
1 创建udp的socket服务 必须要明确一个端口,作用在于只有发送到
这个端口的数据才是这个接收端可以处理的数据
2 定义数据包,用于存储接收到的数据
3 通过socket服务的接收方法将收到的数据存储到数据包中
4通过数据包的方法获取数据包中的具体数据内容,比如IP 端口 数据等等
5 关闭资源
package com.itheima;
import java.net.*;
public class Demo {
public static void main(String[] args ) throws Exception
{
/* //获取本地的IP地址
InetAddress i =InetAddress.getLocalHost();
System.out.println(i);
//获取域名百度的IP
i=InetAddress.getByName("www.baidu.com");
System.out.println(i);
System.out.println(i.getHostAddress());//域名地址
System.out.println(i.getHostName());//主机名
*/
/* //1 建立一个udp的socket服务
DatagramSocket ds=new DatagramSocket(8888);//定义一个发送端 可以不写系统会自动分配
//2 明确要发送的具体数据
String text="udp传输演示";
byte[] buf=text.getBytes();
//3 将数据封装成数据包
DatagramPacket dp =new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);
//用socket服务的send方法将数据报发送出去
ds.send(dp);
//关闭资源
ds.close();*/
//1 建立一个socket的udp服务 必须指定端口并和服务发送端口号一样
DatagramSocket ds =new DatagramSocket(10000);
// 2 定义数据包,用于存储接收到的数据 方法是定义一个字节数组
//数据包会把数据存储到字节数组中
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//3 通过socket服务的接收方法将收到的数据存储到数据包中
ds.receive(dp);
//4 通过数据包的方法获取数据包中的具体数据内容 如ip 端口 数据等
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
//将字节数组中的有效部分转成字符串
String text=new String(dp.getData(),0,dp.getLength());
System.out.print(ip+":"+port+":"+text);
//5 关闭资源
ds.close();
}
}
一个聊天java小程序源码
package com.itheima;
import java.io.*;
import java.net.*;
//客户端,发送端
class Send implements Runnable{
private DatagramSocket ds;
public Send(DatagramSocket ds){
super();
this.ds=ds;
}
public void run(){
try{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line;
while((line=br.readLine())!=null){
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("localHost"),1025);
ds.send(dp);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
//服务端 接收端
class Rece implements Runnable{
private DatagramSocket ds;
public Rece(DatagramSocket ds){
super();
this.ds=ds;
}
public void run(){
try{
while(true){
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
@SuppressWarnings("deprecation")
String data=new String(dp.getData(),dp.getLength());
System.out.println(ip+" "+data);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public class LiaoTian {
public static void main(String[] args) throws SocketException{
DatagramSocket sendDs=new DatagramSocket();
DatagramSocket receDs=new DatagramSocket(10225);
new Thread(new Send(sendDs)).start();
new Thread(new Rece(receDs)).start();
}
}
6 TCP 传输
两个端点建立连接后的通道称之为流;建立在网络基础上的流称之为sorcket流
该流中既有读取,也有写入
tcp的两个端点:一个是客户端,一个是服务端
客户端:对应的对象是Socket
服务端:对应的对象是ServerSocket
TCP客户端:
1 建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时就已经
可以对指定的ip和端口进行连接(三次握手)
2 如果连接成功,就以为着建立了通信通道,socket流就已经产生了。
只要获取到socket流中的读取流和写入即可,只要通过getInputStream和OutputStream
就可以获取两个流的对象
3 关闭资源
package com.itheima;
import java.io.*;
import java.net.Socket;
class TcpClient{
public static void mian(String[] args) throws Exception
{
Socket s=new Socket("10.1.31.69",10002);
java.io.OutputStream out =s.getOutputStream();
out.write("tcp演示".getBytes());
s.close();
}
}
TCP服务端:
1 创建服务端 socket服务,并监听一个端口
2 服务器端为了给客户端提供服务,获取客户端的内容,可以通过accept方式
获取连接过来的客户端对象
3 可以通过获取到的socket对象中的socket流和具体的客户端进行通讯
4 如果通讯技术,关闭资源,注意要先关闭客户端再关闭服务端
小结:对于UDP和TCP 既可以定义输出流也可以创建输入流,具体情况根据需要
构建;比如:我们需要客户端给服务器端发送数据,服务器端在给客户端反馈数据
那么就要在客户端和服务器端分别多加一个输入流和输出流!否则发送不出去,收不到!
---------------------- 拖走FM----期待与您交流! --------
收音机,电台,网上电台,广播,在线广播,网络广播,广播电台,网络电台,在线电台,电台在线收听,广播电台在线收听,网络电台在线收听,在线收听电台,fm收音机,网络收音机,广播下载,在线收音机,收音机软件下载,电台软件下载,网络收音机下载--------------
---------------------- 拖走FM----期待与您交流! --------