Java 简易版 TCP(一对一)聊天

客户端

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();
    }
}

运行结果

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java TCP一对一聊天,可以按照以下步骤进行: 1. 创建一个ServerSocket来监听客户端的连接请求: ```java ServerSocket serverSocket = new ServerSocket(port); Socket clientSocket = serverSocket.accept(); ``` 2. 在客户端中创建一个Socket来连接服务器: ```java Socket socket = new Socket(serverHost, serverPort); ``` 3. 在服务器和客户端中都创建一个输入输出流,用于发送和接收消息: ```java // 服务器端 InputStream inputStream = clientSocket.getInputStream(); OutputStream outputStream = clientSocket.getOutputStream(); // 客户端 InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); ``` 4. 使用输入输出流进行消息的发送和接收: ```java // 服务器端 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); PrintWriter writer = new PrintWriter(outputStream, true); String message = reader.readLine(); // 读取客户端发送的消息 writer.println("Server received your message: " + message); // 发送回复消息给客户端 // 客户端 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); PrintWriter writer = new PrintWriter(outputStream, true); writer.println("Hello, server!"); // 发送消息给服务器 String response = reader.readLine(); // 读取服务器回复的消息 ``` 5. 在服务器和客户端中都需要使用多线程来处理多个连接请求,否则会阻塞主线程。 完整的示例代码如下: 服务器端: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { int port = 8888; ServerSocket serverSocket = new ServerSocket(port); System.out.println("Server started on port " + port); while (true) { Socket clientSocket = serverSocket.accept(); System.out.println("Client connected: " + clientSocket.getInetAddress().getHostAddress()); new Thread(() -> { try { InputStream inputStream = clientSocket.getInputStream(); OutputStream outputStream = clientSocket.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); PrintWriter writer = new PrintWriter(outputStream, true); while (true) { String message = reader.readLine(); if (message == null) { break; } System.out.println("Received message from client: " + message); writer.println("Server received your message: " + message); } clientSocket.close(); System.out.println("Client disconnected: " + clientSocket.getInetAddress().getHostAddress()); } catch (IOException e) { e.printStackTrace(); } }).start(); } } } ``` 客户端: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws IOException { String serverHost = "localhost"; int serverPort = 8888; Socket socket = new Socket(serverHost, serverPort); System.out.println("Connected to server: " + socket.getInetAddress().getHostAddress()); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); PrintWriter writer = new PrintWriter(outputStream, true); writer.println("Hello, server!"); String response = reader.readLine(); System.out.println("Received response from server: " + response); socket.close(); System.out.println("Disconnected from server."); } } ``` 以上代码可以实现在本地进行一对一聊天。如果要在不同的机器上进行聊天,需要将服务器端的IP地址替换为服务器的公网IP地址,并且需要在服务器端的防火墙中开放对应的端口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值