发表于: 2018-02-24 21:59:29
1 571
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
对gui进行了更多的学习,主要见代码.
package com.gui;
import java.awt.*;
import java.awt.event.*;
/**
* @author: Arike
* @program: thread
* @description: gui的第一个程序
* @create: 2018/2/11 16:21
*/
public class test1 {
public static void main(String[] args) {
Frame f = new Frame("我的第一个gui");
f.setSize(300,300);//设置gui大小
f.setLocation(200,300);//设置初始位置
f.setIconImage(Toolkit.getDefaultToolkit().createImage("/Users/yyj/Downloads/2f273755021f142b88ddd1ddccd5bd5e.png"));//设置左上角图标,不过Mac下无效
Button b1 = new Button("按钮1");//增加按钮
b1.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("我是按钮1");
}
});//增加按钮点击监听
b1.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_SPACE){
System.out.println("按了空格");
}
}
});//增加按键监听
Button b2 = new Button("按钮2");
b2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("我是动作监听");
}
});//增加了动作监听,动作监听默认包含空格和鼠标左键单击
Button b3 = new Button("按钮3");
Button b4 = new Button("按钮4");
f.add(b1);//将按钮添加给gui
f.add(b2);
f.add(b3);
f.add(b4);
f.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});//窗口监听器,这是用来给 x 这个按钮赋予关闭功能的.
f.setLayout(new FlowLayout());//设置gui布局为流式布局
f.setVisible(true);//设置窗口可见.
}
}
基本界面如下,并没有做任何修改,都是java原生样子.
因为swing是被淘汰了的东西,所以只是大致了解了一下.后期话打算学习JAVA FX.
然后是java 网络编程.了解了socket的基本用法.(明天的话打算做一个简单的图形化聊天软件)
Socket(插座)套接字概述:
* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
* 通信的两端都有Socket。
* 网络通信其实就是Socket间的通信。
* 数据在两个Socket间通过IO流传输。
* Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port。
对UDP和TCP有了更近一步的了解.
* 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
* UDP
* 面向无连接,数据不安全,速度快。不区分客户端与服务端。
类似于发短信,不用管对方是否开机,是否存在,都可以发送出去
* TCP
* 面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
* 三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
类似于打电话,对方必须开机,必须能接收到电话,接起来之后,自己才能与他通话.
通俗点就是:
A:你瞅啥? 第一次握手
B:瞅你咋滴? 第二次握手
A:过来,我弄死你 第三次握手
下面是几个简单demo:
第一个简单发送端Send:
package com.UDP.socket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
/**
* @author: Arike
* @program: network
* @description: socket发送端
* @create: 2018/2/24 17:27
*/
public class Demo2_Send {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
DatagramSocket socket = new DatagramSocket();//新建一个插座,没有指定参数就是随机分配端口号
while (true) {
String str = sc.next();
if("exit".equals(str)){
break;
}
DatagramPacket packet = new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("localhost"),9999);//新建一个货物,以byte数组的形式进行传输,参数分别是(字节数组,数组长度,ip地址,端口号)
socket.send(packet);//发送货物
}
socket.close();//因为socket是建立在IO流上的,所以需要关流.
}
}
然后是接收端Receive.
package com.UDP.socket;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* @author: Arike
* @program: network
* @description: socket发送端
* @create: 2018/2/24 17:55
*/
public class Demo2_Receive {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);//新建接收插座,要设定端口和发送货物的端口号相同.
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//设置用以接收货物的包裹.
while (true){
socket.receive(packet);//接收货物
byte [] arr =packet.getData();//获取到货物里面的数据.此处拿出的数据是1024个字节的.有空值
int len = packet.getLength();//获取到实际数据的长度,不一定=1024
System.out.println(packet.getAddress().getHostName()+":"+packet.getPort()+":"+new String(arr,0,len));//获取到IP地址和端口号加上获取到的货物.
}
}
}
然后运行一下,另外这种方式的socket和我们的web 服务端分离有点区别,当只有一次货物发送的时候,需要先启动接收端,然后再启动发送端.
但多次发送就不用,因为socket使用UDP协议的不用区别客户端和服务端,谁先启动无所谓.
运行一下:
这是发送端:
接收端:
可以看到我们设置的货物端口9999,但是发送端口其实是52808.
然后做了一个优化,发送和接收在一个程序,这就需要使用多线程了.
package com.UDP.socket;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
/**
* @author: Arike
* @program: network
* @description: socket发送端
* @create: 2018/2/24 17:27
*/
public class Demo3_Send_Receive {
public static void main(String[] args) throws Exception {
new Thread(() -> {
Scanner sc = new Scanner(System.in);
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
while (true) {
String str = sc.next();
if("exit".equals(str)){
break;
}
DatagramPacket packet = null;
try {
packet = new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName("localhost"),9999);
} catch (UnknownHostException e) {
e.printStackTrace();
}
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
}
assert socket != null;
socket.close();
}).start();
Thread.sleep(100);
new Thread(() -> {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(9999);
} catch (SocketException e) {
e.printStackTrace();
}
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
while (true){
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
byte [] arr =packet.getData();
int len = packet.getLength();
System.out.println(packet.getAddress().getHostName()+":"+packet.getPort()+":"+new String(arr,0,len));
}
}).start();
}
}
多线程话因为异常不能抛出去,只能try catch ,所以代码感觉很多,其实就只是开启了2个线程而已.
这样就可以在一个项目中跑.
明天计划的事情:(一定要写非常细致的内容)
做一个GUI的聊天小程序.
遇到的问题:(遇到什么困难,怎么解决的)
null
收获:(通过今天的学习,学到了什么知识)
了解了,java原生的一些net上的东西,以及UDP协议.
评论