客户端:

package QQ;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket; /**
* Created by hu on 2015/11/8.
*/
//QQ类似聊天程序的客户端
public class Client extends JFrame {
static JTextArea area;
JTextField field;
JButton button;
static PrintWriter writer;
public Client() {
this.setTitle("客户端");
this.setSize(400,500);
area=new JTextArea(25,30);
area.setEditable(false);
field=new JTextField(20);
button=new JButton("提交");
JScrollPane sp=new JScrollPane(area);
JPanel panel=new JPanel();
this.add(sp, BorderLayout.CENTER);
panel.add(field);
panel.add(button);
this.add(panel,BorderLayout.SOUTH);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text=field.getText();
writer.println(text);
area.append("me:"+text+"\n");
field.setText("");
}
});
}
public static void main(String[] args)throws Exception{
Socket socket=new Socket("127.0.0.1",8899);
Client client=new Client();
OutputStream out=socket.getOutputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintWriter(out,true); client.addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) { } @Override
public void windowClosing(WindowEvent e) {
System.out.println("closing");
try {
socket.shutdownInput();
socket.shutdownOutput();
socket.close();
writer.close();
reader.close();
}catch (Exception exception){
exception.printStackTrace();
} } @Override
public void windowClosed(WindowEvent e) {
System.out.println("closed"); } @Override
public void windowIconified(WindowEvent e) { } @Override
public void windowDeiconified(WindowEvent e) { } @Override
public void windowActivated(WindowEvent e) { } @Override
public void windowDeactivated(WindowEvent e) { }
});
while (true){
try{
String line=reader.readLine();
area.append("服务器:"+line+"\n");
}catch (Exception exception){
System.out.println("客户端程序已经关闭!");
break;
}
}
}
}
服务端
package QQ;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by hu on 2015/11/8.
*/
/*
* qq类似聊天程序的服务端
* */
public class Server extends JFrame{
static JTextArea area;
JTextField field;
JButton button;
static PrintStream writer;
public Server(){
//设置窗口的大小和标题
this.setTitle("服务器");
this.setSize(400,500);
//设置文本区域的大小并且设置为不可编辑
area=new JTextArea(25,30);
area.setEditable(false);
//设置文本输入框的大小
field=new JTextField(20);
//设置按钮的
button=new JButton("提交");
/*
* JPanel默认布局的是FlowLayout
* 可以new的时候就定义成其他布局:
* JPanel p=new JPanel(new GridLayout(2,1));//两行一列
* JPanel p=new JPanel(new BorderLayout());
* */
JPanel panel=new JPanel();
JScrollPane sp=new JScrollPane(area);
this.add(sp, BorderLayout.CENTER);
panel.add(field);
panel.add(button);
this.add(panel,BorderLayout.SOUTH);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//为按钮添加事件
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text=field.getText();
writer.println(text);
area.append("seven_hu:"+text+"\n");
field.setText("");
}
});
}
public static void main(String[] args)throws Exception{
Server server=new Server();
ServerSocket serverSocket=new ServerSocket(8899);
System.out.println("Starting listening...");
while (true){
Socket socket=serverSocket.accept();
//获取客户端主机名
InetAddress address=socket.getInetAddress();
String name=address.getLocalHost().getHostName();
System.out.println(name+"已连接");
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer=new PrintStream(socket.getOutputStream(),true);
String line=null;
line=reader.readLine();
if(line!=null){
area.append("client:"+line+"\n");
}
}
}
}
 

java网络编程(三):一个类似QQ的聊天程序的更多相关文章

  1. Java网络编程三--基于TCP协议的网络编程

    ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状体 Socket accept():如果接收到客户端的连接请求,该方法返回一个与客户端对应Socket ...

  2. java网络编程三次握手四次挥手

    第一次握手:client设置syn=1,随机产生一个序列号seq=x,将数据包发送到server.client进入syn_send状态, 等待server确认. 第二次握手:server查看clien ...

  3. 20145215实验五 Java网络编程及安全

    20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...

  4. 20145337实验五Java网络编程及安全

    20145337实验五Java网络编程及安全 实验内容 掌握Socket程序的编写 掌握密码技术的使用 设计安全传输系统 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器 ...

  5. 20145122《 Java网络编程》实验五实验报告

    实验名称 Java网络编程 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 结对小伙伴 20145120黄玄曦 博客地址:http://www.cnblo ...

  6. 20145327实验五 Java网络编程

    实验五 Java网络编程 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 基于Java Socket实现安全传输 基于TCP实现客户端和服务器, ...

  7. Java网络编程:QQ邮件发送客户端程序设计

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  8. java 网络编程(三)---TCP的基础级示例

    下面是TCP java网络编程的基础示例: tcp传输:客户端建立过程的思路:1.创建TCP客户端的Socket服务,使用的是socket对象,建议在创建的过程中,就明确了目的地和要连接的主机2.如果 ...

  9. JAVA网络编程【转】出处不详

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

随机推荐

  1. ELK详细安装部署

    一.前言 ​ 日志主要包括系统日志和应用程序日志,运维和开发人员可以通过日志了解服务器中软硬件的信息,检查应用程序或系统的故障,了解故障出现的原因,以便解决问题.分析日志可以更清楚的了解服务器的状态和 ...

  2. exec , 元类,__new__, __call__ , 单例模式 , 异常

    1,类也是对象 ''' 动态语言 可以在运行期间 动态生成类 修改对象属性 静态语言 ''''' ''' type(object_or_name, bases, dict) type(object) ...

  3. python3+openCV实现图片的人脸人眼检测,原理+参数+源代码

    上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测 but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心 然鹅天道好轮回,现在捡起来了原来的算法一 ...

  4. 动态规划:HDU-2955-0-1背包问题:Robberies

    解题心得: 这题涉及概率问题,所以要运用概率的知识进行解答.题目要求不被抓到的概率,但是给出的是被抓到的概率,所要用1减去后得到答案.最好使用double类型,避免精度问题导致WA. 先算出可以抢劫的 ...

  5. mysql--timestamp加减

    利用timestamp()对timestamp类型进行秒加减操作: 1.加10秒: 2.减10秒:

  6. gulp基本入门

    gulp用于自动化和提高工作流,类似于grunt.gulp适用于nodejs平台.   gulp基础: gulp两个主要的功能是读取想要处理的文件,把处理好的文件放到指定的地方gulp.src()找出 ...

  7. 设计模式之序章-UML类图那点事儿

    设计模式之序-UML类图那点事儿 序 打14年年底就像写那么一个系列,用于讲设计模式的,代码基于JAVA语言,最早接触设计模式是大一还是大二来着,那时候网上有人给推荐书,其中就有设计模式,当时给我推荐 ...

  8. python 学习分享-常用模块篇

    模块 就是前人给你造的轮子,你开车就好!!! 常用模块有: time模块 random模块 os模块 sys模块 shutil模块 json  &  picle模块 shelve模块 xml处 ...

  9. day05_07 标志位讲解

    continue: 需求:大于5才打印 for i in range(10): if i<6 : continue print(i) continue作用:结束本次循环,继续下次循环 break ...

  10. C#中var、int、object性能比较(已修正)

    var关键字是.net3.5推出的关键字,主要是让编译器自动推断并判断变量类型,类似javascript中的var. 在使用一些性能优化软件时,在代码优化时,我发现不管定义什么类型的变量,变量的类型都 ...