网络编程
1,网络模型
OSI参考模型
TCP/IP参考模型
2,网络通讯要素
IP地址
端口号
传输协议
网络参考模型:
OSI参考模型 TCP/IP参考模型
应用层-----|
表示层-----|-----应用层
会话层-----|
传输层-----------传输层
网络层-----------网际层
数据链路层----|---主机至网络层
物理层------|
网络通讯要素
1,IP地址
网络中设备的标识
不易记忆,可用主机名
本地回环地址:127.0.0.1 主机名:localhost
2,端口号
用于标识进程的逻辑地址,不同进程的标识
有效端口:0~65535,其中0~1024系统使用或保留端口
3,传输协议
通讯的规则
常见协议:TCP,UDP
-------------------------------------------------------------------
TCP和UDP
1,UDP
将数据及源和目的封装成数据包中,不需要建立连接
每个数据包的大小限制在64k内
因无连接,是不可靠协议
不需要建立连接,速度快
2,TCP
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket
1,Socket就是为网络服务提供的一种机制
2,通信的两端都有Socket
3,网络通信其实就是Socket间的通信
4,数据在两个Socket间通过IO传输
UDP传输
1,DatagramSocket与DatagramPacket
2,建立发送端,接收端
3,建立数据包
4,调用Socket的发送接收方法
5,关闭Socket
发送端与接收端是两个独立的运行程序
-------------------------------------------------------------------
TCP传输
1,Socket和ServerSocket
2,建立客户端和服务器端
3,建立连接后,通过Socket中的IO流进行数据的传输
4,关闭Socket
同样,客户端与服务器端是两个独立的应用程序
/*
演示tcp传输
1,tcp分客户端和服务端
2,客户端对应的对象是Socket
服务端对应的对象是ServerSocket
*/
/*
客户端,
通过查询socket对象,发现在该对象建立时,就可以去连接指定主机
因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在
并连接成功,形成通路后,在该通道进行数据的传输
需求:给服务端发送给一个文本数据
步骤:
1,创建Socket服务。并指定要连接的主机和端口
*/
import java.io.*;
import java.net.*;
class TcpClient
{
public static void main(String[] args) throws Exception
{
//创建客户端的socket服务。指定目的主机和端口
Socket s = new Socket("192.168.0.100",10003);
//为了发送数据,应该获取socket流中的输出流
OutputStream out = s.getOutputStream();
out.write("tcp ge men lai le ".getBytes());
s.close();
}
}
/*
需求:定义端点接收数据并打印在控制台上
服务端:
1,建立服务端的socket服务。ServerSocket();
并监听一个端口
2,获取连接过来的客户端对象
通过ServerSocket的accept方法。没有连接就会等,所以这个方法阻塞式的
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的的读取流来读取发过来的数据。并打印在控制台上
4,关闭服务端。(可选)
*/
class TcpServer
{
public static void main(String[] args) throws Exception
{
//建立服务端socket服务。并监听一个端口
ServerSocket ss = new ServerSocket(10003);
//通过accept方法获取连接过来的客户端对象
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();//关闭客户端
ss.close();
}
}