学习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即时通信小例子的更多相关文章

  1. Java处理文件小例子--获取全国所有城市的坐标

    需求:前端展示数据,全国城市的坐标

  2. ajax 异步 通信 小例子 servlet与 jsp异步 post方法

    post请求 url后面加参数 接收不到的,必须 放到send("use"=user)形式 还要加上 xhr.setRequestHeader("Content-Type ...

  3. ajax 异步 通信 小例子 servlet与 jsp异步 get

    get  请求参数通过 url那里写进去,然后send(null) html文件和 servlet进行通信 通过ajax 进行通信 <!DOCTYPE html PUBLIC "-// ...

  4. Java枚举的小例子

    有一次工作中,要根据多个参数确定一个值(车辆事件),确定一个值需要的参数大部分的属性名称是相同的,少部分是独有的,但是参数的值几乎都是不同的: 因为参数太多,if-else写起来就太不优雅了,可以参考 ...

  5. Thinking in java之正则表达式小例子

    public static final String POEM= "Twas brilling, and the slithy toves\n" + "Did gyre ...

  6. comet基于HTTP长连接技术(java即时通信,推送技术详解)

    服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息,服务器发送一批数据,浏览器显示消息,同时保证与服务器的连接,当服务器需要再一次的发送数据,浏览器显示数据并保持连接. comet基 ...

  7. Java反射机制小例子

    package com.wjy.main; import java.io.Console; import java.lang.reflect.Constructor; import java.lang ...

  8. 验证java引用的小例子

    1. 声明一个变量person指向一个引用对象, 然后将这个person添加到集合list中, 然后将变量person指向null, 问:list中添加的person变成null了吗? import ...

  9. C#网络编程简单实现通信小例子-1

    1.主界面 2.源程序 Send public partial class formUdpSend : Form { //声明一个UdpClient对象 UdpClient udpClient; pu ...

随机推荐

  1. IIS 图片加载不出来

    如何为IIS增加svg和woff格式文件的支持 在我们新版的TopFlow中,使用了最新的bootstrap框架,此框架使用了字体文件来显示矢量的图标,为了能在IIS上正常显示图标,可以通过增加iis ...

  2. BIAWGN信道

    想到这个问题是因为平时使用的香农公式是 C=0.5*log2(1+SNR),后面才发现香农公式针对的好像是输入时高斯分布的情况,这种情况下用互信息来推导也可以看到: \[\begin{array}{c ...

  3. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  4. mac osx 上面部署Django项目 apache+mysql+mod_wsgi

    1.安装Xcode command line tools 首先,编译mysql和Homebrew需要用到Xcode command line tools,所以首先安装command line tool ...

  5. [field:picname/]和[field:litpic/]区别

    显示出二级栏目及以下的所有图片(包含三级栏目的) <ul class="incps"> {dede:arclist row=9 col="3" ty ...

  6. 联想昭阳E47外接显示器屏幕由扩展改为复制

    公司给我配的电脑室是联想昭阳e47,显卡是集成显卡,很差,做开发看显示屏久了眼睛很累视力会下降的很快. 所以本人自己买了一个三星22寸的显示器,京东上¥779买的,第二天早上就送来了. 之前我自己的电 ...

  7. 可变字符串NSMutableString

    //可变字符串继承自字符串 //拼接 NSMutableString *string = [NSMutableString string]; [string appendString:@"今 ...

  8. AmazeUI 框架知识点-布局和样式整理

    1.Amaze UI 将所有元素的盒模型设置为 border-box.这下好了,妈妈再也不用担心没计算好 padding.border 而使布局破相了. 2.Amaze UI 将浏览器的基准字号设置为 ...

  9. ajax函数封装

    function ajax(url, fnSucc, fnFaild) { //1.创建Ajax对象 if(window.XMLHttpRequest)//必须加window否则ie报错 { var ...

  10. 06.DOM操作应用高级

    获取表格tBodies.tHead.tFoot.rows获取行  cells获取td隔行变色 <!DOCTYPE HTML> <html> <head> <m ...