客户端
import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
public class MyClient {
private JFrame jf;
private JButton jBsend;
private JTextArea jTAcontent;
private JTextField jText;
private JLabel JLcontent;
private Date data;
private JPanel jPanel;
JScrollPane scroll;
MyClient(){
jf=new JFrame("客户端");
jBsend =new JButton("发送");
jTAcontent =new JTextArea(13,40);
jText =new JTextField(12);
scroll=new JScrollPane(jTAcontent,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
JLcontent=new JLabel("聊天记录");
jPanel=new JPanel();
}
public void Win()
{
Box boxVBox=Box.createVerticalBox();
boxVBox.add(JLcontent);
boxVBox.add(Box.createVerticalStrut(5));
boxVBox.add(scroll);
boxVBox.add(Box.createVerticalStrut(10));
boxVBox.add(jText);
boxVBox.add(Box.createVerticalStrut(10));
boxVBox.add(jBsend);
boxVBox.add(Box.createVerticalStrut(10));
jPanel.add(boxVBox);
jf.add(jPanel);
jf.setSize(600, 400);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void Connect() throws Exception{
Socket sk= new Socket("127.0.0.1",1200);
jBsend.addActionListener(e->{ //Lambda表达式实现点击按钮发送信息
String str=jText.getText(); //获取文本框内容
if (str.matches("\\s+") || str.equals("")) {
JOptionPane.showMessageDialog(jf, "不可发送空白内容");
return;
}
try {
jTAcontent.append("我:"+str+"\n"); //文本区添加文本框内容
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //字符流发送信息
bw.write(str); //发送文本框的信息给对方
bw.newLine(); //发送后换行
bw.flush(); //立即发送
//不用bw.close(),为了可以一直发送信息
jText.setText("");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new Thread(()->{ //Lambda表达式创建线程
while(true){ //死循环随时接受信息
try {
BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream())); //以字符流接受信息
String read = br.readLine(); //一行一行接受信息
jTAcontent.append("客服:"+read+"\n");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}).start(); //开启线程
});
}
public static void main(String[] args) throws Exception {
MyClient client=new MyClient();
client.Win();
client.Connect();
}
}
服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
public class MyServer {
//以下是聊天窗口的实现,上一篇文章有说过,不必多说
private JFrame jf;
private JButton jBsend;
private JTextArea jTAcontent;
private JTextField jText;
private JLabel JLcontent;
private Date data;
private JPanel jPanel;
private JScrollPane scroll;
MyServer() {
jf = new JFrame("服务端");
jBsend = new JButton("发送");
jTAcontent = new JTextArea(13, 40);
jText = new JTextField(12);
scroll = new JScrollPane(jTAcontent, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
JLcontent = new JLabel("聊天记录");
jPanel = new JPanel();
}
public void Win() {
Box boxVBox = Box.createVerticalBox(); //这里应用了垂直盒式布局模式排列组件
boxVBox.add(JLcontent);
boxVBox.add(Box.createVerticalStrut(5));
boxVBox.add(scroll);
boxVBox.add(Box.createVerticalStrut(10));
boxVBox.add(jText);
boxVBox.add(Box.createVerticalStrut(10));
boxVBox.add(jBsend);
boxVBox.add(Box.createVerticalStrut(10));
jPanel.add(boxVBox);
jf.add(jPanel);
jf.setSize(600, 400);
jf.setResizable(false);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void Connect() throws Exception {
ServerSocket ss = new ServerSocket(1200);
while (true) {
Socket sk = ss.accept();
jBsend.addActionListener(e -> { //按钮响应事件,实现点击按钮发送信息
String str = jText.getText(); //获取文本框的内容
try {
jTAcontent.append("我:" + str + "\n");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //以字符流发送信息
bw.write(str); //将文本框内容发送给对方
bw.newLine(); //发送后换行
bw.flush(); //立即发送
//不用bw.close(),为了可以一直发送信息
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
jText.setText("");
});
new Thread(() -> { //开启线程,这里是为了服务端可同时接收到多个客户端信息
while (true) { //设置死循环,用于随时接受信息
try {
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //字符流方式接受信息
String read = br.readLine(); //以字符串方式一行一行接受到信息
jTAcontent.append("客户:" + read + "\n"); //将接收的信息写入文本区
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}).start(); //用start开启线程
}
}
public static void main(String[] args) throws Exception {
MyServer server = new MyServer();
server.Win();
server.Connect();
}
}
运行结果如下: