------- android培训、java培训、期待与您交流! ----------
网络编程概述:
网络编程是指编写与其它计算机进行通信的程序。Java已经将网络程序所需要的东西封装成不同的类。
只要创建这些类的对象,使用相应的方法,即使设计人员不具备有关的网络知识,也可以编写出高质量的网络通信程序。
1.网络模型
(1)OSI参考模型(2)TCP/IP参考模型
2.网络通讯要素
(1)IP地址(InetAddress已经封装成了对象)
1、网络中设备的标识
2、不易记忆,可用主机名
3、本地IP地址:127.0.0.1 主机名:Localhost。
(2)端口号(数字标识,没有必要封装成对象)
1、用于标识进程的逻辑地址,不同进程的标识。
2、有效端口:0~65535,其中0~1024系统使用或保留端口。
(3)传输协议
1、通讯的规则。
2、常见协议:TCP,UDP。
网络编程-IP地址
由于IP地址是一个复杂的事物,Java已经将它封装成了对象。
类 InetAddress
static InetAddress
getLocalHost()
返回本地主机。
String
getHostAddress()
返回 IP 地址字符串(以文本表现形式)。String
getHostName()
获取此 IP 地址的主机名。
static InetAddress
getByName(String host)
在给定主机名的情况下确定主机的 IP 地址。
import java.net.InetAddress; public class Test{ public static void main(String... args) throws Exception{ InetAddress i = InetAddress.getLocalHost(); String ip = i.getHostAddress(); String hostName = i.getHostName(); System.out.println("IP地址"+ip); System.out.println("主机名"+hostName); InetAddress inetAddress = InetAddress.getByName("www.baidu.com"); System.out.println(inetAddress.getHostAddress()); System.out.println(inetAddress.getHostName());
网络编程-UDP-TCP
UDP 特点:(面向无连接)
1、将数据及源和目的封装在数据包中,不需要建立连接。(封包,无连接)
2、每个数据包的大小限制在64k内。(小数据)
3、因无连接,是不可靠协议。(不可靠,丢数据)
4、不需要建立连接,速度快。(速度快)TCP 特点:(面向连接)
1、建立连接,形成传输数据的通道。(连接)
2、在连接中进行大数据量传输。(大数据)
3、通过三次捂手完成连接,是可靠协议。(可靠)
4、必须建立连接,效率会稍低。(速度慢)
网络编程-Socket(Socket也称套接字)
1、Socket就是为网络通信提供的一种机制。
2、通信的两端都有Socket。
3、网络通信其实就是Socket间的通信。
4、数据在两个Socket间通过IO传输。
网络编程-UDP传输(应用小程序 )
/*
需求:通过udp传输方式,将一段文字数据发送出去。思路:1.建立udpSocket服务。
2.提供数据,并将数据封装到数据包中。
3.通过Socket服务的发送功能,将数据包发送出去。
4.关闭资源。
*/
import java.net.InetAddress; import java.net.DatagramSocket; import java.net.DatagramPacket;
class UdpSend{ public static void main(String...args)throws Exception{ //1.创建udp服务,通过DatagramSocket对象。 DatagramSocket ds =new DatagramSocket (888); //2.确定数据,并封装成数据包。 //DatagramPacket(byte[] buf, int length, InetAddress address, int port) byte[] buf ="黑马程序员".getBytes(); DatagramPacket dp = new DatagramPacket( buf, buf.length, InetAddress.getByName("192.168.9.101"), 10000); //3.通过socket服务,将已有的数据包发送出去,通过Send方法。 ds.send(dp); //4.关闭资源。 ds.close(); } }
/* 需求: 定义一个应用程序,用于接收udp协议传输的数据并处理。 思路:1.建立udpSocket服务。 2.建立一个数据包,用于存储监听到的端口的数据。 把接收到的数据封装的数据包,就可以操作数据包对象, 使用其更多的功能对接收到的数据进行更多的操作。 3.通过Socket服务的监听功能,将接收到的数据存入到已经定义好的数据包中。 4.通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5.关闭资源。 */ class UdpRece{
public static void main(String...args) throws Exception{ //1.创建udp的Socket服务,建立端点。 DatagramSocket ds =new DatagramSocket(10000); //2.预定义数据包,用于存储接收数据。 byte[] buf =new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //3.通过服务的receive方法,将收到的数据存入到定义好的数据包中。 ds.receive(dp); //4.通过数据包中的方法获取其中的数据。 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String data = new String(dp.getData(),0,dp.getLength()); System.out.println("IP地址:"+ip+"..."+data+"...端口:"+port); //5.关闭资源。 ds.close(); } }
网络编程-TCP传输
1、Socket和ServerSocket。
2、建立客户端和服务器端。
3、建立连接后,通过Socket中的IO流进行数据的传输。
4、关闭Socket。
网络通讯——Tcp服务端客户端互动
import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.ServerSocket; /* 思路: 1.创建客户端服务。并指定需要连接的主机与端口。 2.获取客户端中的输出流,将数据写入流中。 3.获取客户端中的输入流,将服务端反馈的数据进行读取。 4.关闭资源。 */ class Cilent{ public static void main(String...args) throws Exception{ Socket s = new Socket("127.0.0.1",10000); OutputStream out = s.getOutputStream(); out.write("服务端你好".getBytes()); InputStream in = s.getInputStream(); byte[]buf =new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } } /* 思路: 1.建立服务端服务。并监听一个端口。 2.获取连接进来的客户端对象。 3.获取客户端的读取流,读取客户端流中的数据。 4.给客户端回馈一个信息,获取客户端中的输入流,将数据写入流中。 5.关闭连接进来的客户端对象。 6.关闭客户资源(必选)关闭服务端资源(可选) */ class Server{ public static void main(String...args) throws Exception{ ServerSocket ss = new ServerSocket(10000); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"...连接成功"); InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); OutputStream out = s.getOutputStream(); Thread.sleep(10000); out.write("客户端你也好".getBytes()); s.close();//必需的 ss.close();//可选 } }
网络编程——上传文本
/* 需求: 将客户端的一个文本文件上传到服务端去. 客户端: 1.建立客户端服务,并指定一个主机和端口。 2.获取客户端的输出流对象,把数据写入流中。 3.获取客户端的输入流,读取服务端的反馈信息。 4.关闭资源。 */ import java.io.BufferedReader; import java.io.PrintWriter; import java.io.InputStreamReader; import java.io.FileReader; import java.io.FileWriter; import java.net.Socket; import java.net.ServerSocket; class TextClient{ public static void main(String...args) throws Exception{ Socket s = new Socket("127.0.0.1",10000); BufferedReader bufr = new BufferedReader(new FileReader("C:\\1.txt")); PrintWriter out = new PrintWriter(s.getOutputStream(),true); String line =null; while((line=bufr.readLine())!=null){ out.println(line); } s.shutdownOutput();//原理其实就是-1 BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); String len =null; while((len=in.readLine())!=null){ System.out.println(len); } bufr.close(); s.close(); } } /* 服务端: 1.建立服务端服务,并监听一个端口。 2.获取客户端对象。 3.获取客户端输入流,将数据读取出来,并写入一个文件中,存入在D盘。 4.获取客户端的输出流,给客户端回馈点信息。 5.关闭资源。 */ class TextServer{ public static void main(String...args)throws Exception{ ServerSocket ss = new ServerSocket(10000); Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"....连接成功"); PrintWriter pw =new PrintWriter(new FileWriter("D:\\1.txt"),true); BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); String line = null; while((line=in.readLine())!=null){ pw.println(line); } PrintWriter out =new PrintWriter(s.getOutputStream(),true); out.println("上传成功"); pw.close(); s.close(); ss.close(); } }
网络编程——上传图片文件
/* 需求: 将客户端的图片文件上传到服务端去。(并考虑多个用户同时操作的情况) 客户端 1.创建客户端服务。并指定主机和端口。 2.读硬盘上的图片文件。 3.获取客户端的输出流,将图片文件写出去。 4.定义上传结束标记。 5.服务端给客户端反馈一个结果。 6.关闭流资源。关闭客户端资源。关闭服务端资源。 */ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.File; import java.net.Socket; import java.net.ServerSocket; class PicClient{ public static void main(String...args) throws Exception{ if(args.length!=1){ System.out.println("请选择一个jpg文件"); return; } File file = new File(args[0]); if(!file.getName().endsWith(".jpg")){ System.out.println("文件格式错误,不是jpg"); return ; } if(!(file.exists() && file.isFile())){ System.out.println("该文件有问题,要么不存在,要么不是文件"); return ; } if(file.length()>1024*1024*5){ System.out.println("文件过大,无法处理"); return ; } Socket s = new Socket("127.0.0.1",10000); FileInputStream fis = new FileInputStream(file); OutputStream out = s.getOutputStream(); byte[]bufout = new byte[1024]; int by = 0; while((by=fis.read(bufout))!=-1){ out.write(bufout,0,by); } s.shutdownOutput(); InputStream in = s.getInputStream(); byte[] bufin =new byte[1024]; int len = in.read(bufin); System.out.println(new String(bufin,0,len)); fis.close(); s.close(); } } /* 服务端: 1.创建服务端服务,并监听一个端口。 2.获取客户端对象。 3.获取客户端的输入流,将传输的数据存储到硬盘中。 4.存储成功则给客户端回馈上传成功,否则上传失败。 5.关闭流资源。关闭客户端资源。关闭服务端资源。 */ class PicThread implements Runnable{ private Socket s; PicThread(Socket s){ this.s=s; } public void run(){ String ip = s.getInetAddress().getHostAddress(); int count = 1; try{ System.out.println(ip+"...连接进来了"); File file = new File("D:\\Pic\\"+ip+"("+(count)+").jpg"); while(file.exists()) file = new File("D:\\Pic\\"+ip+"("+(count++)+").jpg"); FileOutputStream fos = new FileOutputStream(file);
InputStream in = s.getInputStream(); byte [] buf =new byte[1024]; int by = 0; while((by=in.read(buf))!=-1){ fos.write(buf,0,by); } OutputStream out = s.getOutputStream(); out.write("上传成功".getBytes()); fos.close(); s.close(); } catch(Exception e){ throw new RuntimeException("图片上传失败"); } } } class PicServer{ public static void main(String...args) throws Exception{ ServerSocket ss = new ServerSocket(10000); while(true){ Socket s = ss.accept(); new Thread(new PicThread(s)).start(); } } }
网络编程——域名解析