网络编程
一、概述
1、计算机网络:
地理位置不同、通过通信线路、在网络操作系统、网络管理软件和网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统
2、网络编程的目的:
3、想要达到的效果:
1、如何确定网络上的一台主机:IP地址、端口、定位某个资源
2、找到主机如何确定传输数据:
网络编程主要针对传输层的应用协议:TCP、UDP
二、网络通信的要素
如何实现网络通信?
1、通信双方的地址:ip、端口号。
2、规则:网络通信的协议;TCP/IP模型
三、IP地址
1、ip地址:InetAddress类
唯一定位一台网络网络上的计算机。
127.0.0.1:本机localhost
ip地址的分类:
①:根据ip地址分类:ipv4、ipv6
ipv4:127.0.0.1 4个字节组成,0-255 2011年已经用尽
ipv6:8个无符号整数
②:公网(互联网)/私网(局域网)
ABCD类地址
192.18.xx.xx专门给组织内部使用
域名:域名的诞生就是为了解决记忆ip问题
四、端口port
1、端口表示计算机上一个程序的进程
①不同的进程有不同的端口号,用来区分软件
②被规定0-65535
③TCP、UDP分别有0-65535,理论上可以同时跑65535*2
④端口分类:
公有端口:0-1023,会被内置程序使用 如:HTTP:80端口 HTTPs:443端口 TFP:21 Telent:23
程序注册端口:1024-49151分配给用户或者程序。 Tomcat:8080 MySQL:3306 Oracle:1521
动态、私有:49152-65535
netstat -ano//查看所有端口
netstat -ano|findstr //查看指令的端口
五、通信协议
TCP/IP协议簇:
TCP协议:用户传输协议 -----打电话:
连接、稳定
三次握手、四次挥手 [客户端client、服务端server]
客户端、服务端
传输完成释放连接
UDP协议:用户数据报协议------发短信:
不连接、不稳定
不管有没有准备好都可以发送
IP协议:网络互连协议
六、客户端服务器实现文件上传
//文件上传案例的客户端
/*
* 1、客户端:建本地字节输入流;
* 创建Socket对象,创建网络字节输出流对象OutputStream,使用fis.read读取文件,使用OutputStream.write(),上传文件
* 使用网络字节输入流,读取服务器回写的数据
* 释放资源
* 2、服务器:创建ServerSocket对象,accept获取客户端socket,使用网络字节输入流InputStream,使用read();
* 使用本地字节输出流,把读取的文件保存到本地;
* 使用网络字节输出流,回复上传成功
* 释放资源
* */
public class Upload_Client {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\1.jpg");
Socket socket = new Socket("127.0.0.1", 8888);
OutputStream os = socket.getOutputStream();
int len=0;
byte[] bytes=new byte[1024];
while((len=fis.read(bytes))!=-1){
os.write(bytes,0,len);
}
socket.shutdownOutput();//避免阻塞问题
InputStream is = socket.getInputStream();
while((len=is.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
fis.close();
socket.close();
}
}
//文件上传案例的服务器端
/*
* 1、客户端:建本地字节输入流;
* 创建Socket对象,创建网络字节输出流对象OutputStream,使用fis.read读取文件,使用OutputStream.write(),上传文件
* 使用网络字节输入流,读取服务器回写的数据
* 释放资源
* 2、服务器:创建ServerSocket对象,accept获取客户端socket,使用网络字节输入流InputStream,使用read();
* 使用本地字节输出流,把读取的文件保存到本地;
* 使用网络字节输出流,回复上传成功
* 释放资源
* */
public class Upload_Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true){//让服务器一直处于监听状态
Socket socket = serverSocket.accept();
//为了提升效率,使用多线程技术,每次accept一个就开一个线程
new Thread(new Runnable() {
@Override
public void run() {
try{
InputStream is = socket.getInputStream();
File file=new File("e:\\upload");
if(!file.exists()){
file.mkdirs();//不存在则创建
}
String fileName="itcase"+System.currentTimeMillis()+new Random().nextInt()+".jpg";
FileOutputStream fos = new FileOutputStream(file+"\\"+fileName);
int len=0;
byte[] bytes = new byte[1024];
while((len=is.read(bytes))!=-1){
fos.write(bytes,0,len);
}
socket.getOutputStream().write("上传成功!".getBytes());
fos.close();
socket.close();
}catch (IOException e){
System.out.println(e);
}
}
}).start();
}
}
}