网络编程
网络编程概述
一:网络编程中有两个主要的问题
1.如何准确的定位网络上一台或多台主机,定位主机上特定的应用
2.找到主机后如何进行高效的数据传输
二:网路编程中的两个要素
对应问题一:IP和端口号
对应问题二:提供网络通信协议,TCP/IP参考模型
三:通信要素——IP和端口号
Java中,使用InetAddress类代表IP
使用InetAddress类代表IP
public static void main(String[] args) throws UnknownHostException {
//通过静态方法返回InetAddress实例对象,参数可为IP地址,或者域名
InetAddress inet1 = InetAddress.getByName("192.168.21.52");
System.out.println(inet1);
InetAddress inet2 = InetAddress.getByName("www.starryhk.cn");
System.out.println(inet2);
System.out.println(InetAddress.getLocalHost());
}
端口分类
公认端口:0~1023 被预定义服务通信占用的端口
注册端口:1024~49151 分配给用户或应用程序
动态/私有端口:49152~65535
端口号和IP地址的组合得出一个网络套接字Socket
TCP网络编程
案例1:客户端发送数据,服务器接收数据
//客户端
public void client() throws IOException {
//设置IP
InetAddress inet = InetAddress.getByName("127.0.0.1");
//封装Socket,设置端口号
Socket socket = new Socket(inet,25121);
//定义输出流
OutputStream os = socket.getOutputStream();
//写数据
os.write("我是客户端".getBytes());
os.close();
socket.close();
}
//服务端
public void server() throws IOException {
//定义服务器端Socket,设置相同的端口
ServerSocket ss = new ServerSocket(25121);
//接受客户端的socket
Socket socket = ss.accept();
//设置输入流
InputStream is = socket.getInputStream();
//防止乱码,读取数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[20];
int len;
while((len = is.read(buffer))!=-1){
baos.write(buffer,0,len);
}
//输出数据
System.out.println(baos.toString());
//获取客户端的地址
System.out.println(socket.getInetAddress().getHostAddress());
//关闭所有资源
....
}
案例二:客户端发送文件,服务器保存文件到本地
public void client() throws IOException {
Socket socket = new Socket("127.0.0.1",3344);
//获取输出流
OutputStream os = socket.getOutputStream();
//定义输入流,因为需要传文件,得读
FileInputStream fr = new FileInputStream("ceshi.txt");
byte[] buffer = new byte[20];
int len;
while((len = fr.read(buffer)) !=-1){
//写入
os.write(buffer,0,len);
}
//关闭资源省略
}
ServerSocket serverSocket = new ServerSocket(3344);
Socket accept = serverSocket.accept();
InputStream is = accept.getInputStream();
//定义输出流,因为要保存在本地
FileOutputStream fos = new FileOutputStream("t.txt");
byte[] buffer = new byte[20];
int len;
while((len = is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//关闭资源省略
}
案例三:客户端发送文件,服务器保存文件到本地并提示客户端接收成功
public void client() throws IOException {
Socket socket = new Socket("127.0.0.1",3344);
//获取输出流
OutputStream os = socket.getOutputStream();
//定义输入流,因为需要传文件,得读
FileInputStream fr = new FileInputStream("ceshi.txt");
byte[] buffer = new byte[20];
int len;
while((len = fr.read(buffer)) !=-1){
//写入
os.write(buffer,0,len);
}
//传输完数据,必须关闭掉,否则服务器端就会阻塞
socket.shutdownOutput();
//------------------接受来自服务器端的反馈-----------------
InputStream inputStream = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffere = new byte[20];
int len1;
while((len1 = inputStream.read(buffere))!=-1){
baos.write(buffere,0,len1);
}
System.out.println(baos.toString());
//关闭资源
}
public void server() throws IOException {
ServerSocket serverSocket = new ServerSocket(3344);
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
//定义输出流,因为要保存在本地
FileOutputStream fos = new FileOutputStream("t.txt");
byte[] buffer = new byte[20];
int len;
while((len = is.read(buffer))!=-1){
fos.write(buffer,0,len);
}
//--------------服务器端给予客户端返回--------------
OutputStream os = socket.getOutputStream();
os.write("接受成功".getBytes());
//关闭资源
}
UDP网络编程
DatagramSocket
DatagramPacket:用于存储UDP数据
public void sender() throws IOException {
//定义UDPsocket
DatagramSocket socket = new DatagramSocket();
String str = "UDP方式发送";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getByName("127.0.0.1");
//定义需要发送的数据
DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,5555);
//发送数据
socket.send(packet);
socket.close();
}
public void receiver() throws IOException {
DatagramSocket socket = new DatagramSocket(5555);
byte[] buf = new byte[100];
//定义接受的数据
DatagramPacket packet = new DatagramPacket(buf,0,buf.length);
//接受
socket.receive(packet);
//输出
System.out.println(new String(packet.getData(),0,packet.getLength()));
socket.close();
}
URL类
public static void main(String[] args) throws MalformedURLException {
URL url = new URL("https://www.baidu.com");
System.out.println(url.getProtocol());//获取协议名
System.out.println(url.getHost());//主机名
System.out.println(url.getPort());//端口号
System.out.println(url.getPath());//文件路径
System.out.println(url.getFile());//文件名
System.out.println(url.getQuery());//查询名
}
资源URL连接获取资源
URL url = new URL("URL地址");
//打开连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
//连接
connection.connect();
//获取到输入流
InputStream inputStream = connection.getInputStream();
//然后通过流机进行传输,进行下载