网络编程-UDP协议---简单聊天室程序

Udp发送端的步骤:

1,  创建发送端

DatagramSocket ds=new DatagramSocket();

2,  创建发送端数据包

String str=”我的发送端的数据”

Byte[] buf=str.getBytes();

DatagramPacket dp=new DatagramPacket(buf,0,buf.length,InetAddress.getByName(“localhost”),8888);

3,  发送数据

Ds.send(dp);

4,  关闭发送端

Ds.close();

 

Udp接收端的步骤:

1,  创建接收端

DatagramSocket ds=new DatagramSocket(8888);

2,  创建接收端数据包

Byte[] buf=new byte[1024];

DatagramPacket dp=new DatagramPacket(buf,buf.length);

3,  接收数据

Ds.receive(dp);

4,  处理接收到的数据(解析)

String ip=dp.getAddress().getHostAddress();

Int port=dp.getPort();

String str=new String(dp.getData(),0,dp.getLength());

5,  关闭接收端

Ds.close();





发送端:

package cn.itheima.cway.chatrom;

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

/**
 * 发送端
 * 
 * @author 超哥
 * 
 */
class Send implements Runnable {
	private DatagramSocket ds=null;

	public Send(DatagramSocket ds) {
		this.ds = ds;

	}

	public void run() {
		//接收一个键盘输入
		BufferedReader sen = new BufferedReader(new InputStreamReader(
				System.in));
		//定义一个接收键盘输入的字符串暂存
		String buf=null;
 		try {
			while ((buf = sen.readLine()) != null) {

				// 键盘输入转换为byte数组
				byte[] buff=buf.getBytes();
				//创建一个发送数据包
				DatagramPacket dp = new DatagramPacket(buff,buff.length, InetAddress.getByName("192.168.0.255"),10001);
				//发送数据
				ds.send(dp);
				//如果数据包含over则退出
				if(buff.equals("over"))
					break;
				//ds.close();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

接收端:

package cn.itheima.cway.chatrom;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
 
	/**
	 * 接收端
	 * @author 超哥
	 *
	 */
	class Rece implements Runnable{
		private DatagramSocket ds=null;
		 public Rece(DatagramSocket ds)
		 {
			 this.ds=ds;
		 }
		public void run() {
			 while(true)
			 {
				 //创建一个结束数据的字节数组缓存
				 byte[] buf=new byte[1024];
				 //创建接收数据包对象
				 DatagramPacket dp=new DatagramPacket(buf,buf.length);
				 try {
					 //接收数据
					ds.receive(dp);
					//获取数据中的ip地址
					String ip=dp.getAddress().getHostAddress();
					//接收数据中的端口号
					int port=dp.getPort();
					//接收数据内容
					String text=new String(dp.getData(),0,dp.getLength());
					System.out.println(ip+"-"+port+":\t"+text);
				} catch (IOException e) {
					e.printStackTrace();
				}
				 
			 }
			
		}
		
	}
 


主程序:


package cn.itheima.cway.chatrom;

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

public class ChatRom {

	/**
	 * 聊天室 需求:使用UDP协议完成一个简单的聊天室功能,如果用户输入over则退出
	 * @throws SocketException 
	 * 
	 */
	public static void main(String[] args) throws SocketException {
		
 		new Thread(new Send(new DatagramSocket())).start();
		new Thread(new Rece(new DatagramSocket(10001))).start();
	}

}

DatagramSocket:

构造方法摘要
 DatagramSocket()
          构造数据报套接字并将其绑定到本地主机上任何可用的端口。
protectedDatagramSocket(DatagramSocketImpl impl)
          创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
 DatagramSocket(int port)
          创建数据报套接字并将其绑定到本地主机上的指定端口。
 DatagramSocket(int port,InetAddress laddr)
          创建数据报套接字,将其绑定到指定的本地地址。
 DatagramSocket(SocketAddress bindaddr)
          创建数据报套接字,将其绑定到指定的本地套接字地址。

提供的常用方法:


 voidreceive(DatagramPacket p)
          从此套接字接收数据报包。
 voidsend(DatagramPacket p)
          从此套接字发送数据报包。


DatagramPacket:

构造方法摘要
DatagramPacket(byte[] buf, int length)
          构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length,InetAddress address, int port)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length)
          构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
DatagramPacket(byte[] buf, int offset, int length,InetAddress address, int port)
          构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address)
          构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length,SocketAddress address)
          构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

常用方法:

InetAddressgetAddress()
          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
 byte[]getData()
          返回数据缓冲区。
 intgetLength()
          返回将要发送或接收到的数据的长度。
 intgetOffset()
          返回将要发送或接收到的数据的偏移量。
 intgetPort()
          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
 SocketAddressgetSocketAddress()
          获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值