主要思想:

主类继承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学习图形界面+网络编程案例---------网络简易通讯的更多相关文章

  1. Java 学习之网络编程案例

    网络编程案例 一,概念 1,网络编程不等于网站编程 2,编程只和传输层打交道,即TCP和UDP两个协议 二,案例 1,TCP实现点对点的聊天 Server端:两个输入流:读客户端和控制台,一个输出端: ...

  2. Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解

    我们编写程序就是为了方便用户使用, 我觉得UI设计的核心就是简洁, 操作过于繁琐的程序让很大一部分用户敬而远之. 即使功能强大, 但是人们更愿意使用易于操作的软件. 近年流行起来的操作手势和逐渐趋于成 ...

  3. Java学习之AWT GUI编程

    Java学习之AWT GUI编程 0x00 前言 既然前面提到了要重写冰蝎和一些反序列化工具,当然就不能随便说说而已.在编写这些工具还是要使用图形化工具来的方便一些,所以提前把GUI的框架给学习一遍. ...

  4. Java学习之Swing Gui编程

    Java学习之Swing Gui编程 0x00 前言 前面的使用的Gui是基于Awt 去进行实现,但是在现实写Gui中 AWT实际运用会比较少. 0x01 Swing 概述 AWT 和Swing 区别 ...

  5. 老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分

    老师的blog整理 .网络编程部分 .网络编程部分 前端部分 django基础部分   老师的blog整理 python基础部分: 宝哥blog: https://www.cnblogs.com/gu ...

  6. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  7. Java的图形界面依然是跨平台的

    Awt:抽象窗口工具箱,它由三部分组成: ①组件:界面元素: ②容器:装载组件的容器(例如窗体): ③布局管理器:负责决定容器中组件的摆放位置. 图形界面的应用分四步: ① 选择一个容器: ⑴wind ...

  8. Java Swing 图形界面开发(目录)

    Java Swing 图形界面开发(目录) 2017年05月30日 23:50:42 阅读数:5228 本文链接: http://blog.csdn.net/xietansheng/article/d ...

  9. Java Swing图形界面开发

    本文转自xietansheng的CSDN博客内容,这是自己见过的最通俗易懂.最适合快速上手做Java GUI开发的教程了,这里整合一下作为自己以后复习的笔记: 原文地址:https://blog.cs ...

随机推荐

  1. WebAPI问题追踪日志记录过滤器

    公司项目比较坑爹,毕竟涉及到前后端分离.多部门协作,很多时候系统出问题,哪怕已经很清楚了,协作方依然要我们把API调用入参.响应等记录下来,而且是全记录,不光是异常调用,待调查结束后这些日志又需要卸下 ...

  2. WEB 表格测试点

    Web页面的表格测试点: 1.表格列名 2.表格翻页.表格跳转到多少页.最后一页.首页 3.表格每页显示的数据, 数据的排序 4.表格无数据 5.表格支持的最大数据量 6.表格中数据内容超长时,显示是 ...

  3. 小细节,大用途,35 个 Java 代码性能优化总结!

    前言: 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用 ...

  4. 转)sqlite 数据类型

    一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断.SQLite具有以下五种数据类型: 1.NULL:空值. 2.INTEGER:带符号的整型,具体取决有存入数 ...

  5. mac上Pycharm个性化快捷键,类似Myeclipse的快速复制等快捷键

    好几天没写博客了,在win10下写了几天python,然后下了pycharm使用,发现还可以,但是太笨重了,切回了mac,然后装了pycharm社区版本. 但是这个使用太别扭了,没有myeclipse ...

  6. 基于python的接口自动化测试+ddt数据驱动

    在测试接口时,一个接口会先写好测试用例,这个用例主要针对功能,传入参时考虑到各种场景,正常的,异常的,如:参数缺省,参数传一个六位数字写用例时考虑边界情况等. 一个接口设计用例时有可能会十几条到几十条 ...

  7. Linux下的指令:tail

    tail指令常用来查看服务器中的日志信息. 有的时候,需要实时获取日志信息. 比如,我们向服务器发送了一个请求,此时日志有更新,而我们又想实时看到尾部更新的内容. 这时候可以使用指令: tail -f ...

  8. supervisor进程管理工具的使用

    supervisor是一款进程管理工具,当想让应用随着开机启动,或者在应用崩溃之后自启动的时候,supervisor就派上了用场. 广泛应用于服务器中,用于引导控制程序的启动 安装好superviso ...

  9. [日常] PKUWC 2018爆零记

    吃枣药丸...先开个坑... day -1 上午周测...大翻车... 下午被查水表说明天必须啥啥啥...(当时我差点笑出声) 晚上领到笔记本一枚和一袋耗材(袜子) 然而班会开太晚回去没来得及收拾就晚 ...

  10. alpha-咸鱼冲刺day1

    一,合照 emmmmm.自然是没有的. 二,项目燃尽图 三,项目进展 登陆界面随意写了一下.(明天用来做测试的) 把学姐给我的模板改成了自家的个人主页界面,侧边栏啥的都弄出来了(快撒花花!) 四,问题 ...