1、网络编程介绍
1.1网络编程概念
在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换
1.2网络通信三要素
ip地址
计算机在网络中的唯一标识
端口
应用程序在计算机中的唯一标识
通信协议
多个计算机之间如果想实现通信,就必须遵守一定的规则
1.3InetAddress类
1.3.1介绍
操作ip地址相关的类
1.3.2方法
InetAddress getByName(String host)
通过主机名或字符串ip地址获取ip地址对象
String getHostName()
获取此 IP 地址的主机名
String getHostAddress()
返回 IP 地址字符串
package cn.itfenghua01;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class internetAddressDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("192.168.1.66");
String name = address.getHostName();
String ip = address.getHostAddress();
System.out.println("主机名:"+name);
//主机名:192.168.1.66
System.out.println("IP地址:"+ip);
//IP地址:192.168.1.66
}
}
1.4协议分类
1.4.1UDP协议
面向无连接,不区分客户端和服务端,占用系统资源少,传输数据效率高,不安全,大小有限制(64kb)
1.4.2TCP协议
面向连接,区分客户端和服务端,占用系统资源多,传输数据效率低,安全,大小没有限制
2、UDP通信程序
2.1发送端
1.创建发送端的Socket对象
DatagramSocket ds = new DatagramSocket()
2.创建数据,并把数据打包
DatagramPacket dp = new DatagramPacket(bys,length,address,port)
3.调用DatagramSocket对象的方法发送数据
void send(DatagramPacket dp)
4.关闭发送端
void close()
package cn.itfenghua01;
import java.io.IOException;
import java.net.*;
public class sendDemo {
public static void main(String[] args) throws IOException {
//发送端
DatagramSocket ds = new DatagramSocket();
byte[] bs = "你好,Java".getBytes();
DatagramPacket dp = new DatagramPacket(bs,bs.length, InetAddress.getByName("192.168.1.66"),10086);
ds.send(dp);
ds.close();
}
}
2.2接收端
1.创建接收端的Socket对象
DatagramSocket ds = new DatagramSocket(int port)
2.创建一个数据包,用于接收数据
DatagramPacket dp = DatagramPacket(byte[] buf, int length)
3.调用DatagramSocket对象的方法接收数据
void receive(DatagramPacket dp)
如果没有发送端连接,程序会阻塞在这里
4.解析数据包,并把数据在控制台显示
byte[] getData()
将数据解析到数组中
int getLength()
获取数据的长度
5.关闭接收端
void close()
package cn.itfenghua01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receiveDemo {
public static void main(String[] args) throws IOException {
DatagramSocket ds = new DatagramSocket(12345);
while (true){
byte[] bs = new byte[1024];
DatagramPacket dp = new DatagramPacket(bs,bs.length);
ds.receive(dp);
System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
}
}
}
3、TCP通信程序
3.1客户端
3.1.1Socket
客户端套接字
3.1.2构造方法
Socket(String ip,int port)
通过指定的ip地址和端口创建客户端Socket对象
3.1.3成员方法
OutputStream getOutputStream()
获取此套接字的网络字节输出流
InputStream getInputStream()
获取此套接字的网络字节输入流
void close()
关闭此套接字
3.1.4使用步骤
1.创建客户端Socket对象,构造方法中传入ip地址和端口
2.通过Socket对象的getOutputStram方法,获取网络字节输出流对象
3.通过网络字节输出流对象的write方法,给服务器发送数据
4.通过Socket对象的getInputStream获取网络字节输入流对象
5.通过网络字节输入流对象的read方法,读取服务器写回的数据
6.关流,释放资源(Socket)
3.1.4注意事项
1.必须先开服务器端,在开客户端
2.传输数据使用的流必须是通过Socket对象获取的,不能是自己手动创建的
package com.itfenghua01;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.13.66", 10086);
OutputStream os = s.getOutputStream();
os.write("来了啊,老弟".getBytes());
//读取服务器写回数据
InputStream is = s.getInputStream();
byte[] bs = new byte[1024];
int read = is.read(bs);
System.out.println("服务器写回数据:" + new String(bs, 0, read));
os.close();
is.close();
}
}
3.2服务端
3.2.1ServerSocket
服务器端套接字
3.2.2构造方法
ServerSocket(int port)
通过指定的端口创建服务端ServerSocket对象
3.2.3成员方法
Socket accept()
监听并接受此套接字的连接
void close()
关闭此套接字
3.2.4使用步骤
1.创建服务端ServerSocket对象,构造方法中传入指定的端口
2.通过ServerSocket对象的accept方法,获取客户端Socket对象
3.通过Socket对象的getInputStream方法,获取网络字节输入流对象
4.通过网络字节输入流对象的read方法,读取客户端发送的数据
5.通过Socket对象的getOutputStream方法,获取网络字节输出流对象
6.通过网络字节输出流对象的write方法,给客户端回写数据
7.关流,释放资源(Socket)
3.2.5注意事项
服务端的accept方法是阻塞方法,没有客户端连接时,程序会阻塞在这里
package com.itfenghua01;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class receiveDemo {
public static void main(String[] args) throws IOException {
while (true) {
DatagramSocket ds = new DatagramSocket(10086);
byte[] bs = new byte[1024];
DatagramPacket dp = new DatagramPacket(bs, bs.length);
ds.receive(dp);
System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));
// ds.close();
}}
}
4、TCP文件上传
4.1客户端
1.创建本地字节(字符)输入流对象,构造方法中传入要上传的文件的路径
2.创建客户端Socket对象,构造方法中传入ip地址和端口
3.通过Socket对象的getOutputStream方法,获取网络字节输出流对象
4.通过本地字节输入流对象的read方法,读取要上传的文件
5.通过网络字节输出流对象的write方法,将文件发送到服务器端
6.通过Socket对象的getInputStream方法,获取网络字节输入流对象
7.通过网络字节输入流对象的read方法,读取服务器写回的数据
8.关流,释放资源(Socket,本地字节输入流)
4.2服务端
1.创建服务端ServerSocket对象,构造方法中传入端口
2.通过ServerSocket对象的accept方法,获取客户端Socket对象
3.创建本地字节(字符)输出流对象,构造方法中传入要写入的本地文件路径
5.通过Socket对象的getInputStream方法,获取网络字节输入流对象
6.通过网络字节输入流对象的read方法,读取客户端上传的文件
7.通过本地字节输出流对象的write方法,将文件写入到本地
8.通过Socket对象的getOutputStream方法,获取网络字节输出流对象
9.通过网络字节输出流对象的write方法,给客户端回写数据
10.关流,释放资源(Socket,本地字节输出流)
4.3注意事项
客户端上传文件完成后,要调用shutdownOutput方法,通知服务器上传完成