干货:io流带时间的聊天室【客户端与服务端】

客户端与服务端聊天

今天分享的是楼主在学io流时写的一个点对点聊天
首先给大家看一下界面:
干货: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]
因为楼主还在学习阶段所以菜的一批,希望可以和大家一起交流来弥补自身的不足。