黑马程序员--Java学习日记之GUI&网络编程

------- android培训、java培训、期待与您交流! ----------

GUI

如何创建一个窗口并显示
 Graphical User Interface(图形用户接口)。
  

        Frame  f = new Frame(“my window”);
        f.setLayout(new FlowLayout());//设置布局管理器
        f.setSize(500,400);//设置窗体大小
        f.setLocation(300,200);//设置窗体出现在屏幕的位置
        f.setIconImage(Toolkit.getDefaultToolkit().createImage("qq.png"));
        f.setVisible(true);

布局管理器
 FlowLayout(流式布局管理器)
     从左到右的顺序排列。
     Panel默认的布局管理器。
 BorderLayout(边界布局管理器)
     东,南,西,北,中
     Frame默认的布局管理器。
 GridLayout(网格布局管理器)
     规则的矩阵
 CardLayout(卡片布局管理器)
     选项卡
 GridBagLayout(网格包布局管理器)
     非规则的矩阵

窗体监听

  Frame f = new Frame("我的窗体");
    //事件源是窗体,把监听器注册到事件源上
    //事件对象传递给监听器
    f.addWindowListener(new WindowAdapter() {
              public void windowClosing(WindowEvent e) {
                         //退出虚拟机,关闭窗口
            System.exit(0);
        }
    });

适配器设计模式
 a.什么是适配器
     在使用监听器的时候, 需要定义一个类事件监听器接口.
     通常接口中有多个方法, 而程序中不一定所有的都用到, 但又必须重写, 这很繁琐.
     适配器简化了这些操作, 我们定义监听器时只要继承适配器, 然后重写需要的方法即可.
 b.适配器原理
     适配器就是一个类, 实现了监听器接口, 所有抽象方法都重写了, 但是方法全是空的.
     适配器类需要定义成抽象的,因为创建该类对象,调用空方法是没有意义的
     目的就是为了简化程序员的操作, 定义监听器时继承适配器, 只重写需要的方法就可以了.
 事件处理
     事件: 用户的一个操作
     事件源: 被操作的组件
     监听器: 一个自定义类的对象, 实现了监听器接口, 包含事件处理方法,把监听器添加在事件源上, 当事件发生的时候虚拟机就会自动调用监听器中的事件处理方法


网络编程概述
 A:计算机网络
     是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
 B:网络编程
     就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。


网络编程三要素之IP概述
 每个设备在网络中的唯一标识
 每台网络终端在网络中都有一个独立的地址,我们在网络中传输数据就是使用这个地址。 
 ipconfig:查看本机IP192.168.12.42
 ping:测试连接192.168.40.62
 本地回路地址:127.0.0.1 255.255.255.255是广播地址
 IPv4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已经用尽。 
 IPv6:8组,每组4个16进制数。
 1a2b:0000:aaaa:0000:0000:0000:aabb:1f2f
 1a2b::aaaa:0000:0000:0000:aabb:1f2f
 1a2b:0000:aaaa::aabb:1f2f
 1a2b:0000:aaaa::0000:aabb:1f2f
 1a2b:0000:aaaa:0000::aabb:1f2f

网络编程三要素之端口号概述

 每个程序在设备上的唯一标识
 每个网络程序都需要绑定一个端口号,传输数据的时候除了确定发到哪台机器上,还要明确发到哪个程序。
 端口号范围从0-65535
 编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
 常用端口
     mysql: 3306
     oracle: 1521
     web: 80
     tomcat: 8080
     QQ: 4000
     feiQ: 2425

网络编程三要素协议
 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
 UDP
     面向无连接,数据不安全,速度快。不区分客户端与服务端。
 TCP
   面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
     三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据


Socket通信原理图解
 A:Socket套接字概述:
     网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
     通信的两端都有Socket。
     网络通信其实就是Socket间的通信。
     数据在两个Socket间通过IO流传输。
     Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。

UDP传输
 1.发送Send
     创建DatagramSocket, 随机端口号
     创建DatagramPacket, 指定数据, 长度, 地址, 端口
     使用DatagramSocket发送DatagramPacket
     关闭DatagramSocket
 2.接收Receive
     创建DatagramSocket, 指定端口号
     创建DatagramPacket, 指定数组, 长度
     使用DatagramSocket接收DatagramPacket
     关闭DatagramSocket
     从DatagramPacket中获取数据
 3.接收方获取ip和端口号
     String ip = packet.getAddress().getHostAddress();
     int port = packet.getPort();


UDP传输优化


接收端Receive

DatagramSocket socket = new DatagramSocket(6666);						//创建socket相当于创建码头
		DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);		//创建packet相当于创建集装箱
		
		while(true) {
			socket.receive(packet);												//接收货物
			byte[] arr = packet.getData();
			int len = packet.getLength();
			String ip = packet.getAddress().getHostAddress();
			System.out.println(ip + ":" + new String(arr,0,len));


发送端Send


DatagramSocket socket = new DatagramSocket();		//创建socket相当于创建码头
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			String str = sc.nextLine();
			if("quit".equals(str))
				break;
			DatagramPacket packet = 							//创建packet相当于创建集装箱
					new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
			socket.send(packet);			//发货
		}
		socket.close();


UDP传输多线程


public class Demo3_MoreThread {

			/**
			 * @param args
			 */
			public static void main(String[] args) {
				new Receive().start();
				
				new Send().start();
			}
		
		}

		class Receive extends Thread {
			public void run() {
				try {
					DatagramSocket socket = new DatagramSocket(6666);					//创建socket相当于创建码头
					DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);	//创建packet相当于创建集装箱
					
					while(true) {
						socket.receive(packet);												//接收货物
						byte[] arr = packet.getData();
						int len = packet.getLength();
						String ip = packet.getAddress().getHostAddress();
						System.out.println(ip + ":" + new String(arr,0,len));
					}
				} catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}

		class Send extends Thread {
			public void run() {
				try {
					DatagramSocket socket = new DatagramSocket();		//创建socket相当于创建码头
					Scanner sc = new Scanner(System.in);
					
					while(true) {
						String str = sc.nextLine();
						if("quit".equals(str))
							break;
						DatagramPacket packet = 							//创建packet相当于创建集装箱
								new DatagramPacket(str.getBytes(), str.getBytes().length, InetAddress.getByName("127.0.0.1"), 6666);
						socket.send(packet);			//发货
					}
					socket.close();
				}  catch (IOException e) {
					
					e.printStackTrace();
				}
			}
		}

TCP协议

客户端

		Socket socket = new Socket("127.0.0.1", 9999);		//创建Socket指定ip地址和端口号
		InputStream is = socket.getInputStream();			//获取输入流
		OutputStream os = socket.getOutputStream();			//获取输出流
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		PrintStream ps = new PrintStream(os);
		
		System.out.println(br.readLine());
		ps.println("我想报名就业班");
		System.out.println(br.readLine());
		ps.println("7878");
		socket.close();

服务端


		ServerSocket server = new ServerSocket(9999);	//创建服务器
		Socket socket = server.accept();				//接受客户端的请求
		InputStream is = socket.getInputStream();		//获取输入流
		OutputStream os = socket.getOutputStream();		//获取输出流
		
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		PrintStream ps = new PrintStream(os);
		
		ps.println("欢迎咨询");
		System.out.println(br.readLine());
		ps.println("aaaaaa");
		System.out.println(br.readLine());
		server.close();
		socket.close();

服务端是多线程的


	ServerSocket server = new ServerSocket(9999);	//创建服务器
		while(true) {
			final Socket socket = server.accept();				//接受客户端的请求
			new Thread() {
				public void run() {
					try {
						BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
						PrintStream ps = new PrintStream(socket.getOutputStream());
						ps.println("欢迎咨询传智播客");
						System.out.println(br.readLine());
						ps.println("报满了,请报下一期吧");
						System.out.println(br.readLine());
						socket.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}.start();
		}
	}


你可能感兴趣的:(黑马程序员--Java学习日记之GUI&网络编程)