客户端:

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. python笔记-dict字典的方法2

    #!/usr/bin/env python #-*- coding:utf-8 -*- ''' 概述: 使用键值(key-value)存储,具有极快的查找速度 注意:字典是无序的 key的特性: 1. ...

  2. A1058 A+B in Hogwarts (20)(20 分)

    A1058 A+B in Hogwarts (20)(20 分) If you are a fan of Harry Potter, you would know the world of magic ...

  3. 10 RESTful 实现权限控制

    1 2 身份控制 3 4 只能显示5条数据 5 权限控制 序列化渲染深度 6

  4. border,border-width不支持百分比

    1.border-width不支持百分比 原因:不会因为设备大就按比例变大 同样的,outline,box-shadow,text-shadow也不支持百分比 也就是border不支持百分比 2.bo ...

  5. 申请社交平台appkey详细教程

    申请社交平台appkey详细教程 大部分app都需要实现分享到微信.微博等社交平台的功能,但是在各个平台上申请appkey是一件很繁琐的事情.现在来分享一个申请社交平台appkey详细教程,在开发过程 ...

  6. WCF,WebServices,WebApi区别

    http://www.cnblogs.com/hetring/p/4493137.html

  7. ios开发学习笔记004-进制与位运算

    进制 二进制   0 1组成,封2进1 八进制 0-7组成,封8进1 十进制 0-9组成,封10进1 十六进制 0-15组成,封16进1 printf以不同进制形式进行输出 变量的内存地址形式 变量在 ...

  8. log4j2异步日志配置及官方文档的问题澄清

    配置及demo 方法一全部打开 加启动参数 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextS ...

  9. ValueStack、ActionContext

    笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 1. ValueStac ...

  10. Linux系统——机制策略(一)

    机制策略(一) 形而上谓之道:形而下谓之器: ————易经 LinuxUnix设计理念提供的一种机制不是策略:1.如果说机制是一种框架,那么,策略就是填充框架的一个个具体实施.机制提供的就是一种开放而 ...