【常用API】之Socket编程
网络编程的 URL对象:
URL对象,用于读取互联网指定路径响应返回客户端的所有的字符串内容。(网页内容)
如果读取是网页,就是开发浏览器,或者互联网数据爬虫。
如果读取的是一个xml,那么就是企业合作之间的数据交互。
【互联网的概念,服务器的概念,各种协议的概念等,好好复习前端课程】
实例化url对象: URL url = new URL("http://网址");
使用对象中的各种方法。
读取内容:
基础流: InputStream
基础读取流: InputStreamReader
缓冲流: BufferedReader
获取到的是服务器响应会发客户端浏览器的内容,
但是如果是由 脚本生成的内容,获取不到的,VUE类型的。
实例
package com.xzm.网络编程URL; import java.net.MalformedURLException; //导入java中负责网络编程的包文件 import java.net.URL; //导入java中负责IO操作的包文件 import java.io.*; public class 读取网络信息 { public static void main(String[] args) { try { //创建网络对象URL URL u = new URL("https://www.sina.com.cn/"); //提取各种信息 System.out.println("域名:"+ u.getHost() ); System.out.println("路径:"+ u.getPath() ); System.out.println("端口:"+ u.getPort() ); //======================================== //【读取内容,变成字符串信息】 try { //第一步:基于url对象,获取返回出来的一个基础流 // 强制异常:网址打不开 InputStream is = u.openStream(); //第二步:基于基础流,创建一个读取操作,指定编码 InputStreamReader isr = new InputStreamReader(is, "utf-8"); //第三步:创建高层缓冲字符输入流 // 把信息先全部读取到缓冲,然后再操作。 BufferedReader br = new BufferedReader(isr); //一行行读取 //代码结合的方式 // while中,执行了变量赋值,提供括号先执行 // 然后再进行 关系判断 int i=1;//行号 String line; while((line=br.readLine()) != null) { System.out.println(i +": "+ line); i++; } //关闭结束 br.close(); isr.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); } } }
Socket 互联网-通讯-编程:
互联网应用程序分两类架构:
C/S模型:庞客户端模型 【客户端】====【服务器】
对客户端要求高,不易于版本控制。
服务器端压力很小。
客户端与服务器共同承担运算。
B/S模型:总服务器端模型 【浏览器】====【服务器】
客户端只需要很少的资源就可以。
所有的压力,全部基于服务器。
几乎所有的运算都由服务器处理。
【由于这个问题,如今前端项目,都是将脚本,css单独获取发送客户端】
【利用框架VUE,通过接口请求服务器。】
服务端:
package com.xzm.通讯编程Socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { /** * 【服务器端】 */ public static void main(String[] args) { try { //创建一个服务器端的 通讯对象,同时指定监听的端口 //端口号是一个数值 ServerSocket ss = new ServerSocket(8888); System.out.println("服务器已运行:"); //由于不知道会有多少用户连接 //使用while无限循环-->服务器运行之后,不关闭 while(true) { //创建一个基本的socket对象,它是需要与客户端对应挂钩的 //不能实例化,他是客户端的 //调用服务器端Socket的accept阻塞方法 //这个方法会阻塞线程,一旦有客户端链接 //就返回客户端 Socket sk = ss.accept(); System.out.println("有一个链接"); } } catch (IOException e) { e.printStackTrace(); } } }
客户端
package com.xzm.通讯编程Socket; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class Client { /** * 【客户端】 * @param args */ public static void main(String[] args) { try { //创建普通的通讯对象 //(IP地址,端口) Socket sk = new Socket("127.0.0.1", 8888); } catch (Exception e) { System.out.println("服务器无响应!"); } } }
窗体(图形化)编程
package com.xzm.窗体编程; //导入需要的包 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class Test { public static void main(String[] args) { // GUI图形化界面编程: //包:java.awt.*; javax.swing.*; //窗体类: JFrame //设置窗体的默认样式: true=java,false=系统 JFrame.setDefaultLookAndFeelDecorated(false); //创建一个窗体 JFrame jf = new JFrame(); //设置 jf.setTitle("我的第一个软件"); jf.setLayout(null);//默认布局==null jf.setBounds(100,100,500,500);//显示的位置与大小(x轴,y轴,宽度,高度) //设置关闭按钮-结束进程 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //多行文本框 JTextArea jta = new JTextArea(); jta.setBounds(5,5,480,300); jta.setLineWrap(true);//支持多行 jf.add(jta);//加入到窗体中 //文本框 JTextField jtf = new JTextField(); jtf.setBounds(5, 310, 450, 30); jf.add(jtf); //按钮 JButton btn = new JButton("发送"); btn.setBounds(5, 350, 100, 30); //注册事件 btn.addActionListener(new fasong()); jf.add(btn); //最后-设置显示 jf.setVisible(true); } } //自定义类,实现触发响应事件 class fasong implements ActionListener{ @Override public void actionPerformed(ActionEvent arg0) { //弹出窗口 JOptionPane.showMessageDialog(null, "测试成功!"); } }
唯一可以不劳而获的是贫穷,而唯一可以无中生有的是梦想。