干货:io流带时间的聊天室【客户端与服务端】
客户端与服务端聊天
今天分享的是楼主在学io流时写的一个点对点聊天
首先给大家看一下界面:
记住先开启服务端在连接客户端。
package com.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
/**
- 客户端
- @author 花开一季
*/
public class MyClient extends JFrame {
public static void main(String[] args) throws Exception {
try {
// java自带的一个皮肤包
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
new MyClient();
} catch (Exception e) {
e.printStackTrace();
}
}
// 容器
JPanel jp = new JPanel();
// 文本域
JTextArea jta1 = new JTextArea();
JTextArea jtfa = new JTextArea();
// 滚动面板
JScrollPane jsp1 = new JScrollPane(jta1);
JScrollPane jsp2 = new JScrollPane(jtfa);
// 按钮
JButton jb1 = new JButton("发送");
JButton jb2 = new JButton("关闭");
BufferedWriter bw;
BufferedReader br;
String j;
Socket sk;
boolean b = false;
public MyClient() {
// 设置窗口名称
this.setTitle("客户端");
// 窗口大小
this.setSize(600, 600);
// 居中显示
this.setLocationRelativeTo(null);
// 关闭资源
this.setDefaultCloseOperation(3);
// 容器空布局
jp.setLayout(null);
// 设置背景图片
ImageIcon ii = new ImageIcon("D:\\360安全浏览器下载\\599687c827424.jpg");
JLabel jl = new JLabel(ii);
// 往容器添加组件
jp.add(jsp1);
jp.add(jsp2);
jp.add(jb1);
jp.add(jb2);
jp.add(jl);
// 设置组件显示位置
jsp1.setBounds(40, 20, 450, 400);
jsp2.setBounds(40, 470, 350, 35);
jb1.setBounds(400, 450, 80, 40); // 发送
jb2.setBounds(400, 500, 80, 40); // 关闭
jl.setBounds(0, -20, 600, 600);
// 设置接收信息的文本域不可编辑
jta1.setEditable(false);
// 添加容器进内容面板
this.getContentPane().add(jp);
// 窗口可见
this.setVisible(true);
// 获得输出文本域值
j = jta1.getText();
// 发送按钮事件
jb1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");// 设置日期格式
String s = df.format(d) + "\n";
// 输入框是""不进行发送
if (!jtfa.getText().equals("")) {
try {
// 得到输入的值;
String s1 = s + "客户端:" + jtfa.getText();
// 拼接显示框的值,并换行
j += s1 + "\n";
// 再设置到显示框
jta1.setText(j);
// 发送信息给客户端
bw.write(s1);
// 换行
bw.newLine();
// 刷新
bw.flush();
// 传输之后把输入框的值变""
jtfa.setText("");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
});
// 关闭按钮事件
jb2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
b = true;
// 关闭流
try {
br.close();
bw.close();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
MyClient.this.dispose();
}
});
// ----------------------------------------------------
try {
// 客户端连接到服务器端口
sk = new Socket(InetAddress.getByName("127.0.0.1"), 8989);
// 发送信息给客户端,需要流
OutputStream os = sk.getOutputStream();
// 字节流转字符流
OutputStreamWriter osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
// 从服务器读取信息
InputStream is = sk.getInputStream();
// 字节流转字符流
InputStreamReader isr = new InputStreamReader(is);
br = new BufferedReader(isr);
new Thread() {
public void run() {
while (true) {
// 读取从客户端接收过来的值
try {
String s = br.readLine() + "\n";
// 接收的值和显示框的值拼接
j += s;
// 并显示在文本域
jta1.setText(j);
if (b) {
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// -------------------------try---------------------------
}// ---------------构造方法结尾------------------------
}// -------------------------类结尾---------------------------
服务端与客户端界面,发送消息和接收消息基本一致大家可参考以上代码来实现。服务端启动线程代码如下:
try {
// 创建套接字服务器:启动socket
ServerSocket ss = new ServerSocket(8989);
// 设置为等待状态
sk = ss.accept();
System.out.println(“客户端已连接:” + sk.getLocalAddress());
// 接收客户端的信息
InputStream is = sk.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
br = new BufferedReader(isr);
// 发消息给客户端
OutputStream os = sk.getOutputStream();
// 字节流转字符流
OutputStreamWriter osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
new Thread() {
public void run() {
while (b) {
// 读取从客户端接收过来的值
String s;
try {
s = br.readLine() + "\n";
// 接收的值和显示框的值拼接
j += s;
// 并显示在文本域
jta1.setText(j);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}.start();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// -------------------------try---------------------------
}// ---------------构造方法结尾------------------------
}// ---------------类结尾------------------------
若有更好的意见,可以发送至邮箱:[email protected]
因为楼主还在学习阶段所以菜的一批,希望可以和大家一起交流来弥补自身的不足。