Java多线程聊天器

Java多线程聊天器

最近学习java用多线程和IO写了一个简单的聊天器。了解了UDP和TCP协议。
UDP主要就是通过DatagramSocket打包数据发送数据,不管你收没收到,我知道我发了就行。
TCP需要建立链接,你要不建立链接就不能发东西。通过ServerSocket的通道用IO发送和接受数据。
(在这就不说UDP了直接说TCP)
TCP有发送端(客户端)和接收端(服务器)
测试类:

package TCP;

public class TCPChatRoom {
    public static void main(String[] args){
        ServerDemoThread sdt = new ServerDemoThread(true);
        ClientDemoThread cdt = new ClientDemoThread();
        cdt.start();
        sdt.start();
    }
}

因为先运行发送端会报错,所以我给接收端传入一个flag标记,在接收端定义一个带有boolean形参的构造函数,如果flagtrue则说明先启动了接收端可以继续运行,如果flagfalse则说明先启动了发送端,必须让发送端线程等待。在发送端线程调用wait()方法等flagtrue时调用notify()方法。

接收端(服务器):

package TCP;

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

public class ServerDemoThread extends Thread {
    public static boolean flag=false;
    public ServerDemoThread(boolean flag){
        this.flag = flag;
    }
    @Override
    public synchronized void run() {

//因为Thread类的run方法的没有跑出异常,所以在所有代码中必须将一场try catch,
	但是在try中可能无法创建对象,所以要在try外边创建,避免空指针异常。


        ServerSocket ss = null;
                Socket s = null;
        BufferedReader br = null;
        try {
        //指定端口
        
                ss = new ServerSocket(22222);
                //阻塞式接受
                s = ss.accept();
                //获取输入流
                br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String line = null;
            while ((line = br.readLine()) != null)
            {
                System.out.println(line);
            }
        }catch (IOException e)
             {
                 e.printStackTrace();
             }
			//最终释放资源
                 finally {
                 try {
                        s.close();
                     }catch (IOException e)
                            {
                                e.printStackTrace();
                            }
                        }
              }
        }

发送端(客户端):

package TCP;
import java.io.*;
import java.net.Socket;

public class ClientDemoThread extends Thread {

    @Override
    public synchronized void run() {


           	 if(!ServerDemoThread.flag){
            try {
            //如果先启动了发送线程,则flag=fales;就会进行等待
                this.wait();
            } catch (InterruptedException e) {e.printStackTrace(); }
             }
            else  {
            当
                this.notify();
                Socket s = null;
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
            	//指定发送位置的IP和端口号。
            	
                s = new Socket("192.168.1.100", 22222);
                //标准输入流,要发送的数据
                br = new BufferedReader(new InputStreamReader(System.in));
                //输出流,通过通道将数据流出
                bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            } catch (IOException e) {
                e.printStackTrace();
            }


            String line = null;

            try {
                while ((line = br.readLine()) != null) {

                    bw.write(line);
                    bw.newLine();
                    bw.flush();

                }

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

            }
            //释放资源
             finally {
                try {
                    s.close();
                } catch (IOException e) {e.printStackTrace(); }

            }
        }

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值