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 ...
随机推荐
- iOS 删除、重新排序xcdatamodel
找到Xcode项目文件.xcodeproj,查看包内容. 里面有project.pbxproj,用文本编辑器打开. 找到类似如下内容段: /* Begin XCVersionGroup section ...
- C# DataGridView绑定数据源
第一种: DataSet ds=new DataSet (); ]; 第二种: DataTable dt=new DataTable(); this.dataGridView1.DataSource= ...
- MacOS下Python的多版本管理(pyenv)
与windows下设置绝对路径不同,pyenv使用了一种更优雅的方式来管理Python的版本.pyenv通过在$PATH的最前面插入一个垫片路径(shims),例如:~/.pyenv/shims:/u ...
- 命名困惑系列之一:关于state和status的粗浅研究
牛津高阶词汇的解释 state: CONDITION OF SB/STH 状态:the mental,emotional or physical condition that a person or ...
- asp.net中用cookie记住密码上次不用登陆
------最佳解决方案--------------------写入CookieResponse.Cookies["UserName"].Value = "用户名&quo ...
- js中创建对象的三种方式
1. 对象字面量 var obj={ name:"小小", age:3, car:{ brand:"baoma", } }; } 2.使用内置构造函数 var ...
- jmobile学习之路 ----检测屏幕宽度
<script type="text/javascript"> window.onresize = function(){ var myh1 = document.ge ...
- LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
同时安装了VS2012和VS2010,用VS2010 时 >LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 问题说明:当安装VS2012之后 ...
- [LintCode] Climbing Stairs 爬梯子问题
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- substring()
OPENERURL.substring(OPENERURL.indexOf('/sear'));//从/sear开始截取(包括/sear): OPENERURL.substring(OPENERURL ...