java网络程序设计论文_Java(3)基于GUI的网络编程 - SegmentFault 思否

先上代码

服务器端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();

}

}

}

运行结果:

6785cb311e2a94bcb087bd5dec37efd3.png

22077f391924d11c7661cf3db6990287.png

(一)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等。

e29904a27efa857e40f7dd74963f0560.png

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());

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值