1.1概述
- 包packet概念:包含对方信息,对方地址,自己地址。
- 计算机网络:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路(有线或无线)链接,在网络操作系统,网络管理软件,网络通信协议(共同的通信语言)的管理和协调下,实现资源共享和信息传递的计算机系统。
- 网络编程目的:传播交流信息。数据交换,通信
- 想要达到的效果:1.如何准确的定位网络上的一台主机如:192.168.16.124端口,定位到计算机上某资源2.找到了主机,如何传输数据?
1.2网络通信的要素
-
如何实现网络的通信?
(1)如何准确定位到网络上一台或多台主机
(2)找到主机后如何进行通信 -
网络编程的要素
(1)IP和端口号
(2)网络通信的协议:TCP/IP参考模型(七层)
1.3 IP
-
ip地址:inetAddress
(1)唯一定位一台计算机 -
ip地址分类
(1)ipv4:127.0.0.1,由4个字节组成,每个字节0-255
(2)ipv6: fe80::cdf7:f452:8dc5:48b%5, 128位,8个无符号整数 -
公网(互联网)与私网(局域网)
(1)ABCD类地址
(2)192.168.XX.XX专门给组织内部使用的
InetAddress类,无构造方法不可new,只能使用方法
package DemoIP;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class TestInetAdress {
public static void main(String[] args) {
try {
//查询主机地址
InetAddress inetAddress1=InetAddress.getByName("localhost");
System.out.println(inetAddress1);
//方法二
InetAddress inetAddress2=InetAddress.getLocalHost();
System.out.println(inetAddress2);
//查询网站ip地址
InetAddress inetAddress3=InetAddress.getByName("www.baidu.com");
System.out.println(inetAddress3);
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
1.4端口Port
- 端口表示计算机上一个程序的进程
- 不同的进程有不同的端口号,用来区分软件,被规定为0-65535
- 有两个协议tcp和udp,tcp端口号用80,udp也可以,但同一个协议下不可重复
- 端口分类:公用端口:0-1023如http端口:80(一般不要去占用,输入http://www.baidu:80);https是443;FTP:21;Telent:23
程序注册端口:1024-49151分配给用户或程序
Tomcat:8080
MySQL:3306
Oracle:1521
查看端口命令:netstat -ano
InetSocketAddress类可以new
package DemoIP;
import java.net.InetSocketAddress;
public class TestSocketAdress {
public static void main(String[] args) {
InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",8080);
System.out.println(inetSocketAddress);
System.out.println(inetSocketAddress.getPort());//端口
System.out.println(inetSocketAddress.getAddress());//地址
}
}
1.5通信协议
- 协议:约定,全国使用普通话
- 网络通信协议:速率,传输码率,…
- 分层:TCP/IP协议:有两个重要的协议:(位于传输层)
(1)TCP:用户传输协议(打电话,要保证接通)
(2)UDP:用户数据报协议(发邮件,发出去就不管了)
1.6TCP实现聊天
- 服务端:1.建立服务端口serverSocket 2.等待用户的来凝结通过accept3.接受用户消息。
package TCPDemo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public class TcpSeverSocket {
public static void main(String[] args) {
ServerSocket serverSocket =null;
Socket accept =null;
InputStream inputStream =null;
ByteArrayOutputStream byteArrayOutputStream =null;
//创建一个port
try {
serverSocket = new ServerSocket(999);
//2.等待客户端链接
accept = serverSocket.accept();
//3读取客户端消息
inputStream = accept.getInputStream();
//管道流
byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len=inputStream.read(buffer))!=-1){
byteArrayOutputStream.write(buffer,0,len);//拼接
}
System.out.println(byteArrayOutputStream.toString());
} catch (IOException e) {
e.printStackTrace();
}finally {
//流用完要关闭,倒着关
try {
byteArrayOutputStream.close();
inputStream.close();
accept.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 客户端:1.通过Socket来连接服务器2.发消息
package TCPDemo;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class TcpClient01 {
public static void main(String[] args) {
Socket socket =null;
OutputStream outputStream =null;
try {
//1.要知道服务器地址(本地),端口号
InetAddress inetAddress=InetAddress.getByName("127.0.0.1");
int port=999;
//2.创建socket链接,选用含有两个参数的
socket = new Socket(inetAddress,port);
//3发消息是写出,IO流
outputStream = socket.getOutputStream();
outputStream.write("你好".getBytes());
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
先运行服务端,再运行客户端: