您的位置:首页 > 理论基础 > 计算机网络

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

2013-12-15 17:13 721 查看
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()


          构造数据报套接字并将其绑定到本地主机上任何可用的端口。
protected
DatagramSocket(DatagramSocketImpl impl)


          创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
 
DatagramSocket(int port)


          创建数据报套接字并将其绑定到本地主机上的指定端口。
 
DatagramSocket(int port,InetAddress laddr)


          创建数据报套接字,将其绑定到指定的本地地址。
 
DatagramSocket(SocketAddress bindaddr)


          创建数据报套接字,将其绑定到指定的本地套接字地址。
提供的常用方法:

 void
receive(DatagramPacket p)


          从此套接字接收数据报包。
 void
send(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
的包发送到指定主机上的指定端口号。
常用方法:

InetAddress
getAddress()


          返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
 byte[]
getData()


          返回数据缓冲区。
 int
getLength()


          返回将要发送或接收到的数据的长度。
 int
getOffset()


          返回将要发送或接收到的数据的偏移量。
 int
getPort()


          返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
 SocketAddress
getSocketAddress()


          获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: