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

多线程图形界面聊天

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

多线程图形界面聊天

把收发线程独立出去——单独写成一个类 ,只创立server一个图形界面 用于个体的可视化操作 配合swing可以极大模仿聊天个人界面

sendThread:

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class sendThread extends Thread{
    public Socket s;

   public sendThread(Socket s)
   {
       this.s=s;
   }

    @Override
    public void run() {
        try {
            OutputStream os = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            while(true){
                Scanner sc = new Scanner(System.in);
                String str = sc.next();
                dos.writeUTF(str);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

receiveThread:

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class receiveThread extends Thread{
    private Socket s;
    public receiveThread(Socket s)
    {
        this.s=s;
    }

    @Override
    public void run() {
        try {
            InputStream is = s.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                String msg = dis.readUTF();
                System.out.println(msg);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Client:

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Client {

    public static void main(String[] args){
      try {
          InetAddress i=InetAddress.getLocalHost();
          String st=i.getHostAddress();
          Socket s=new Socket(st,8888);

              new sendThread(s).start();
              new receiveThread(s).start();

      }catch (UnknownHostException e)
      {
          e.printStackTrace();
      }catch (IOException e)
      {
          System.out.println("对方已下线");
          e.printStackTrace();
      }
    }
}

server:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
   static  ServerSocket se;
   static Socket s;
    public static void main(String[] args) {

        Jframe f=new Jframe("server");
        f.setLocation(400,500);
        f.setSize(600, 650);
        JButton b1=new JButton("send");
        b1.setBounds(20,20,100,30);

        Jtextarea ja=new Jtextarea();

        ja.setLineWrap(true);//将参数设为true自动换行
        //如果是想每一次输入都是换行的话,那就在在上一次输入的最后加一个"rn"

        //调节Jtextarea的字体大小
        Font font=new Font("Default",Font.PLAIN,29);
        ja.setFont(font);

        ja.setSize(new Dimension(400,400));
        ja.setLocation(0,0);
        JTable jt=new JTable();
        jt.add(ja);//把文本域加入到表组件中 为使自动更新聊天内容
        jt.setLocation(150, 20);
        jt.setSize(new Dimension(400,500));

        JTextField jf=new JTextField();
        jf.setLocation(20,80);
        jf.setSize(new Dimension(100,50));

        try {
            ServerSocket ss=new ServerSocket(8888);
            System.out.println("监听在端口号:8888");
            Socket s=ss.accept();
            InputStream is= s.getInputStream();
            DataInputStream dis= new DataInputStream(is);
            OutputStream os=s.getOutputStream();
            DataOutputStream dos=new DataOutputStream(os);
            //接收
            Thread t1=new Thread() {
                public void run() {
                    //线程的While(true)里面放要循环的内容需要不停执行的内容,不需要不停执行的不必放
                    //按钮监听了发送,不需要发送线程了
                    while(true) {
                        try {
                            String s=dis.readUTF();
                            if(s!="") {
                                ja.append("client:"+s+"rn");
                                jt.updateUI();
                            }
                        } catch (IOException e) {
                            // TODO 自动生成的 catch 块
                            e.printStackTrace();
                        }
                    }
                }
            };  t1.start();

            b1.addMouseListener(new MouseAdapter(){
                public void mouseReleased(MouseEvent e) {
                    String s=jf.getText();
                    jf.setText(null);
                    //发送
                    try {
                        dos.writeUTF(s);ja.append("server:"+s+"rn");jt.updateUI();
                    } catch (IOException e1) {
                        // TODO 自动生成的 catch 块
                        e1.printStackTrace();
                    }
                }
            });

        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }

        f.add(b1);
        f.add(jf);
        f.add(jt);

        f.setLayout(null);
        f.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE);
        f.setVisible(true);
        
    }
}

一开始server的部分代码是准备利用receiveThread和sendThread这两个已有的线程的 起初用重载构造方法以为可以解决 之后发现run方法只能执行一种 其结果就是异常中断
也算是一个小项目 知道实现的过程中可以多新建类来实现 把整个功能代码模块化 server要实现图形界面可以另写 client就利用现有的两个收发线程。

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

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

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