java即时通信小例子
学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教。。。
好了下面讲一下基本的思路:
首先,编写服务器端的程序,简单点说吧就是在服务上开启一个线程循环等待客户端的连接,为每一个连接到服务器的Socket 创建一个实例存放在集合中,然后使用InputSteam读取从客户端发过来的数据然后转发给除自己之外的所有的客户端
然后是客户端,首先开启一个线程连接都服务器端,循环监听服务器发送回来的数据
这里要说一下为了明确是谁发出的消息我在这里采用了JSON的数据格式进行消息的传递在客户端对服务器端的数据进行JSON格式的解析显示到文本区
下面贴出客户端的源码(这里没有进行分包请大家谅解):
package com.chact; import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException; import javax.swing.JOptionPane; import org.json.JSONException;
import org.json.JSONObject; @SuppressWarnings("serial")
public class ChactClient extends Frame { /**
* 定义所有要使用的成员变量。
*
*/
public String Other = null;
public Button mButton = new Button("使用名称");
public static TextField mTextField = new TextField(20);
public static TextField usernameTextField = new TextField(20);
public static TextArea mTextArea = new TextArea(30, 30);
public static Boolean Flag;
Socket socket = null;
static StringBuffer stringBuffer = new StringBuffer();
public static Socket s = null;
OutputStream outputStream = null;
OutputStreamWriter writer = null;
static String ChactContent = null; /**
*
* 定义的主方法
*
* @param args
* @throws UnknownHostException
* @throws IOException
*/ public static void main(String[] args) throws UnknownHostException, IOException { new ChactClient().launchFrame(); /**
* 开启一个新的线程用来连接到服务器端
*/ Thread mThread = new Thread() {
@Override
public void run() {
try {
s = new Socket("123.206.76.188", 12345);
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
/********************************************************************************/
/**
*
* 循环的从服务器读取数据
*
*/
while (true) { try {
InputStream iso = s.getInputStream();
InputStreamReader sior = new InputStreamReader(iso, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(sior);
String string; while ((string = bufferedReader.readLine()) != null) {
System.out.println(string); // 这里使用JSON数据格式进行数据的传递 JSONObject jsonObject = new JSONObject(string); // 如果数据是自己发送的就不必再进行读取和显示
if (!jsonObject.getString("username").equals(usernameTextField.getText().trim())) { mTextArea.append(jsonObject.getString("username") + ": "
+ jsonObject.getString("Content") + "\n");
mTextArea.setForeground(Color.CYAN);
stringBuffer = null;
} else {
stringBuffer = null;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } };
mThread.start(); } /****************************************************************************/
/**
*
* 定义可见的窗口
*
* @throws UnknownHostException
* @throws IOException
*/ public void launchFrame() throws UnknownHostException, IOException {
Frame frame = new Frame();
frame.setTitle("开拓者即时聊天系统");
frame.setLocation(300, 300);
// this.setBounds(300,300,300,300);
frame.setSize(600, 800);
frame.setResizable(false); frame.add(mButton, BorderLayout.LINE_START);
frame.add(usernameTextField, BorderLayout.LINE_END);
frame.add(mTextArea, BorderLayout.NORTH);
frame.add(mTextField, BorderLayout.SOUTH);
mTextArea.setFont(new Font("微软雅黑", Font.PLAIN, 15));
frame.pack(); mTextField.addActionListener(new TFlistener());
mTextArea.setEditable(false);
mTextField.setEditable(false);
mButton.addActionListener(new ActionListener() { /**
* 首先进行用户名的读取如果为空则提示先输入用户名
*
*
*/ @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// String Other;
Other = usernameTextField.getText().trim();
Other = Other.replace('\n', ' ');
// System.out.println(Other);
if (!Other.equals("")) { usernameTextField.setEditable(false);
mTextField.setEditable(true);
} else {
JOptionPane.showMessageDialog(null, "昵称不能为空!", "标题", JOptionPane.INFORMATION_MESSAGE);
}
}
}); /**
*
* 定义关闭窗口的的事件监听器
*
*/ frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) { // 提示对方下线的JSON数据 String JSON = "{" + "'username'" + ":" + Other + ',' + "'Content'" + ":" + "已下线!!!" + "}"; try {
outputStream = socket.getOutputStream();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
writer = new OutputStreamWriter(outputStream, "UTF-8");
} catch (UnsupportedEncodingException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
writer.write(JSON + "\n");
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
writer.flush();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
System.exit(0);
try {
socket.close();
destory();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
frame.setVisible(true); // 获取与服务器的连接 Contection(); } /**
*
* 定义与服务器连接的函数
*
* @throws UnknownHostException
* @throws IOException
*/
public void Contection() throws UnknownHostException, IOException { socket = new Socket("123.206.76.188", 12345);
System.out.println("成功连接到客户端");
} /**
*
* 监听回车键进行数据的发送的监听器
*
*
* @author Administrator-SYSTEM
*
*/ private class TFlistener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
ChactContent = mTextField.getText().trim();
try { String JSON = "{" + "'username'" + ":" + Other + ',' + "'Content'" + ":" + ChactContent + "}";
outputStream = socket.getOutputStream();
writer = new OutputStreamWriter(outputStream, "UTF-8");
writer.write(JSON + "\n");
writer.flush();
mTextArea.setForeground(Color.BLACK);
mTextArea.append("我说: " + ChactContent + "\n");
mTextField.setText("");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} }
// 进行资源的释放 public void destory() throws IOException { outputStream.close();
writer.close();
socket.close(); } }
java即时通信小例子的更多相关文章
- Java处理文件小例子--获取全国所有城市的坐标
需求:前端展示数据,全国城市的坐标
- ajax 异步 通信 小例子 servlet与 jsp异步 post方法
post请求 url后面加参数 接收不到的,必须 放到send("use"=user)形式 还要加上 xhr.setRequestHeader("Content-Type ...
- ajax 异步 通信 小例子 servlet与 jsp异步 get
get 请求参数通过 url那里写进去,然后send(null) html文件和 servlet进行通信 通过ajax 进行通信 <!DOCTYPE html PUBLIC "-// ...
- Java枚举的小例子
有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的: 因为参数太多,if-else写起来就太不优雅了,可以参考 ...
- Thinking in java之正则表达式小例子
public static final String POEM= "Twas brilling, and the slithy toves\n" + "Did gyre ...
- comet基于HTTP长连接技术(java即时通信,推送技术详解)
服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...
- Java反射机制小例子
package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...
- 验证java引用的小例子
1. 声明一个变量person指向一个引用对象, 然后将这个person添加到集合list中, 然后将变量person指向null, 问:list中添加的person变成null了吗? import ...
- C#网络编程简单实现通信小例子-1
1.主界面 2.源程序 Send public partial class formUdpSend : Form { //声明一个UdpClient对象 UdpClient udpClient; pu ...
随机推荐
- 解决EditText和ScrollView滑动冲突问题
该类需要调用 OnTouchListener接口 黄色部分是需要更改部分,改为自己的edittext@Override public boolean onTouch(View view, Motion ...
- Maven的配置和使用(三)
下面记录下如何使用Maven进行jar包的管理和更新. 在Maven中我们是通过对pom.xml文件的配置来对项目的包进行管理的,找到该文件并打开: <project xmlns="h ...
- 【Asp.Net MVC】日常---路由
想要这样的路由 不带id:http://test.mymong.com/Home/List.html 带id:http://test.mymong.com/Home/Del/561755ba3af24 ...
- OSG消息机制之事件处理概述
OSG的消息机制包括好多个头文件预定义及多个类. 首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了.前者处理OSG程序与用 ...
- [软件推荐]快速文件复制工具(Limit Copy) V4.0 绿色版
快速文件复制工具(Limit Copy)绿色版是一款智能变频超快复制绿色软件. 快速文件复制工具(Limit Copy)功能比较完善,除了文件复制还可以智能变频,直接把要复制的文件拖入窗口即可,无需手 ...
- js闭包演示
有个网友问了个问题,如下的html,为什么每次输出都是5 <html > <head> <meta http-equiv="Content-Type" ...
- window下xampp配置多端口、多站点步骤
好些日子没整理知识了,许多新东西不整理出来时间一长就淡忘了.看来以后得继续坚持整理. 配置XAMPP多端口.多站点如下步骤: 多端口: (一个域名下同时配置多个端口,从而达到访问不同程序) 效果例如: ...
- Linux 时间时区同步
$ sudo cp /usr/share/zoneinfo/Asia/ShangHai /etc/localtime 上述是修改系统时区 同步时间 1. 安装ntpdate工具 $ sudo apt ...
- 【异常】Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataIntegrityViolationException
Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataIntegrityViolationException ...
- Linux上的free命令详解、swap机制
Linux上的free命令详解 解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free ...