网络编程UDP_手写聊天室

在之前的代码上增加了多线程-之前代码请点击
发送类

package UDP_在线咨询;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;

public class Talk_Send implements Runnable {
	private DatagramSocket socket;
	private String toIp;//ip
	private int toPort;//端口
	private BufferedReader read;
	public Talk_Send(int port,String toIp,int toPort) {
	try {
		System.out.println("发送工作"); 
		this.toIp =toIp;
		this.toPort =toPort;
		socket=new DatagramSocket(port);
		read =new BufferedReader(new InputStreamReader(System.in));//system.in 不用while 但是可以不停输入,估计是全程可以输入
	} catch (SocketException e) {	
		e.printStackTrace();
	} 
	}
	@Override
	public void run() {
		while(true) {
		String str=null ;
		try {
			str =read.readLine();
			if(str.equals("bye")) {//判断是否结束
				socket.close();
				break;
			}
			byte [] buf =new byte[1024*60];
			buf=str.getBytes();
			DatagramPacket packet =new DatagramPacket(buf, buf.length,new InetSocketAddress(toIp, toPort));
			socket.send(packet);
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		}
		
		}
	
}

接收类

package UDP_在线咨询;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Talk_Receive implements Runnable {
	private DatagramSocket receive;
	private byte [] buf;
	private DatagramPacket pack;
	private String from;
public Talk_Receive(int port,String from) {
		try {
			this.from =from;
			receive =new DatagramSocket(port);
			System.out.println("接收端工作"); 
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		while(true) {
		try {
			buf=new byte[1024*60];
			pack = new DatagramPacket(buf, buf.length);
			receive.receive(pack);
			byte [] datas =pack.getData();
			String news=new String(datas,0,datas.length);
			if(news.equals("bye")) {
				receive.close();
				break;
			}
			System.out.println(from+":"+news);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
		}

}

客户端(学生)

package UDP_在线咨询;//待改进 接收端改为保护线程

public class Talk_student {
public static void main(String[] args) {
	Thread receive= new Thread(new Talk_Receive(9999, "小美"));
	receive.setDaemon(true);
	receive.start();
	
	new Thread(new Talk_Send(5555, "localhost", 6666)).start();
}
}

客户端(老师)

package UDP_在线咨询;//待改进 接收端改为保护线程

public class Talk_teacher {
public static void main(String[] args) {
	new Thread(new Talk_Send(8888, "localhost", 9999)).start();
	Thread receive =new Thread(new Talk_Receive(6666, "冯老师"));
	receive.setDaemon(true);
	receive.start();
}
}

在这里插入图片描述

发布了27 篇原创文章 · 获赞 5 · 访问量 632

猜你喜欢

转载自blog.csdn.net/qq_44620773/article/details/104226901