栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java socket 多客户端连一个服务器端问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java socket 多客户端连一个服务器端问题

某一个客户端断开连接后再连接,可以发消息给服务器端,但是接收不到服务器端的消息,或者就是服务器端不会发消息给它。

以下是代码,希望大佬指点一二

服务器端代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.linkedList;
import java.util.List;
import java.util.concurrent.*;

public class ChatRoomServer {
    public static void main(String[] args) {
        Jframe f=new Jframe("Server");
        f.setBounds(200,200,600,600);
        f.setLayout(null);
        JPanel p1=new JPanel();
        p1.setBounds(1,1,400,400);
        p1.setLayout(null);
        JPanel p2=new JPanel();
        p2.setBounds(1,401,400,190);
        p2.setLayout(null);
        Jtextarea jta=new Jtextarea();
        jta.setBounds(2,2,300,390);
        JTextField jtf=new JTextField();
        jtf.setBounds(50,50,200,80);
        JButton b=new JButton("发送");
        b.setBounds(280,80,80,30);

        p1.add(jta);
        p2.add(jtf);
        p2.add(b);
        f.add(p1);
        f.add(p2);
        //焦点给键盘,因为键盘监听和按钮监听会有冲突
        b.setFocusable(false);
        //存储建立的连接
        List sockets=new ArrayList<>();
        try {

            b.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    try {
                        String send=jtf.getText();
                        if(send!="")
                        {
                            jta.append("server: "+send+"rn");
                            jtf.setText("");
                            for(Socket s:sockets)
                            {
                                //不进行判断的话,一个客户端断开连接其它客户端也收不到消息
                                if(s!=null)
                                {
                                    OutputStream os = s.getOutputStream();
                                    DataOutputStream dos = new DataOutputStream(os);
                                    dos.writeUTF("server: "+send);
                                }

                            }
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            });
            jtf.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) {
                    super.keyTyped(e);
                    if(e.getKeyChar() == KeyEvent.VK_ENTER)
                    {
                        try {
                            String send=jtf.getText();
                            if(send!="")
                            {
                                jta.append("server: "+send+"rn");
                                jtf.setText("");
                                for(Socket s:sockets)
                                {
                                    if(s!=null)
                                    {
                                        OutputStream os = s.getOutputStream();
                                        DataOutputStream dos = new DataOutputStream(os);
                                        dos.writeUTF("server: "+send);
                                    }
                                }
                            }
                        }
                        catch (Exception e1)
                        {
                            e1.printStackTrace();
                        }
                    }

                }
            });
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        f.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        f.setVisible(true);
        try {
            ServerSocket ss = new ServerSocket(8888);
            System.out.println("监听端口号:8888");
            ThreadPoolExecutor threadPool= new ThreadPoolExecutor(10,
                    15, 60, TimeUnit.SECONDS,
                    new linkedBlockingQueue());
            


            while(true)
            {
                Socket s=ss.accept();
                sockets.add(s);
                threadPool.execute(new ServerThread(s,sockets,jta));

            }


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



    }
}
class ServerThread implements Runnable
{
    Socket s;
    List sockets;
    Jtextarea jta;
    public ServerThread(Socket s,List sockets,Jtextarea jta)
    {
        this.s=s;
        this.sockets=sockets;
        this.jta=jta;
    }
    @Override
    public void run() {
        while(true)
        {
            if(!s.isClosed())
            {
                try {
                    InputStream is = s.getInputStream();
                    DataInputStream dis = new DataInputStream(is);
                    if(is.available()>0)
                    {
                        String receive =dis.readUTF();
                        if(receive=="client disconnection")
                        {
                            jta.append(s.getRemoteSocketAddress()+": " + receive + "rn");
                            for(Socket s1:sockets)
                            {
                                if(s1.getRemoteSocketAddress()==s.getRemoteSocketAddress())
                                {
                                    sockets.remove(s1);
                                }
                            }//System.out.println("gg");
                            s.shutdownInput();
                            s.shutdownOutput();
                            s.close();
                            break;
                        }
                        else if(receive!="")
                        {
                            String sip=String.valueOf(s.getRemoteSocketAddress());
                            {
                                jta.append(s.getRemoteSocketAddress()+": " + receive + "rn");
                                for(Socket s:sockets)
                                {
                                    if(s!=null)
                                    {
                                        OutputStream os = s.getOutputStream();
                                        DataOutputStream dos = new DataOutputStream(os);
                                        dos.writeUTF(sip+": "+receive);
                                    }


                                }
                            }

                        }
                    }


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

        }

    }
}

客户端代码:


import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;

public class ChatRoomClient {
    public static int flag=1;
    public static void main(String[] args) {
        Jframe f=new Jframe("Client");
        f.setBounds(200,200,600,600);
        f.setLayout(null);
        JPanel p1=new JPanel();
        p1.setBounds(1,1,400,400);
        p1.setLayout(null);
        JPanel p2=new JPanel();
        p2.setBounds(1,401,400,190);
        p2.setLayout(null);
        Jtextarea jta=new Jtextarea();
        jta.setBounds(2,2,300,390);
        JTextField jtf=new JTextField();
        jtf.setBounds(50,50,200,80);
        JButton b=new JButton("发送");
        b.setBounds(280,80,80,30);

        p1.add(jta);
        p2.add(jtf);
        p2.add(b);
        f.add(p1);
        f.add(p2);
        //焦点给键盘,因为键盘监听和按钮监听会有冲突
        b.setFocusable(false);
        //窗口关闭就关闭socket
        //要用windowClosing不能用windowClosed。而且要调用dispose();方法


        try {
            String ip ="127.0.0.1";
            Socket s = new Socket(ip,8888);
            System.out.println("监听端口号:8888");
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            OutputStream os = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            f.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    super.windowClosing(e);
                    try {
                        dos.writeUTF("client disconnection");
                        flag=0;
                        s.shutdownOutput();
                        s.close();
                        //System.out.println("gg");
                    }
                    catch (Exception e1)
                    {
                        e1.printStackTrace();
                    }
                    f.dispose();
                }
            });
            //接收
            Thread t1 = new Thread() {
                public void run() {
                    //线程的While(true)里面放要循环的内容需要不停执行的内容
                    while (true) {

                            if(flag==1&&!s.isClosed())
                            {
                                try {
                                    String s = dis.readUTF();
                                    if (s != "") {
                                        jta.append(s + "rn");
                                        p1.updateUI();
                                    }
                                } catch (IOException e) {
                                    // TODO 自动生成的 catch 块
                                    e.printStackTrace();
                                }
                            }
                            else
                            {
                                break;
                            }
                        }

                        }



            };
            t1.start();
            b.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {


                    String s1=jtf.getText();
                        if(s1!="")
                        {
                            try {
                                dos.writeUTF(s1);
                                jtf.setText("");

                            }
                            catch (Exception e1)
                            {
                                e1.printStackTrace();
                            }
                        }
                    }


            });
            jtf.addKeyListener(new KeyAdapter() {
                @Override
                public void keyTyped(KeyEvent e) {
                    super.keyTyped(e);
                    if(e.getKeyChar() == KeyEvent.VK_ENTER)
                    {
                        String s1=jtf.getText();
                            if(s1!="")
                            {
                                try {
                                    dos.writeUTF(s1);
                                    jtf.setText("");

                                }
                                catch (Exception e1)
                                {
                                    e1.printStackTrace();
                                }
                            }


                    }
                }
            });

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



        //f.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        f.setVisible(true);
    }
}

module-info

module study {
	requires java.sql;
	requires java.desktop;

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353760.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号