Ip地址
四个字节 每个字节最大到255
提供独一无二的IP地址
TCP
可靠,传输慢
UDP
不可靠,传输慢。QQ聊天
Socket
网络编程也叫Socket编程
端口号
计算机每个进程都有一个或多个端口
TCP Socket模型
代码实现:
半双工聊天:
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
亲测可用!
Awt在不同机器上展示效果不同
Swing相同
核心:
container比较特殊,container里面还可以放component,也可也放container。
Frame就是窗口,可直接展示出来。
Penle需要加入在Frame重才能展示出来。
布局管理器:
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); } }BorderLayout
GridLayout
GridLayout型布局管理器将空间划分成规则的矩形网格,每个单元格区 域大小相等。组件被添加到每个单元格中,先从左到右添满一行后换 行,再从上到下。 在GridLayout构造方法中指定分割的行数和列数:GridLayout(4,4)
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)); } } }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文档。