Java 简易版 TCP(一对一)聊天
2023-12-13 04:31:59
客户端
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();
}
}
运行结果
文章来源:https://blog.csdn.net/nmy15570188135/article/details/134848429
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!