JAVA_NET - 【UDP聊天室】DatagramSocket

目录

  • InetAddress类的基本使用
  •  DatagramSocket
  •  DatagramPacket
  •  多进程聊天室
  •  多线程聊天室


<一> InetAddress类

注意:该类对外不提供构造方法,使用静态方法getByXxx可以获得相应对象;

附加:对比【单例设计模式】

JAVA_NET - 【UDP聊天室】DatagramSocket_第1张图片

<二> DatagramSocket

全称:数据报套接字

接收数据的一端实例对象时需要传入port,指定监听该端口;

发送数据的一端实例对象默认无参即可;

<三> DatagramPacket

全称:数据报包

// 封装数据包
byte[] bys = line.getBytes();
int length = bys.length;
InetAddress ip = InetAddress.getByName("192.168.0.105");
int port = 10001;
DatagramPacket dp = new DatagramPacket(bys, length, ip, port);

//解析方法
dp.getAddress().getHostAddress();
dp.getData();
dp.getLength();

<四> 多进程聊天室

JAVA_NET - 【UDP聊天室】DatagramSocket_第2张图片

Server.java

package kyleeo.util_02_udp;

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

/*
 * UDP
 * Server端用于接收与显示数据
 * a) 创建Socket对象 DatagramSocket,绑定监听的端口
 * b) 产生一个对象用于接收数据 DatagramPacket
 * c) 调用Socket的接收方法 receive
 * d) 数据解析与显示(获取发送方的IP、收到的数据、数据实际长度)
 * e) 释放资源 close
 */
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		// 创建Socket对象
		DatagramSocket socket = new DatagramSocket(10001);

		for (;;) {
			// 创建数据包,用于接收
			byte[] bys = new byte[1024];
			int length = bys.length;
			DatagramPacket dp = new DatagramPacket(bys, length);

			// 调用Socket的接收方法
			socket.receive(dp);

			// 解析数据
			String ipAddr = dp.getAddress().getHostAddress();
			byte[] bys2 = dp.getData();
			int length2 = dp.getLength();
			String recvData = new String(bys2, 0, length2);
			System.out.println(ipAddr + ":" + recvData);
		}
		// 释放资源
		// socket.close();
	}
}

Client.java

package kyleeo.util_02_udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDP
 * Client用于发送数据
 * a) 创建Socket客户端 DatagramSocket
 * b) 封装数据对象 DatagramPacket
 * c) 调用Socket的发送方法 send
 * d) 释放资源 close
 */
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		// 创建Socket
		DatagramSocket socket = new DatagramSocket();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "GBK"));
		String line = null;
		while ((line = br.readLine())!= null) {
			if(line.trim().equals("quit")) {
				break;
			}			
			// 封装数据包
			byte[] bys = line.getBytes();
			int length = bys.length;
			InetAddress ip = InetAddress.getByName("192.168.0.105");
			int port = 10001;
			DatagramPacket dp = new DatagramPacket(bys, length, ip, port);

			// 发送数据
			socket.send(dp);
		}
		// 释放资源
		socket.close();
	}
}

<五> 多线程聊天室

JAVA_NET - 【UDP聊天室】DatagramSocket_第3张图片

ChatRoom.java

package kyleeo.util_02_udp;

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

public class ChatRoom {
	public static void main(String[] args) throws IOException {
		//创建接收与发送套接字
		DatagramSocket dsServer = new DatagramSocket(10001);
		DatagramSocket dsClient = new DatagramSocket();
		
		//创建接收与发送线程
		Thread recvTh = new ReceiveThread(dsServer);
		Thread sendTh = new SendThread(dsClient);
		
		recvTh.start();
		sendTh.start();
	}
}

ReceiveThread.java

package kyleeo.util_02_udp;

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

public class ReceiveThread extends Thread implements Runnable {
	private DatagramSocket ds= null;
	
	public ReceiveThread(DatagramSocket ds) {
		this.ds = ds;
	}
	@Override
	public void run() {
		try {
			for (;;) {
				// 创建数据包,用于接收
				byte[] bys = new byte[1024];
				int length = bys.length;
				DatagramPacket dp = new DatagramPacket(bys, length);

				// 调用Socket的接收方法
				ds.receive(dp);

				// 解析数据
				String ipAddr = dp.getAddress().getHostAddress();
				byte[] bys2 = dp.getData();
				int length2 = dp.getLength();
				String recvData = new String(bys2, 0, length2);
				System.out.println(ipAddr + ":" + recvData);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

SendThread.java

package kyleeo.util_02_udp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendThread extends Thread implements Runnable {
	private DatagramSocket ds = null;

	public SendThread(DatagramSocket ds) {
		this.ds = ds;
	}

	@Override
	public void run() {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "GBK"));
			String line = null;
			while ((line = br.readLine()) != null) {
				if (line.trim().equals("quit")) {
					break;
				}
				// 封装数据包
				byte[] bys = line.getBytes();
				int length = bys.length;
				InetAddress ip = InetAddress.getByName("192.168.0.105");
				int port = 10001;
				DatagramPacket dp = new DatagramPacket(bys, length, ip, port);

				// 发送数据
				ds.send(dp);
			}
			// 释放资源
			ds.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

 

 

你可能感兴趣的:(JAVA,JAVA,网络编程,聊天室)