java网络编程
1. 网络编程概述
网络编程中有两个主要的问题:
- 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
- 找到主机后如何可靠高效地进行数据传输
2. 网络通信要素概述
网络编程中的两个要素:
- 对应问题一:IP和端口号
- 对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)
3. 通信要素1:IP和端口号
IP:唯一的标识 Internet 上的计算机(通信实体)
在Java中使用InetAddress类代表IP
IP分类:IPv4 和 IPv6 ; 公网地址(万维网使用)和私有地址(局域网使用)。192.168. 开头的就是私有址址,范围即为192.168.0.0—192.168.255.255,专门为组织机 构内部使用
域名: www.baidu.com www.mi.com www.sina.com www.jd.com www.vip.com
本地回路地址:127.0.0.1 对应着:localhost
如何实例化InetAddress:两个方法:getByName(String host) 、 getLocalHost()
两个常用方法:getHostName() / getHostAddress()public class InetAddressTest {public static void main(String[] args) {try {//File file = new File("hello.txt");InetAddress inet1 = InetAddress.getByName("192.168.10.14");System.out.println(inet1);InetAddress inet2 = InetAddress.getByName("www.atguigu.com");System.out.println(inet2);InetAddress inet3 = InetAddress.getByName("127.0.0.1");System.out.println(inet3);//获取本地ipInetAddress inet4 = InetAddress.getLocalHost();System.out.println(inet4);//getHostName()System.out.println(inet2.getHostName());//getHostAddress()System.out.println(inet2.getHostAddress());} catch (UnknownHostException e) {e.printStackTrace();}}}
端口号:标识正在计算机上运行的进程(程序)
- 要求:不同的进程有不同的端口号
- 范围:被规定为一个 16 位的整数 0~65535。
- 端口号与IP地址的组合得出一个网络套接字:Socket
4. 通信要素2:网络协议
5. TCP网络编程
例题1:客户端发送内容给服务端,服务端将内容打印到控制台上。
/*** 实现TCP的网络编程* 例子1:客户端发送信息给服务端,服务端将数据显示在控制台上** @author shkstart* @create 2019 下午 3:30*/public class TCPTest1 {//客户端@Testpublic void client() {Socket socket = null;OutputStream os = null;try {//1.创建Socket对象,指明服务器端的ip和端口号InetAddress inet = InetAddress.getByName("192.168.14.100");socket = new Socket(inet,8899);//2.获取一个输出流,用于输出数据os = socket.getOutputStream();//3.写出数据的操作os.write("你好,我是客户端mm".getBytes());} catch (IOException e) {e.printStackTrace();} finally {//4.资源的关闭if(os != null){try {os.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}//服务端@Testpublic void server() {ServerSocket ss = null;Socket socket = null;InputStream is = null;ByteArrayOutputStream baos = null;try {//1.创建服务器端的ServerSocket,指明自己的端口号ss = new ServerSocket(8899);//2.调用accept()表示接收来自于客户端的socketsocket = ss.accept();//3.获取输入流is = socket.getInputStream();//不建议这样写,可能会有乱码// byte[] buffer = new byte[1024];// int len;// while((len = is.read(buffer)) != -1){// String str = new String(buffer,0,len);// System.out.print(str);// }//4.读取输入流中的数据baos = new ByteArrayOutputStream();byte[] buffer = new byte[5];int len;while((len = is.read(buffer)) != -1){baos.write(buffer,0,len);}System.out.println(baos.toString());System.out.println("收到了来自于:" + socket.getInetAddress().getHostAddress() + "的数据");} catch (IOException e) {e.printStackTrace();} finally {if(baos != null){//5.关闭资源try {baos.close();} catch (IOException e) {e.printStackTrace();}}if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}if(ss != null){try {ss.close();} catch (IOException e) {e.printStackTrace();}}}}}
例题2:客户端发送文件给服务端,服务端将文件保存在本地。
/**** 实现TCP的网络编程* 例题2:客户端发送文件给服务端,服务端将文件保存在本地。** @author shkstart* @create 2019 下午 3:53*/public class TCPTest2 {/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void client() throws IOException {//1.Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);//2.OutputStream os = socket.getOutputStream();//3.FileInputStream fis = new FileInputStream(new File("beauty.jpg"));//4.byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){os.write(buffer,0,len);}//5.fis.close();os.close();socket.close();}/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void server() throws IOException {//1.ServerSocket ss = new ServerSocket(9090);//2.Socket socket = ss.accept();//3.InputStream is = socket.getInputStream();//4.FileOutputStream fos = new FileOutputStream(new File("beauty1.jpg"));//5.byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}//6.fos.close();is.close();socket.close();ss.close();}}
例题3:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给 客户端。并关闭相应的连接。
/*** 实现TCP的网络编程* 例题3:从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端。* 并关闭相应的连接。* @author shkstart* @create 2019 下午 4:13*/public class TCPTest3 {/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void client() throws IOException {//1.Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);//2.OutputStream os = socket.getOutputStream();//3.FileInputStream fis = new FileInputStream(new File("beauty.jpg"));//4.byte[] buffer = new byte[1024];int len;while((len = fis.read(buffer)) != -1){os.write(buffer,0,len);}//关闭数据的输出socket.shutdownOutput();//5.接收来自于服务器端的数据,并显示到控制台上InputStream is = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] bufferr = new byte[20];int len1;while((len1 = is.read(buffer)) != -1){baos.write(buffer,0,len1);}System.out.println(baos.toString());//6.fis.close();os.close();socket.close();baos.close();}/*这里涉及到的异常,应该使用try-catch-finally处理*/@Testpublic void server() throws IOException {//1.ServerSocket ss = new ServerSocket(9090);//2.Socket socket = ss.accept();//3.InputStream is = socket.getInputStream();//4.FileOutputStream fos = new FileOutputStream(new File("beauty2.jpg"));//5.byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}System.out.println("图片传输完成");//6.服务器端给予客户端反馈OutputStream os = socket.getOutputStream();os.write("你好,美女,照片我已收到,非常漂亮!".getBytes());//7.fos.close();is.close();socket.close();ss.close();os.close();}}
6. UDP网络编程
/*** UDP协议的网络编程* @author shkstart* @create 2019 下午 4:34*/public class UDPTest {//发送端@Testpublic void sender() throws IOException {DatagramSocket socket = new DatagramSocket();String str = "我是UDP方式发送的导弹";byte[] data = str.getBytes();InetAddress inet = InetAddress.getLocalHost();DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);socket.send(packet);socket.close();}//接收端@Testpublic void receiver() throws IOException {DatagramSocket socket = new DatagramSocket(9090);byte[] buffer = new byte[100];DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);socket.receive(packet);System.out.println(new String(packet.getData(),0,packet.getLength()));socket.close();}}
7. URL编程
URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一 资源的地址。它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。
/*** URL网络编程* 1.URL:统一资源定位符,对应着互联网的某一资源地址* 2.格式:* http://localhost:8080/examples/beauty.jpg?username=Tom* 协议 主机名 端口号 资源地址 参数列表** @author shkstart* @create 2019 下午 4:47*/public class URLTest {public static void main(String[] args) {try {URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom");// public String getProtocol( ) 获取该URL的协议名System.out.println(url.getProtocol());// public String getHost( ) 获取该URL的主机名System.out.println(url.getHost());// public String getPort( ) 获取该URL的端口号System.out.println(url.getPort());// public String getPath( ) 获取该URL的文件路径System.out.println(url.getPath());// public String getFile( ) 获取该URL的文件名System.out.println(url.getFile());// public String getQuery( ) 获取该URL的查询名System.out.println(url.getQuery());} catch (MalformedURLException e) {e.printStackTrace();}}}
public class URLTest1 {public static void main(String[] args) {HttpURLConnection urlConnection = null;InputStream is = null;FileOutputStream fos = null;try {URL url = new URL("http://localhost:8080/examples/beauty.jpg");urlConnection = (HttpURLConnection) url.openConnection();urlConnection.connect();is = urlConnection.getInputStream();fos = new FileOutputStream("day10\\beauty3.jpg");byte[] buffer = new byte[1024];int len;while((len = is.read(buffer)) != -1){fos.write(buffer,0,len);}System.out.println("下载完成");} catch (IOException e) {e.printStackTrace();} finally {//关闭资源if(is != null){try {is.close();} catch (IOException e) {e.printStackTrace();}}if(fos != null){try {fos.close();} catch (IOException e) {e.printStackTrace();}}if(urlConnection != null){urlConnection.disconnect();}}}}
