先上代码
服务器端Server:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class SeverFrame implements ActionListener{
ServerSocket server;
Socket s;
Frame mainFrame=new Frame("Sever"); //主框架
Panel p1=new Panel();
TextField tfPort=new TextField("5000",40); //端口号文本框
Button btnListen=new Button(" Listen "); //监听按钮
TextArea taMSG=new TextArea(6,50); //接收消息文本框
Panel p2=new Panel();
TextField tfSend=new TextField(50); //向客户端发送消息文本框
Button btnSend=new Button(" Send "); //发送按钮
public SeverFrame() { //无参构造函数
mainFrame.add(p1,"North");
btnListen.addActionListener(this);
p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnListen);
mainFrame.add(taMSG,"Center");
mainFrame.add(p2,"South");
btnSend.addActionListener(this);
p2.add(new Label("Server-Speak:"));p2.add(tfSend);p2.add(btnSend);
mainFrame.pack();
mainFrame.setVisible(true);
}
public static void main(String\[\] args) {
new SeverFrame();
}
class ServerRecvThread extends Thread{ //服务端接收客户端的线程
Socket s;
public ServerRecvThread(Socket s) {
this.s=s;
}
@Override
public void run() { //重写run方法
try {
InputStream is=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String hear=reader.readLine(); //读一行文本
while(!"bye".equals(hear)) {
taMSG.append("The client says:"+hear+"\\n");
hear=reader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) { //实现事件监听
try {
//获得事件源对象
Object eventSource=e.getSource();
//按下监听按钮
if(eventSource==btnListen) {
int port=Integer.parseInt(tfPort.getText()); //string类型转换为int型
server=new ServerSocket(port);
taMSG.append("ServerSocket is listening on "+port+"\\n");
s=server.accept(); //ServerSocket开始监听
taMSG.append("A client is connected!\\n");
Thread t=new ServerRecvThread(s);
t.start(); //sever线程开始
}else if(eventSource==btnSend) { //按下发送按钮,向客户端发送消息
String send=tfSend.getText();
if(send.equals(""))return;
OutputStream os=s.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os));
writer.write(send);writer.newLine();
writer.flush();
}
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
客户端Client:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
public class ClientFrame implements ActionListener{
Socket s;
Frame mainFrame=new Frame("Client"); //主框架
Panel p1=new Panel();
TextField tfIP=new TextField("127.0.0.1",15); //IP地址文本框
TextField tfPort=new TextField("5000",15); //端口号文本框
Button btnConnect=new Button(" Connect "); //连接服务器按钮
TextArea taMSG=new TextArea(6,50); //接收消息文本框
Panel p2=new Panel();
TextField tfSend=new TextField(50); //发送消息文本框
Button btnSend=new Button(" Send "); //发送消息按钮
public ClientFrame() { //无参构造函数
mainFrame.add(p1,"North");
btnConnect.addActionListener(this);
p1.add(new Label("服务器IP:"));p1.add(tfIP);
p1.add(new Label("Port:"));p1.add(tfPort);p1.add(btnConnect);
mainFrame.add(taMSG,"Center");
mainFrame.add(p2,"South");
btnSend.addActionListener(this);
p2.add(new Label("Client-Speak:"));p2.add(tfSend);p2.add(btnSend);
mainFrame.pack();
mainFrame.setVisible(true);
}
public static void main(String\[\] args) {
new ClientFrame();
}
class ClientRecvThread extends Thread{ //实现客户端接收服务器的线程
Socket s;
public ClientRecvThread(Socket s) {
this.s=s;
}
@Override
public void run() { //重写run方法
try {
InputStream is=s.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String hear=reader.readLine();
while(!"bye".equals(hear)) {
taMSG.append("The server says:"+hear+"\\n");
hear=reader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void actionPerformed(ActionEvent e) { //实现事件监听
try {
//获得事件源对象
Object eventSource=e.getSource();
if(eventSource==btnConnect) { //按下连接按钮,连接服务器
String ip=tfIP.getText();
String port=tfPort.getText();
s=new Socket(ip,Integer.parseInt(port));
taMSG.append("A server is connected!\\n");
Thread t=new ClientRecvThread(s);
t.start(); //开始client线程
}else if(eventSource==btnSend) { //按下发送按钮,向服务器发送消息
String send=tfSend.getText();
if(send.equals(""))return;
OutputStream os=s.getOutputStream();
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(os));
writer.write(send);writer.newLine();
writer.flush();
}
}
catch (IOException e1) {
e1.printStackTrace();
}
}
}
运行结果:
(一)Socket编程
1、套接字概述:
网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。端口号规定为一个16位的0~65535之间的整数,其中0~1023被预先定义的服务通信占用。
2、两个主要的类(Socket,ServerSocket):
Socket:Socket是“IP地址 + 端口号”,组合成一个Socket对象,即客户端。ServerSocket:作用是创建一个监听服务(电话接线员),即服务器端。
理解:客户(Socket)想要去邮局办理特快邮寄业务,已知办理此业务在8号窗口。到达8号窗口后,一位业务员(ServerSocket)正在等待客户办理业务。
Socket s = new Socket(“127.0.0.1”,5000);//一个客户
ServerSocket server = new ServerSocket(5000);//一个业务员
Socket sc = server.accept();//服务开始
ServerSocket对象调用accept()方法会返回一个和客户端Socket对象相连接的Socket对象sc。sc调用getOutputStream()获得一个输出流指向客户端的输入流(向客户端发消息),sc调用getInputStream()获得一个输入流指向客户端的输出流(收客户端的消息)。
ps.accept()方法会阻塞线程,直到收到客户的呼叫。
(二)AWT
AWT(Abstract Window Toolkit)是最早的sun提供的GUI库(Graphics User Interface)图形用户界面。
1、概述:
①AWTEvent: 一个抽象类,定义了AWT事件的一般模型和接口。
②Component: 是GUI元素的父类。主要方法:paint(), repaint(), setSize(), setLocation(), setEnable(),setVisible()
③Container:是GUI元素的容器。实现组件管理(add(),remove()),布局管理(setLayout())
④Graphics:在组件上进行图形绘制所使用的图形环境的父类。
⑤各种布局管理器:用来管理组件在容器中的位置。实现了LayoutManager接口。主要有:FlowLayout, BorderLayout, GridLayout等。
2、典型组件
先了解一下布局管理器
容器需要使用相应的布局管理器来管理其上面的组件的布局。一个容器如果要设置其布局管理器,需要调用其setLayout(布局管理器实例)方法。
• FlowLayout: 流式——从左到右依次按排放置,默认居中
• BorderLayout:边界式—— 提供5个区域来放置组件:North, South, East, West, Center
例 f.add(new Button(“North”) , “North”);
ps.假设Frame界面被拉伸,各个组件的位置不变,而处于Center的组件大小发生变化,其他位置的组件宽度不变。
• GridLayout:网格式——规则矩阵
• CardLayout:卡片式
组件 | 构造方法 | 使用 |
---|---|---|
Frame | Frame(String title) | 允许通过拖拉来改变窗口的位置和大小,默认使用BorderLayout,默认不可见 |
Panel(面板) | Panel() | 必须放入Window或Frame中才可见,默认使用FlowLayout |
Label(标签) | new Label("Hello") | 一般与事件无关 |
Button | new Button("Help") | 激发ActionEvent事件,使用ActionListener接口监听、处理该事件 |
TextField(单行文本) | new TextField(“name”, 10) | 在TextField处回车会激发ActionEvent事件 |
TextArea(多行文本) | new TextArea(“name”, 8,20) (8行20长度) | 在TextArea处回车表示换行,不会激发ActionEvent 事件 |
Checkbox(复选框) | ||
Choice(下拉菜单) |
3、AWT事件模型(实现交互)
Event Source(事件源):事件发生的场所,如按钮,窗口等组件。
Event(事件):一次操作。
Event Listener(事件监听器):监听事件,并对各种事件做出响应处理。
上代码:点击big,输出”四月“;点击small,输出”五月“。
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class HwGUI {
Label l1=new Label("四月");
Label l2=new Label("五月");
Frame f=new Frame();
Panel p=new Panel();
Panel q=new Panel();
Button b1=new Button("big ");
Button b2=new Button("small");
action c=new action();
//构造方法
public HwGUI() {
f.add(p,"North");
f.add(q,"Center");
f.setSize(400, 300);
b1.setSize(10, 30);
b2.setSize(10, 30);
b1.addActionListener(c); //调用”添加监听器方法“
b2.addActionListener(c);
p.add(b1);p.add(b2);
q.add(l1);q.add(l2);
f.setVisible(true);
}
public static void main(String[] args) {
new HwGUI();
}
//实现ActionListener接口,重写actionPerformed方法
class action implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
Object act=e.getSource();
if(act==b1)
System.out.println(l1.getText());
if(act==b2)
System.out.println(l2.getText());
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。