多线程图形界面聊天

把收发线程独立出去——单独写成一个类 ,只创立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自动换行
        //如果是想每一次输入都是换行的话,那就在在上一次输入的最后加一个"\r\n"

        //调节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+"\r\n");
                                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+"\r\n");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就利用现有的两个收发线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值