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 ...
随机推荐
- VS自定义项目模板:[2]创建VSIX项目模板扩展
VS自定义项目模板:[2]创建VSIX项目模板扩展 听语音 | 浏览:1237 | 更新:2015-01-02 09:21 | 标签:软件开发 1 2 3 4 5 6 7 分步阅读 一键约师傅 百度师 ...
- 《DSP using MATLAB》第6章开始了
看到第6章了,标记一下,全书近一半,继续加油 构建滤波器的三种元件: 下面是函数floor和size的部分帮助截图
- UI设计颜色风格
有关颜色搭配方案: 摘取:http://bbs.9ria.com/thread-395-1-1.html 有关设计,可以参考:http://www.sj33.cn/
- DXUT源码阅读笔记
14.GetCapture() 函数功能:该函数取得捕获了鼠标的窗口(如果存在)的句柄.在同一时刻,只有一个窗口能捕获鼠标:此时,该窗口接收鼠标的输入,无论光标是否在其范围内.函数原型:HWND Ge ...
- div内文字超出换行问题
1.强制换行: div的样式加上: word-wrap:break-word;word-break:break-all; 2.在文字中间加入建议换行标志<wbr>可以每隔几个字符加一个,
- bzoj1412最小割
太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...
- ASIHTTPRequest取消异步请求
今天碰到一个问题 异步请求等待中 cancel后会发生什么,网上找了下资料说取消的请求默认都会按请求失败处理,并调用请求失败delegate 查找到的资料具体解释了下ASIHTTPRequest取消异 ...
- 踏上Salesforce的学习之路(一)
相信通过前面的学习,大家已经拥有了一个属于自己的Salesforce开发者账号,下面,我们将用这个账号正式踏上Salesforce的学习之路. 首先,点击网址:https://developer.sa ...
- Spark 应用程序调优
对于很多刚接触Spark的人来说,可能主要关心数据处理的逻辑,而对于如何高效运行Spark应用程序了解较少.由于Spark是一种分布式内存计算框架,其性能往往受限于CPU.内存.网络等多方面的因素,对 ...
- [LintCode] Longest Common Prefix 最长共同前缀
Given k strings, find the longest common prefix (LCP). Have you met this question in a real intervie ...