服务端:

package com.zking.test;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;/*** QQ服务器端* @author Administrator**/
public class QQServerTest extends JFrame{private ServerSocket ss = null;private Socket sk = null;private JPanel jpa = new JPanel();private JLabel jla = new JLabel("端口号");private JTextField jtfa = new JTextField(8);private JButton jba = new JButton("启动服务器"); private JTextArea jta = new JTextArea();private JScrollPane jsp = new JScrollPane(jta);private JPanel jpb = new JPanel();private JTextField jtfb = new JTextField(15);private JButton jbb = new JButton("发送");private JButton jbc = new JButton("接收");    public QQServerTest() {this.setTitle("QQ服务器端");this.setSize(400, 500);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);jpa.add(jla);jpa.add(jtfa);jpa.add(jba);jtfa.setText(8989+"");jta.setFont(new Font("宋体", Font.BOLD, 18));jta.setEditable(false);jpb.add(jtfb);jpb.add(jbb);jpb.add(jbc);this.getContentPane().add(jpa,"North");this.getContentPane().add(jsp,"Center");this.getContentPane().add(jpb,"South");/*** 启动服务的点击事件jba*/jba.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取端口号String dk = jtfa.getText();Integer port = Integer.valueOf(dk);//appendjta.append("服务器正在启动中....\n");try {//开启服务器  ServerSocketss = new ServerSocket(port);jta.append("服务器启动成功...等待客户端链接....\n");} catch (Exception e2) {e2.printStackTrace();}//利用多线程(小弟)new Thread() {public void run() {while(true) {try {sk = ss.accept();} catch (IOException e) {e.printStackTrace();}jta.append("某客户端上线了....\n");}};}.start();//实现自动接收数据--只要在服务器启动的那一刻,拿取一个线程(小弟弟)自动帮我接收数据并显示。new Thread() {public void run() {while(true) {//让小弟先休息一下try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}if (sk != null) {try {InputStream is = sk.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String content = br.readLine();jta.append("客户端说: " + content + "\n");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}};}.start();}});/*** 服务器端回复消息给客户端  jbb*/jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {//获取发送的内容String content = jtfb.getText();//客户端中获取网络输出流  利用Socketif(sk!=null) {//获取网络流try {OutputStream os = sk.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);BufferedWriter bw = new BufferedWriter(osw);//写入bw.write(content);bw.newLine();bw.flush();jta.append("我说:"+content);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}else {JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");}}});/*** 服务器端接受客户端发送的内容 jbb*/jbc.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (sk != null) {try {InputStream is = sk.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String content = br.readLine();jta.append("客户端说: " + content + "\n");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}}); this.setVisible(true);}public static void main(String[] args) {new QQServerTest();}}

客户端:

package com.zking.test;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;/*** QQ客户端* * @author Administrator**/
public class QQClientTest extends JFrame {// 定义一个Socket套接字private Socket sk = null;private JPanel jpa = new JPanel();private JLabel jla = new JLabel("IP地址");private JTextField jtfa = new JTextField(12);private JLabel jlb = new JLabel("端口号");private JTextField jtfb = new JTextField(8);private JButton jba = new JButton("链接服务器");private JTextArea jta = new JTextArea();private JScrollPane jsp = new JScrollPane(jta);private JPanel jpb = new JPanel();private JTextField jtfc = new JTextField(15);private JButton jbb = new JButton("发送");private JButton jbc = new JButton("接收");public QQClientTest() {this.setTitle("QQ客户端");this.setSize(500, 500);this.setDefaultCloseOperation(3);this.setLocationRelativeTo(null);jpa.add(jla);jpa.add(jtfa);jpa.add(jlb);jpa.add(jtfb);jpa.add(jba);jpb.add(jtfc);jpb.add(jbb);jpb.add(jbc);this.getContentPane().add(jpa, "North");this.getContentPane().add(jsp, "Center");this.getContentPane().add(jpb, "South");/*** 客户端的jba点击事件*/jba.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String ip = jtfa.getText();int port = Integer.valueOf(jtfb.getText());jta.append("客户端即将来连接服务器\n");//try {sk = new Socket(ip, port);jta.append("链接服务器成功了....\n");} catch (Exception e2) {e2.printStackTrace();}//开启一个多线程实现自动接收数据new Thread() {public void run() {while(true) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if (sk != null) {try {InputStream is = sk.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String content = br.readLine();jta.append("服务器说: " + content + "\n");} catch (IOException e1) {e1.printStackTrace();}}}};}.start();}});/*** 客户端的发送按钮jbb*/jbb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 获取发送的内容String content = jtfc.getText();// 客户端中获取网络输出流 利用Socketif (sk != null) {// 获取网络流try {OutputStream os = sk.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);BufferedWriter bw = new BufferedWriter(osw);// 写入bw.write(content);bw.newLine();bw.flush();jta.append("我:" + content+"\n");} catch (IOException e1) {e1.printStackTrace();}} else {JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息");}}});/*** 客户端接收服务器端回复的消息*/jbc.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (sk != null) {try {InputStream is = sk.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedReader br = new BufferedReader(isr);String content = br.readLine();jta.append("服务器说: " + content + "\n");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}});this.setVisible(true);}public static void main(String[] args) {new QQClientTest();}}

高级API 快速入门之第六章 用窗体实现Socket对话聊天案例相关推荐

  1. 高级API 快速入门之第七章 本地模拟下载文件

    一:控制台版本的聊天互发消息     服务端: package com.zking.test;import java.io.BufferedReader; import java.io.Buffere ...

  2. 高级API快速入门之群聊天室【09】

    一.控制台版本的群聊天室                     其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端              服务器: pa ...

  3. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  4. qq位置如何用启动百度地图定位服务器,腾讯位置服务API快速入门

    前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key 引入js 把###替换成你申请的key 定义容器 设置好宽高度 设置 ...

  5. STM32固件库(标准外设库)入门学习 第六章TIM定时器(一)

    STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 文章目录 STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 前言 一.定时器类型 1 基本定时器 2 通用定时器 3 ...

  6. OUYA游戏开发快速入门教程第1章了解OUYA及其设备

    OUYA游戏开发快速入门教程第1章了解OUYA及其设备 OUYA是基于Andorid系统的游戏主机.围绕OUYA游戏机,已经形成一个完整的生态圈.在国外,OUYA已经成为知名的游戏平台.本章会站在玩家 ...

  7. BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们

    BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们 Maker的中文含义类似"创客".创客是指一群酷爱科技.热衷实践的人群,他们以分享技术.交流思想 ...

  8. ArduinoYun快速入门教程第1章ArduinoYun概览

    ArduinoYun快速入门教程第1章ArduinoYun概览 本章是全书的开篇,在本章笔者将把Arduino以及Yun的方方面面介绍给大家.其中包括Arduino这个术语的解释.Yun相对其他开发板 ...

  9. Keras functional API快速入门

    2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...

最新文章

  1. 《图解 HTTP》读书笔记(未完待续)
  2. 新购阿里云服务器ECS创建之后无法ssh连接的问题处理
  3. 好用的重装系统前使用的windows系统软件名称导出备份工具
  4. 帝国CMS模板|中国历史网整站数据MIP源码下载、带Tags提取插件
  5. nodejs libararies
  6. 华为机试HJ99:自守数(附带提速方案)
  7. unity3d php js,【Unity开发】unity3d中的http通信?post/get
  8. matlab高斯窗函数,Matlab的窗函数,矩形窗,三角窗,汉明窗,汉宁窗,布莱克曼窗
  9. 电工与电子技术基础【2】
  10. WPS论文编写问题集(参考文献制作、公式居中及编号、公式影响行间距...)_长期更新中ing...
  11. 骨传导耳机靠谱吗?骨传导耳机是不是智商税?
  12. PD3.0 PPS限流
  13. 音频文件转换为文本文件!
  14. 轩小陌的Python笔记-day25 MySQL入门
  15. 连接mysql数据库报错Cannot create PoolableConnectionFactory
  16. java 十六进制转十进制_「16进制转10进制」Java:十六进制转换成十进制 - seo实验室...
  17. 技术总监的校招之旅——分享校招全攻略指南(万字长文)
  18. 近视眼手术之后计算机专业,白领人士做完近视眼手术后,可以正常用电脑工作吗?...
  19. 小程序源码:宅男必备福利壁纸大全自动采集微信小程序
  20. 苏嵌//郑艳秋//2018.7.12

热门文章

  1. 虚拟蜜罐:从信息模拟到实现虚拟蜜罐技术
  2. 寒冷冬天饮食调养有三宜
  3. socket主要函数介绍
  4. 动态瀑布流布局的图片墙
  5. 分享从零开始学习网络设备配置--任务2.6 避免网络环路
  6. [置顶]百度、谷歌、雅虎三大搜索引擎算法区别
  7. 筋膜枪单片机原理解析
  8. Python Pandas条件筛选
  9. 创新是企业持续发展的动力
  10. 2010.1.26网站挂马播报