Java-TCP/IP编程-04 带窗口的群聊天功能

来源:互联网 发布:老王python培训 编辑:程序博客网 时间:2024/05/22 18:55

Client

package com.qf.demo11;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
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.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class Client {
public static void main(String[] args) {
new MyFrame();
}
}


class MyFrame extends JFrame implements ActionListener, Runnable {


String name;//
Socket socket;


JPanel jpLogin, jpChat, jpInfo;


// login
JLabel jlName;
JTextField jtfName;
JButton jbLogin;


// chat
JScrollPane jsp;// 带滚动条的面板
JTextArea jtaMessage;
JTextField jtfInfo;
JButton jbSend, jbExit;


public MyFrame() {


try {
socket = new Socket("localhost", 6666);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 启动子线程
new Thread(this).start();


// login,登录面板
jpLogin = new JPanel();
jpLogin.setLayout(null);
jlName = new JLabel("请输入用户名");
jlName.setFont(new Font(Font.DIALOG, Font.BOLD, 20));
jlName.setForeground(Color.red);
jlName.setBounds(60, 50, 200, 30);


jtfName = new JTextField(20);
jtfName.setBounds(60, 100, 200, 30);


jbLogin = new JButton("登录");
jbLogin.setBounds(300, 100, 70, 30);
jbLogin.addActionListener(this);


jpLogin.add(jlName);
jpLogin.add(jtfName);
jpLogin.add(jbLogin);


// chat,聊天面板


jpChat = new JPanel();
jpChat.setLayout(new BorderLayout());// 设置为边框布局


jtaMessage = new JTextArea();
// 滚动条
jsp = new JScrollPane(jtaMessage);


jtfInfo = new JTextField(20);
jbSend = new JButton("发送");
jbSend.addActionListener(this);


jbExit = new JButton("退出");
jbExit.addActionListener(this);


jpInfo = new JPanel();
jpInfo.add(jtfInfo);
jpInfo.add(jbSend);
jpInfo.add(jbExit);


jpChat.add(jsp, BorderLayout.CENTER);
jpChat.add(jpInfo, "South");


// 窗口添加面板
this.add(jpLogin);


// 设置窗口属性
this.setTitle("聊天客户端");
this.setVisible(true);
this.setBounds(100, 100, 400, 300);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
}


// 按钮单击事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (e.getSource() == jbLogin) {
name = jtfName.getText();
if ("".equals(name)) {
JOptionPane.showMessageDialog(this, "用户名不能为空!");
} else {
jpLogin.setVisible(false);
this.add(jpChat);
this.setTitle(name + " 的客户端");
}
} else if (e.getSource() == jbSend) {
// 获得输入的信息,发送到服务器端
String info = jtfInfo.getText();
jtfInfo.setText("");
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
socket.getOutputStream()));
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String date = sdf.format(new Date());
bw.write(name + " " + date + " : " + info);
bw.newLine();
bw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if (e.getSource() == jbExit) {
System.exit(1);
try {
socket.shutdownOutput();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}


}


@Override
public void run() {
// TODO Auto-generated method stub
// 接收服务器转发的消息,显示到文本域上
try {
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
while (true) {
String info = br.readLine();
jtaMessage.append(info + "\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Server

package com.qf.demo11;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;


public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(6666);
// 集合用来存储连接的客户端
List<Socket> list = new ArrayList<Socket>();
while (true) {
Socket s = ss.accept();
list.add(s);


// 启动子线程
new Thread(new ServerThread(s, list)).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


class ServerThread implements Runnable {


private Socket socket;// 连接的客户端
private List<Socket> list;


public ServerThread(Socket socket, List<Socket> list) {
this.socket = socket;
this.list = list;
}


// 接收客户端的消息,并转发
@Override
public void run() {
// TODO Auto-generated method stub
try {
// 用来读取客户端发来的消息
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));


while (true) {
String sClient = br.readLine();


if (sClient != null)
// 遍历集合,转发消息
for (Socket s : list) {
// 获得每一个Socket的输出流
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(s.getOutputStream()));
bw.write(sClient);
bw.newLine();
bw.flush();
}
else {
socket.close();
list.remove(socket);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

0 0
原创粉丝点击