一:网络模型:计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指 :
OSI(Open System Interconnection开放系统互连)参考模型
TCP/IP参考模型(HTTP/HTTPS)
比较重要,必须会背
二:网络通信三要素
IP地址:InetAddress 网络中设备的标识,不易记忆,可用主机名
端口号 用于标识进程的逻辑地址,不同进程的标识
传输协议 通讯的规则 常见协议:TCP,UDP
(1)如何获得ip地址?
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用
static InetAddress getByName(String host) 确定主机名称的IP地址。
public String getHostName()获取此IP地址的主机名。
public String getHostAddress()返回文本显示中的IP地址字符串。
public byte[] getAddress()返回此InetAddress对象的原始IP地址。 结果是网络字节顺序:地址的最高位字节在getAddress()[0]
public class InternetDemo1 {
public static void main(String[] args) throws Exception {
//part1
InetAddress address = InetAddress.getByName("192.168.2.227");
System.out.println(address);
//part2
String hostName = address.getHostName();
System.out.println(hostName);
//part3
String hostAddress = address.getHostAddress();
System.out.println(hostAddress);
//part3
byte[] address1 = address.getAddress();
for (byte b : address1) {
System.out.print(b);
}
}
}
netstat -ano:查看端口号
(2)Socket套接字: 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制: 通信的两端都有Socket。 网络通信其实就是Socket间的通信。 数据在两个Socket间通过IO传输。
(3)UDP :将数据源和目的封装成数据包中,不需要建立连接;每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
发送端口:
1、建立发送端的Socket对象
2、创建数据,并将数据打包
3、通过调用Socket的发送方法将数据包发出去
4、释放资源,关闭Socket
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo {
public static void main(String[] args) throws Exception{
DatagramSocket datagramSocket = new DatagramSocket();
byte [] bytes="这是发送端数据".getBytes();
int length=bytes.length;
InetAddress address = InetAddress.getByName("192.168.2.227");
//有效端口:0~65535,其中0~1024系统使用或保留端口。
int port=10000;
//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
DatagramPacket datagramPacket = new DatagramPacket(bytes,length,address,port);
//void send(DatagramPacket p)
//从此套接字发送数据报包。
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
UDP接收端接收数据:
1、创建接收端的Socket对象
2、创建一个接收包(接收数据容器)
3、调用Socket的接收方法接收数据 receive()
4、解析数据包,获取数据,显示在控制台
5、释放资源,关闭Socket
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class ReveiceDemo {
public static void main(String[] args) throws Exception{
//创建接收端的Socket对象
//DatagramSocket(int port)
//构造数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket ds = new DatagramSocket(10000);
byte [] bytes=new byte[1024];
int length=bytes.length;
//DatagramPacket(byte[] buf, int length)
//构造一个 DatagramPacket用于接收长度的数据包 length 。
DatagramPacket dp = new DatagramPacket(bytes,length);
ds.receive(dp);//该方法阻塞,直到接收到数据包
// 返回该数据报发送或接收数据报的计算机的IP地址。
InetAddress address = dp.getAddress();
//解析数据包,获取数据,显示在控制台
//public byte[] getData()返回数据缓冲区。
byte[] data = dp.getData();
int length1=data.length;
String s = new String(data, 0, length1);
System.out.println("发送端的ip地址是:"+address+"发送来的信息是:"+s);
// ds.close();正常不用关,这里写的话就结收不到数据了
}
}
先运行接收端,再运行发送端
练习:写一个输入端当键盘录入数据当时”886“结束传输
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class SendDemo3 {
public static void main(String[] args) throws Exception{
DatagramSocket ds = new DatagramSocket();
BufferedReader bw = new BufferedReader(new InputStreamReader(System.in));
String len=null;
while((len=bw.readLine())!=null) {
if ("886".equals(len)) {
break;
}
DatagramPacket dp = new DatagramPacket(len.getBytes(),len.getBytes().length, InetAddress.getByName("localhost"),10089);
ds.send(dp);
}
ds.close();
}
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class RevericeDemo2 {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(10089);
while (true) {
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, length);
ds.receive(dp);//该方法阻塞,直到接收到数据包
InetAddress address = dp.getAddress();
byte[] data = dp.getData();
int length1 = data.length;
String s = new String(data, 0, length1);
System.out.println("发送端的ip地址是:" + address + "发送来的信息是:" + s);
}
}
}
(4)TCP:建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
TCP协议传输发送数据端
1、创建客户端的Socket对象
指定服务器的IP和端口,内部自动建立连接
一旦建立连接成功,说明与服务IO通道形成
2、获取输出流,往IO通道写数据
3、释放资源
import java.io.OutputStream;
import java.net.Socket;
public class CilentDemo1 {
public static void main(String[] args) throws Exception{
//Socket(String host, int port)
//创建流套接字并将其连接到指定主机上的指定端口号。
Socket s = new Socket("192.168.2.227", 10086);
//获取输出流
//public OutputStream getOutputStream()throws IOException返回此套接字的输出流。
OutputStream os = s.getOutputStream();
os.write("我想睡觉".getBytes());
// os.close();
s.close();
}
}
TCP协议接收数据服务器端
1、创建服务器端的Socket对象 ServerSocket
2、监听客户端连接,返回一个对应的客户端的Socket对象
3、获取输入流对象,读取数据,显示在控制台上
4、释放资源
import java.io.InputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class SeverDemo1 {
public static void main(String[] args) throws Exception{
//创建服务器端的Socket对象 ServerSocket
//ServerSocket(int port)
ServerSocket ss = new ServerSocket(10086);
Socket a = ss.accept();
//获取输入流对象,读取数据,显示在控制台上
//public InputStream getInputStream() 返回此套接字的输入流。
InputStream is = a.getInputStream();
byte[] bytes=new byte[1024];
int length = is.read(bytes);
String s = new String(bytes, 0, length);
//获取谁发送的信息,IP
//public InetAddress getInetAddress()返回套接字所连接的地址。
InetAddress ip = a.getInetAddress();
System.out.println(ip+":"+s);
a.close();
}
}
同样还是先运行接受端再运行发送端



