高级API 快速入门之第六章 用窗体实现Socket对话聊天案例
服务端:
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对话聊天案例相关推荐
- 高级API 快速入门之第七章 本地模拟下载文件
一:控制台版本的聊天互发消息 服务端: package com.zking.test;import java.io.BufferedReader; import java.io.Buffere ...
- 高级API快速入门之群聊天室【09】
一.控制台版本的群聊天室 其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端 服务器: pa ...
- php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程
先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...
- qq位置如何用启动百度地图定位服务器,腾讯位置服务API快速入门
前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key 引入js 把###替换成你申请的key 定义容器 设置好宽高度 设置 ...
- STM32固件库(标准外设库)入门学习 第六章TIM定时器(一)
STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 文章目录 STM32固件库(标准外设库)入门学习 第六章TIM定时器(一) 前言 一.定时器类型 1 基本定时器 2 通用定时器 3 ...
- OUYA游戏开发快速入门教程第1章了解OUYA及其设备
OUYA游戏开发快速入门教程第1章了解OUYA及其设备 OUYA是基于Andorid系统的游戏主机.围绕OUYA游戏机,已经形成一个完整的生态圈.在国外,OUYA已经成为知名的游戏平台.本章会站在玩家 ...
- BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们
BeagleBone Black快速入门教程第1章嵌入式Linux之于Maker们 Maker的中文含义类似"创客".创客是指一群酷爱科技.热衷实践的人群,他们以分享技术.交流思想 ...
- ArduinoYun快速入门教程第1章ArduinoYun概览
ArduinoYun快速入门教程第1章ArduinoYun概览 本章是全书的开篇,在本章笔者将把Arduino以及Yun的方方面面介绍给大家.其中包括Arduino这个术语的解释.Yun相对其他开发板 ...
- Keras functional API快速入门
2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...
最新文章
- 《图解 HTTP》读书笔记(未完待续)
- 新购阿里云服务器ECS创建之后无法ssh连接的问题处理
- 好用的重装系统前使用的windows系统软件名称导出备份工具
- 帝国CMS模板|中国历史网整站数据MIP源码下载、带Tags提取插件
- nodejs libararies
- 华为机试HJ99:自守数(附带提速方案)
- unity3d php js,【Unity开发】unity3d中的http通信?post/get
- matlab高斯窗函数,Matlab的窗函数,矩形窗,三角窗,汉明窗,汉宁窗,布莱克曼窗
- 电工与电子技术基础【2】
- WPS论文编写问题集(参考文献制作、公式居中及编号、公式影响行间距...)_长期更新中ing...
- 骨传导耳机靠谱吗?骨传导耳机是不是智商税?
- PD3.0 PPS限流
- 音频文件转换为文本文件!
- 轩小陌的Python笔记-day25 MySQL入门
- 连接mysql数据库报错Cannot create PoolableConnectionFactory
- java 十六进制转十进制_「16进制转10进制」Java:十六进制转换成十进制 - seo实验室...
- 技术总监的校招之旅——分享校招全攻略指南(万字长文)
- 近视眼手术之后计算机专业,白领人士做完近视眼手术后,可以正常用电脑工作吗?...
- 小程序源码:宅男必备福利壁纸大全自动采集微信小程序
- 苏嵌//郑艳秋//2018.7.12