【汇智学堂】基于TCP协议+多线程实现的一对多聊天

在这里插入图片描述
Server端

package com.huizhi;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends PublicUi{
    //private  static Socket socket;
    public static void main(String[] args) throws IOException, InterruptedException {
        // TODO Auto-generated method stub

        ServerSocket ss = new ServerSocket(10086);
        Server server=new Server("服务端","server answer");
        System.out.println("服务器正常启动。。。");

        while(true){
            Socket socket = ss.accept();
            System.out.println("用户接入成功。。。");
            /*
             * 每次连接成功一个客户端,则启动一个线程为其服务
             */
            ServerThread st1=new ServerThread(socket,server);
            st1.start();
        }
    }

    public Server(String a,String b){
        super(a,b);
    }
}

Server线程端- ServerThread

在这里插入代码片
package com.huizhi;

import javax.swing.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerThread extends Thread {
    private Socket socket;
    private JTextArea ja;
    private JTextField jf;
    private JButton jb;
    private PrintWriter pw;
    private int inta;

    public ServerThread(Socket socket,Server server) {
        this.socket = socket;
        this.ja=server.jTextArea;
        this.jf=server.jTextField;
        this.jb=server.jButton;
    }

    @Override
    public void run() {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));

            pw = new PrintWriter(new OutputStreamWriter(
                    socket.getOutputStream()));

            this.jb.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    if(inta==1&&!jf.getText().equals("")){
                        ja.append("我回复:"+jf.getText()+"\n");
                        pw.println(jf.getText());
                        pw.flush();
                        jf.setText("");
                        inta=0;
                    }
                }
            });

            while (true) {
                String string = br.readLine();
                System.out.println("Server read = " + string);
                System.out.println("Server端请输入: ");
                ja.append(string+"\n");
                inta=1;//标记为当前的socket对象
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                br.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                pw.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

客户端

package com.huizhi;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client extends PublicUi{
    private static Socket socket;
    public static void main(String[] args)  {
        try {
             socket=new Socket("127.0.0.1" ,10086);

        } catch (IOException e) {
            e.printStackTrace();
        }

        String strName="client"+Math.random();
        Client client=new Client(strName,"i want to speak:");

        try {
            client.EventM(socket);
            client.receiveTalk();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    Client(String a,String b){
        super(a,b);
    }

    public void receiveTalk() {

        BufferedReader br = null;
        try {
            br = new BufferedReader(
                    new InputStreamReader(
                            socket.getInputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        while(true){

            String str = null;
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("Client read = "+str);
            jTextArea.append("服务器回复说:"+str+"\n");
        }
    }
}

公共界面类

package com.huizhi;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class PublicUi extends JFrame{

    protected JTextField jTextField;
    protected JTextArea jTextArea;
    protected JButton jButton;
    protected PrintWriter pw;
    protected String a;

    PublicUi(String a, String b){
        this.a=a;
        JLabel label=new JLabel(b);
        jTextField=new JTextField(30);
        jButton=new JButton("send");
        jTextArea=new JTextArea(30,30);
        jTextArea.setLineWrap(true);

        FlowLayout flowLayout=new FlowLayout();
        flowLayout.setAlignment(FlowLayout.LEFT);

        this.setLayout(flowLayout);
        this.add(label);
        add(jTextField);
        add(jButton);
        add(jTextArea);

        this.setTitle(a);
        this.setVisible(true);
        this.setBounds(30,30,400,600);
        this.setResizable(false);
    }
    public void EventM(Socket socket){
        try {
            pw = new PrintWriter(
                    new OutputStreamWriter(
                            socket.getOutputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        jButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                String arg=jTextField.getText();
                jTextArea.append("我说:"+arg+"\n");

                if("exit".equals(arg.trim())){
                    pw.println("exit");
                    pw.flush();
                }
                pw.println(a+"说:"+arg);
                pw.flush();
            }
        });
    }
}
发布了268 篇原创文章 · 获赞 47 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_39593940/article/details/103540289