java聊天程序源码

[size=large][color=blue]一.客户端程序,有窗口,可以输入、显示所有人发的信息[/color][/size]
package com.adu.client;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Client extends JFrame {
TextArea textArea = new TextArea();// 创建一个文本域
TextField textField = new TextField();// 创建一个文本框

Button button_send = new Button("发送");
Button button_clear = new Button("清屏");

static Socket clientLink;
BufferedReader br;
PrintStream ps;
String msg;
StringBuffer sb = new StringBuffer();

static {
try {
clientLink = new Socket("127.0.0.1",8888);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

public Client() {
super("客户端");
}

public void runClient() {
this.setLocation(400, 450);
this.setSize(400, 400);
this.add(textArea, BorderLayout.NORTH);// 把文本添加到窗体中
this.add(textField, BorderLayout.SOUTH);// 把文本框添加到窗体中
this.add(button_send, BorderLayout.EAST);// 把按钮添加到窗体中
this.add(button_clear, BorderLayout.WEST);
this.setVisible(true);// 窗体是否可见
this.pack();// 自动调整布局
textField.setText("请输入信息");

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

try {

br = new BufferedReader(new InputStreamReader(clientLink
.getInputStream()));
ps = new PrintStream(clientLink.getOutputStream());

// 发送按钮事件
button_send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
msg = textField.getText();
System.out.println(msg);
// 这里不能用缓冲流,向服务器发送信息
ps.println(msg);
ps.flush();
}

});

// 回车时,文本域事件
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
msg = textField.getText();
// 这里不能用缓冲流写
ps.println(msg);
ps.flush();

}

});

// 清屏按钮事件
button_clear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
textArea.setText("");
sb.delete(0, sb.length());
}
});

// 接受服务器信息
while (true) {
msg = br.readLine();
sb.append(msg + "\n");
textArea.setText(sb.toString());
textField.setText("");
}

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != clientLink) {
clientLink.close();

}
if (null != br) {
br.close();
}
if (null != ps) {
ps.close();
}

} catch (IOException e) {
e.printStackTrace();
}
}

}

public static void main(String[] args) {
new Client().runClient();
}

}

[size=large][color=blue]二.服务器端实现了线程的控制,只要启动就可以监听客户端的请求以及发送的消息[/color][/size]
package com.adu.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
* @author GYH
*
*/
public class Server {

static ServerSocket server;
Socket clientLink;
List<Socket> clientLinkList = new ArrayList<Socket>();
int count;

static {
try {
// 开启服务器
server = new ServerSocket(8888);
System.out.println("服务器已启动!");

} catch (IOException e) {
e.printStackTrace();
}
}

public void runServer() {
try {
while (true) {
clientLink = server.accept();
System.out.println("连接数:" + (++count));
clientLinkList.add(clientLink);
ServerThread st = new ServerThread(clientLinkList, clientLink);
new Thread(st).start();
}

} catch (IOException e) {
e.printStackTrace();
}

}

public static void main(String[] args) {
Server server = new Server();
server.runServer();

}

}


package com.adu.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.List;

public class ServerThread implements Runnable {
List<Socket> clientLinkList;
Socket clientLink;
BufferedReader br;
PrintStream ps;
String msg;
String ip;
public ServerThread(List<Socket> clientLinkList, Socket clientLink) {
this.clientLinkList = clientLinkList;
this.clientLink = clientLink;
}

@Override
public void run() {

try {
br = new BufferedReader(new InputStreamReader(clientLink
.getInputStream()));
//获得当前用户的IP
ip=clientLink.getInetAddress().getHostAddress();

//把当前用户发来的信息发送给所有用户.
while (null != (msg=br.readLine())) {
for (int i = 0; i < clientLinkList.size(); i++) {
ps = new PrintStream(clientLinkList.get(i)
.getOutputStream());
ps.println("IP为:"+ip+"的朋友说:"+msg+"\n");

ps.flush();
}
}



} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(null!=clientLink){
clientLink.close();

}
if(null!=br){
br.close();
}
if(null!=ps){
ps.close();
}

} catch (IOException e) {
e.printStackTrace();
}
}

}

}
一、源码描述 GG2014是QQ的高仿版,包括客户端和服务端,可在广域网部署使用。我的目标并不 是做一个QQ高仿版的玩具,而是希望做成一个能够真正使用的产品(这个过程还有 很长的路要走),并持续维护下去。小编亲自测试完美运行,强烈推荐一下,感兴趣 的朋友们千万不要错过啊。 二、功能介绍 GG2014 已经实现了如下功能: (01)注册、登录、添加好友、好友列表。 (02)自拍头像。 (03)文字聊天、字体设置、GIF动态表情、窗口震动、截图、手写板、登录状态 (在线、离开、忙碌、勿打扰、隐身)、输入提醒 (04)群功能:创建群、加入群、退出群、群聊天 (05)文件传送、文件夹传送(支持断点续传) (06)语音视频聊天 (07)远程磁盘 (08)远程协助 (09)共享桌面(可以指定要共享的桌面区域) (10)可靠的P2P (11)网盘 (12)离线消息 (13)离线文件 (14)语音消息、语音留言 (15)最近联系人列表 (16)系统设置:开机自动启动、麦克风设备索引、摄像头设备索引,叉掉主窗口时 关闭程序还是隐藏窗口。 (17)聊天记录:支持本地保存和服务器端保存两种方式。 (18)好友分组:新增/删除分组,修改分组名称,改变好友的所属分组。 (19)托盘闪动:跟QQ完全一样,当接收到消息时,托盘会闪动对应好友的头像。点 击头像,将弹出与好友的聊天框。 (20)输入提醒:像QQ一样,当对方正在输入消息时,我这边的聊天框可以看到对方 “正在输入”的提示。 (21)自动记录:GG2014会自动记录上次打开的主界面的位置、大小;最后一次打开 的聊天窗口的大小;最后一次 设定的字体的颜色、大小等。 (22)打开聊天窗口时,自动显示上次交谈的最后一句话。 三、注意事项 1、开发环境为Visual Studio 2010,无数据库,使用.net 2.0开发。 2、该源码仅供学习交流使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值