java基础学习笔记7

java基础学习笔记7

网络

Ip地址

四个字节 每个字节最大到255

提供独一无二的IP地址

TCP

可靠,传输慢

UDP

不可靠,传输慢。QQ聊天

Socket

网络编程也叫Socket编程

端口号

计算机每个进程都有一个或多个端口

TCP Socket模型

image-20201002135458506

代码实现:

半双工聊天:

talkserver

package com.ufo.nine;

import java.io.*;
import java.net.*;
import java.applet.Applet;
public class talkserver
{
	public static void main(String args[])
	{
		try
		{
			ServerSocket server = null;
			try
			{
				server = new ServerSocket(4700);
			}catch(Exception e)
			{
				System.out.println("can not listen to:" + e);
			}
			Socket socket = null;
			try
			{
				socket = server.accept();
			}catch(Exception e)
			{
				System.out.println("Error:" + e);
			}
			String line;
			BufferedReader is = new BufferedReader(new InputStreamReader(
				socket.getInputStream()));
			PrintWriter os = new PrintWriter(socket.getOutputStream());
			BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Client:" + is.readLine());
			line = sin.readLine();
			while (!line.equals("bye"))
			{
				os.println(line);
				os.flush();
				System.out.println("Server:" + line);
				System.out.println("Client:" + is.readLine());
				line = sin.readLine();
			}

			is.close();
			os.close();
			socket.close();
			server.close();
		}catch(Exception e)
		{
			System.out.println("Error" + e);
		}
	}
}

talkclient

package com.ufo.nine;

import java.io.*;
import java.net.*;
public class talkclient
{
	public static void main(String args[])
	{
		try
		{
			Socket socket = new Socket("127.0.0.1",4700);
			BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
			PrintWriter os = new PrintWriter(socket.getOutputStream());
			BufferedReader is = new BufferedReader(new InputStreamReader(
				socket.getInputStream()));
			String readline;
			readline = sin.readLine();
			while (!readline.equals("bye"))
			{
				os.println(readline);
				os.flush();
				System.out.println("Client:" + readline);
				System.out.println("Server:" + is.readLine());
				readline = sin.readLine();
			}
			os.close();
			is.close();
			socket.close();
		}catch(Exception e)
		{
			System.out.println("Error" + e);
		}
	}
}

全双工聊天:参考https://blog.csdn.net/jiahao1186/article/details/82715859

亲测可用!

单工、半双工、全双工定义

单工:
在单一的通路上端与端进行信息交流,若规定A为数据发送方,则B为数据接收方;
数据的传输是单向的,只能沿着一个方向。

半双工:
在单一的通路上端与端进行信息交流,规定在同一时间段只能一方发送一方接收,
例如:A方发送数据时,B方只能接收数据;或者B方发送数据时A方只能接收数据;
双方不能同时发送数据。
数据可以双向传递,但是同一个时段只能进行一个方向的传递。

双工:
在A方发送数据时,B方可以同时发送数据,一般需要两条通道。
通信的双方可以同时发送和接收数据。

UDP socket

关键:用DatagramPacket这个类打包数据

用DatagramSocket传输数据

TestUDPClient

package com.ufo.nine.testudp;

import java.net.*;
import java.io.*;

public class TestUDPClient {
    public static void main(String args[]) throws Exception {
        long n = 10000L;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        dos.writeLong(n);   //把需要发送的数据转成基本数据流

        byte[] buf = baos.toByteArray();   //字节数组流转为字节数组
        System.out.println(buf.length);    //打印一下长度

        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                new InetSocketAddress("127.0.0.1", 5678)
        );//通过DatagramPacket,把需要发送的数据,InetSocketAddress目标地址和端口号,装进去)
        DatagramSocket ds = new DatagramSocket(9999); //DatagramSocket设定自己的端口号
        ds.send(dp);
        ds.close();

    }
}

TestUDPServer

package com.ufo.nine.testudp;

import java.net.*;
import java.io.*;

public class TestUDPServer
{
	public static void main(String args[]) throws Exception
	{
		byte buf[] = new byte[1024];
		DatagramPacket dp = new DatagramPacket(buf, buf.length); //通过DatagramPacket初始化接受对象
		DatagramSocket ds = new DatagramSocket(5678);   //设定自己的端口号
		while(true)
		{
			ds.receive(dp);    //一直接受
			ByteArrayInputStream bais = new ByteArrayInputStream(buf);//各种转换
			DataInputStream dis = new DataInputStream(bais);//各种转换
			System.out.println(dis.readLong());//打印内容
		}
	}
}

没多大用处。

全双工udp聊天:https://blog.csdn.net/qq_35341203/article/details/90115898

亲测可用!

GUI

Awt在不同机器上展示效果不同

Swing相同

核心:

image-20201002142648861

container比较特殊,container里面还可以放component,也可也放container。

Frame就是窗口,可直接展示出来。

Penle需要加入在Frame重才能展示出来。

image-20201002143520800

布局管理器:

Awt提供了5种布局管理器类:
FlowLayagt,BorderLayout,GridLayou,CardLayout,GridBagLayout


FlowLayagt

package com.ufo.nine.gui;

import java.awt.*;

public class test2 {

    public static void main(String[] args) {
        Frame f=new Frame("此处是标题");
        Button b1=new Button("这个是button的lable");
        Button b2=new Button("这个是button的lable");
        Button b3=new Button("这个是button的lable");
        f.setLayout(new FlowLayout());
        f.add(b1);
        f.add(b2);
        f.add(b3);
        f.setSize(100,100);
        f.setVisible(true);
    }
}

image-20201002143955830

BorderLayout

image-20201002144324945

GridLayout

GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区
域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换
行,再从上到下。
在GridLayout构造方法中指定分割的行数和列数:GridLayout(4,4)

image-20201002144436803

Panel默认布局FloatLayout

Frame默认布局BordertLayout

事件模型

重点:实现Actionlistener接口,重写actionPerformed方法.

把这个类的对象放到button.addActionListener这个函数里面。

在重写的actionPerformed方法里面,会自动传入当前对象的相关信息。

ActionEvent e就是自动传入的,可以通过这个e来区分不同的元件。

例子1:基础点击事件,点击一下,打印台打印一下

package com.ufo.nine.gui;

import java.awt.*;
import java.awt.event.*;

public class TestActionEvent {
    public static void main(String args[]) {
			Frame f = new Frame("Test");
			Button b = new Button("Press Me!");
			Monitor bh = new Monitor();
			b.addActionListener(bh);
			f.add(b,BorderLayout.CENTER);
			f.pack();
			f.setVisible(true);
    }
}

class Monitor implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.out.println("a button has been pressed");    
    }
}

例子2:弄一个输入框,输入什么东西,回车,打印什么东西出来

package com.ufo.nine.gui;

import java.awt.*;
import java.awt.event.*;

public class TFActionEvent {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TFFrame();
	}

}

class TFFrame extends Frame
{
	TFFrame()
	{
		TextField tf = new TextField();
		add(tf);
		tf.addActionListener(new TFActionListener());
		pack();
		setVisible(true);
	}
}

class TFActionListener implements ActionListener
{
	public void actionPerformed(ActionEvent e)
	{
		TextField tf = (TextField)e.getSource();
		System.out.println(tf.getText());
		tf.setText("");
	}
}

TextFiled可以通过setEchoChar("*")设置回显字符,把密码变成✳展示出来。

问题:如果点击其中一个按钮,需要取获取别的元件的相关信息,怎么办?

使用内部类。内部类可以访问包装他的那个类的成员。

内部类编译后产生的class文件由包装类名$内部类名构成。

例子3:模拟计算机的加法:使用内部类。

package com.ufo.nine.gui2;

import java.awt.*;
import java.awt.event.*;

public class TFMath {
    public static void main(String[] args) {
        new TFFrame().launchFrame();
    }
}

class TFFrame extends Frame {
    TextField num1, num2, num3;

    public void launchFrame() {
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(15);
        Label lblPlus = new Label("+");
        Button btnEqual = new Button("=");
        btnEqual.addActionListener(new MyMonitor());
        setLayout(new FlowLayout());
        add(num1);
        add(lblPlus);
        add(num2);
        add(btnEqual);
        add(num3);
        pack();
        setVisible(true);
    }

    private class MyMonitor implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int n1 = Integer.parseInt(num1.getText());
            int n2 = Integer.parseInt(num2.getText());
            num3.setText("" + (n1 + n2));
        }
    }

}

image-20201002145814955

Graphics画图

关键:定义一直只Graphics画笔对象,然后调用它的函数。具体用法参考api文档。

    pack();
    setVisible(true);
}

private class MyMonitor implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        int n1 = Integer.parseInt(num1.getText());
        int n2 = Integer.parseInt(num2.getText());
        num3.setText("" + (n1 + n2));
    }
}

}

Graphics画图

关键:定义一直只Graphics画笔对象,然后调用它的函数。具体用法参考api文档。

image-20201002150116073

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值