Java学习图形界面+网络编程案例---------网络简易通讯
主要思想:
主类继承JPanel,在构造方法中将JFrame设成空布局;在其中适当位置添加组件;实现事件监听处理
DATE:2015-10-31
服务器端代码:
/**
* @author Oyc
* 功能:网络简易测试的服务器端
*
*
*/
package com.NETtestServer;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class ServerDemo extends JPanel implements ActionListener{
public static void main(String[] args) {
// TODO Auto-generated method stub
new ServerDemo();
}
//定义组件
JFrame jf;
JTextField SendJTF;
JButton SendJB;
JTextArea jta=null;
JScrollPane jsp=null;
PrintWriter pw;
public ServerDemo(){
this.setLayout(null);
//创建组件
jta=new JTextArea();
jsp=new JScrollPane(jta);
jsp.setBounds(0,50,650,210);
this.add(jsp); SendJTF=new JTextField(15);
SendJTF.addActionListener(this);
SendJTF.setBackground(Color.lightGray);
SendJTF.setBounds(0,250,650,120);
this.add(SendJTF);
//发送按钮
SendJB=new JButton("发送");
SendJB.setBounds(540,380,80,25);
SendJB.addActionListener(this);
this.add(SendJB); jf=new JFrame("QQ简易聊天 服务器");
jf.setBounds(400, 100, 660, 445);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(this);
jf.setVisible(true);
jf.setResizable(false);
//开启监听
try {
//在9988号端口监听
ServerSocket ss=new ServerSocket(9988);
//等待客户端连接
Socket s=ss.accept();
// 接受从客户端发来的信息
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
//发送准备
pw=new PrintWriter(s.getOutputStream(),true);
while(true){
//读入从客户端发来的信息
String infoClient=br.readLine();
jta.append("客户端:"+infoClient+"\n");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
//设置背景
protected void paintComponent(Graphics g)
{
try {
BufferedImage Background=ImageIO.read(new File("images/QQCHAT.jpg"));
g.drawImage(Background, 0, 0,654, 414,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
//事件监听处理方法
public void actionPerformed(ActionEvent e) {
//发送按钮
if(e.getSource()==SendJB){
String info=SendJTF.getText();
pw.println(info);
SendJTF.setText("");
jta.append("发送:"+info+"\n");
}
}
}
客户端代码:
/**
* /**
* @author Oyc
* 功能:网络简易测试的客户端
*
*/ package com.NETtestClient;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket; import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField; public class ClientDemo extends JPanel implements ActionListener{
public static void main(String[] args) {
// TODO Auto-generated method stub
new ClientDemo(); }
//定义组件
JFrame jf;
JTextField SendJTF;
JButton SendJB;
JTextArea jta=null;
JScrollPane jsp=null;
PrintWriter pw;
public ClientDemo(){ this.setLayout(null);
//创建组件
jta=new JTextArea();
jsp=new JScrollPane(jta);
jsp.setBounds(0,50,650,210);
this.add(jsp); SendJTF=new JTextField(15);
SendJTF.addActionListener(this);
SendJTF.setBackground(Color.lightGray);
SendJTF.setBounds(0,250,650,120);
this.add(SendJTF); //发送按钮
SendJB=new JButton("发送");
SendJB.setBounds(536,378,100,25);
SendJB.addActionListener(this);
this.add(SendJB);
jf=new JFrame("QQ简易聊天 客户端");
jf.setBounds(400, 100, 660, 445);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.add(this);
jf.setVisible(true);
jf.setResizable(false); //连接服务器
try {
Socket s=new Socket("127.0.0.1",9988 );
//接受从服务器发来的消息
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
//发送准备
pw=new PrintWriter(s.getOutputStream(),true);
while(true){
//接收服务器的消息
String infoServer=br.readLine();
jta.append("服务器:"+infoServer+"\n");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} //设置背景
protected void paintComponent(Graphics g)
{
try {
BufferedImage Background=ImageIO.read(new File("images/QQCHAT.jpg"));
g.drawImage(Background, 0, 0,654, 414,null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} @Override
//事件监听处理方法
public void actionPerformed(ActionEvent e) {
if(e.getSource()==SendJB){
String info=SendJTF.getText();
pw.println(info);
SendJTF.setText("");
jta.append("发送:"+info+"\n"); }
}
}
运行截图:



Java学习图形界面+网络编程案例---------网络简易通讯的更多相关文章
- Java 学习之网络编程案例
网络编程案例 一,概念 1,网络编程不等于网站编程 2,编程只和传输层打交道,即TCP和UDP两个协议 二,案例 1,TCP实现点对点的聊天 Server端:两个输入流:读客户端和控制台,一个输出端: ...
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成 ...
- Java学习之AWT GUI编程
Java学习之AWT GUI编程 0x00 前言 既然前面提到了要重写冰蝎和一些反序列化工具,当然就不能随便说说而已.在编写这些工具还是要使用图形化工具来的方便一些,所以提前把GUI的框架给学习一遍. ...
- Java学习之Swing Gui编程
Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...
- 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分
老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分 老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- Java的图形界面依然是跨平台的
Awt:抽象窗口工具箱,它由三部分组成: ①组件:界面元素: ②容器:装载组件的容器(例如窗体): ③布局管理器:负责决定容器中组件的摆放位置. 图形界面的应用分四步: ① 选择一个容器: ⑴wind ...
- Java Swing 图形界面开发(目录)
Java Swing 图形界面开发(目录) 2017年05月30日 23:50:42 阅读数:5228 本文链接: http://blog.csdn.net/xietansheng/article/d ...
- Java Swing图形界面开发
本文转自xietansheng的CSDN博客内容,这是自己见过的最通俗易懂.最适合快速上手做Java GUI开发的教程了,这里整合一下作为自己以后复习的笔记: 原文地址:https://blog.cs ...
随机推荐
- ngix_http_stub_status_module
1.ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的,所以在编译 Ngin ...
- 数据库 --> 5种关系型数据库比较
5种关系系数据库比较 目前,商品化的数据库管理系统以关系型数据库为主导产品,技术比较成熟.面向对象的数据库管理系统虽然技术先进,数据库易于开发.维护,但尚未有成熟的产品.国际国内的主导关系型数据库管理 ...
- RxJS -- Subscription
Subscription是什么? 当subscribe一个observable的时候, 返回的就是一个subscription. 它是一个一次性对象(disposable), 它有一个非常重要的方法 ...
- Spring Boot + Freemarker多语言国际化的实现
最近在写一些Web的东西,技术上采用了Spring Boot + Bootstrap + jQuery + Freemarker.过程中查了大量的资料,也感受到了前端技术的分裂,每种东西都有N种实现, ...
- 【MySql系列】MySql踩坑系列
问题一:远程登录报错Host '192.168.181.201' is not allowed to connect to this MySQL server 解决: 问题二:MySql access ...
- 实验四Java Android简易开发
实验准备 Android Studio下载 Android Studio安装 实验内容 Android Stuidio的安装测试 Android Stuidio的安装测试: 参考<Java和An ...
- 张旭升20162329 2006-2007-2 《Java程序设计》第一周学习总结
20162329 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 通过打书上的代码熟悉了Java编程的基本过程 教材学习中的问题和解决过程 1.因为我的虚拟机 ...
- 201621123057 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 答 ...
- nyoj 开方数
开方数 时间限制:500 ms | 内存限制:65535 KB 难度:3 描述 现在给你两个数 n 和 p ,让你求出 p 的开 n 次方. 输入 每组数据包含两个数n和p.当n和p都为0 ...
- JAVA_SE基础——18.方法的递归
方法的递归是指在一个方法的内部调用自身的过程,递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用,接下来用一个最简单的例子来体现下方法递归,使用递归算法计算自然数之和: public ...