网络通信程序java.docx
《网络通信程序java.docx》由会员分享,可在线阅读,更多相关《网络通信程序java.docx(8页珍藏版)》请在冰豆网上搜索。
网络通信程序java
建立网络聊天程序
第一部分:
基本原理
1、DatagramSocket类:
相当于码头
////DatagramSocket类表示用来发送和接收数据报包的套接字
(1)publicDatagramSocket()
(2)publicDatagramSocket(intport)///模式获取本地IP地址
(3)publicDatagramSocket(intport,InetAddressladdr)
(4)DatagramSocket.close()
(5)publicvoidsend(DtagramPacketp)
(6)publicvoidreceive(DtagramPacketp)
2、DatagramPacket类:
相当于集装箱////DatagramPacket类表示数据报包
(1)publicDatagramPacket(byte[]buf,intlength)
(2)publicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)
3、InetAddress类
(1)InetAddress.getByName()
(2)InetAddress.getHostAddress()
第二部分:
简单的UDP程序
1、数据发送端代码
import.*;
publicclassUdpSend
{
publicstaticvoidmain(String[]args)throwsException
{
DatagramSocketds=newDatagramSocket();
Stringstr="helloworld";
DatagramPacketdp=newDatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("10.0.111.13"),3000);
ds.send(dp);
ds.close();
}
}
2、数据接收端代码
import.*;
publicclassUdpRecv
{
publicstaticvoidmain(String[]args)throwsException
{
DatagramSocketds=newDatagramSocket(3000);
byte[]buf=newbyte[1024];
DatagramPacketdp=newDatagramPacket(buf,1024);
ds.receive(dp);
StringstrRecv=newString(dp.getData(),0,dp.getLength())+"from"+
dp.getAddress().getHostAddress()+":
"+dp.getPort();
System.out.println(strRecv);
ds.close();
}
}
//注意:
需先运行接收端程序,再运行发送端程序
第三部分:
基于UDP的聊天程序
//本程序是一个聊天程序,可分三部分
//图形用户界面部分
//网络消息发送部分
//网络消息接收部分
importjava.awt.*;
importjava.awt.event.*;
import.*;
publicclassChat
{
Framef=newFrame("我的聊天室");
TextFieldtfIP=newTextField(15);
/*tfip是用于输入IP地址的文本框,在发送数据时,要取出其中的IP地址,所以将其定义成员变量,以便发送消息的程序代码访问*/
Listlst=newList(6);
/*lst是用于显示接收消息的列表框,在接收到数据时,要向其中增加新的纪录项,所以将其定义成员变量,以便发送消息的程序代码访问*/
DatagramSocketds;
/*由于DataGramSocket的构造函数可能抛出异常,我们的程序需要用try...catch语句进行异常捕获处理,所以不能直接在这里
调用DataGramSocket的构造函数对ds进行初始化,我们需要将ds的初始化放在chat类的构造函数中完成*/
publicChat()
{
try
{
ds=newDatagramSocket(3000);
}
catch(Exceptionex){ex.printStackTrace();}
newThread(newRunnable()
{
publicvoidrun()
{
bytebuf[]=newbyte[1024];
DatagramPacketdp=newDatagramPacket(buf,1024);
while(true)
{
try
{
ds.receive(dp);//接收数据
lst.add(newString(buf,0,dp.getLength())+":
from"+dp.getAddress().getHostAddress(),0);
}catch(Exceptione){e.printStackTrace();}
}
}
}).start();
}
publicstaticvoidmain(String[]args)
{
Chatchat=newChat();
chat.init();
}
publicvoidinit()
{
f.setSize(300,300);
f.add(lst);
Panelp=newPanel();
p.setLayout(newBorderLayout());
p.add("West",tfIP);//在panel上加载IP地址textfield
TextFieldtfData=newTextField(20);
p.add("East",tfData);//在panel上加载消息发送textfield
f.add("South",p);//在frame上加载panel
f.setVisible(true);
f.setResizable(false);//限制用户改变窗口的大小
//增加关闭窗口的事件处理代码
f.addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEvente)
{
ds.close();//程序退出时,关闭socket,释放相关资源
f.setVisible(false);
f.dispose();
System.exit(0);
}
});
//增加在消息文本框中按下回车键的事件处理代码
tfData.addActionListener(newActionListener()
{
publicvoidactionPerformed(ActionEvente)
{
//取出文本框中的消息字符串,并将其转换成字节数组
byte[]buf;
buf=e.getActionCommand().getBytes();
try
{
DatagramPacketdp=newDatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),3000);
ds.send(dp);//发送数据
}catch(Exceptionex){ex.printStackTrace();}
((TextField)e.getSource()).setText("");
}
});
}
}
//思考:
如何在局域网中广播发送数据
在Java中操纵UDP
使用位于JDK中J包下的DatagramSocket和DatagramPacket类,可以非常方便地控制用户数据报文。
在描述它们之前,必须了解位于同一个位置的InetAddress类。
InetAddress实现了Java.io.Serializable接口,不允许继承。
它用于描述和包装一个InternetIP地址,通过三个方法返回InetAddress实例:
getLocalhost():
返回封装本地地址的实例。
getAllByName(Stringhost):
返回封装Host地址的InetAddress实例数组。
getByName(Stringhost):
返回一个封装Host地址的实例。
其中,Host可以是域名或者是一个合法的IP地址。
DatagramSocket类用于创建接收和发送UDP的Socket实例。
和Socket类依赖SocketImpl类一样,DatagramSocket类的实现也依靠专门为它设计的DatagramScoketImplFactory类。
DatagramSocket类有3个构建器:
DatagramSocket():
创建实例。
这是个比较特殊的用法,通常用于客户端编程,它并没有特定监听的端口,仅仅使用一个临时的。
DatagramSocket(intport):
创建实例,并固定监听Port端口的报文。
DatagramSocket(intport,InetAddresslocalAddr):
这是个非常有用的构建器,当一台机器拥有多于一个IP地址的时候,由它创建的实例仅仅接收来自LocalAddr的报文。
值得注意的是,在创建DatagramSocket类实例时,如果端口已经被使用,会产生一个SocketException的异常抛出,并导致程序非法终止,这个异常应该注意捕获。
DatagramSocket类最主要的方法有4个:
Receive(DatagramPacketd):
接收数据报文到d中。
receive方法产生一个“阻塞”。
Send(DatagramPacketd):
发送报文d到目的地。
SetSoTimeout(inttimeout):
设置超时时间,单位为毫秒。
Close():
关闭DatagramSocket。
在应用程序退出的?
焙颍ǔ;嶂鞫头抛试矗乇誗ocket,但是由于异常地退出可能造成资源无法回收。
所以,应该在程序完成时,主动使用此方法关闭Socket,或在捕获到异常抛出后关闭Socket。
“阻塞”是一个专业名词,它会产生一个内部循环,使程序暂停在这个地方,直到一个条件触发。
DatagramPacket类用于处理报文,它将Byte数组、目标地址、目标端口等数据包装成报文或者将报文拆卸成Byte数组。
应用程序在产生数据包是应该注意,TCP/IP规定数据报文大小最多包含65507个,通常主机接收548个字节,但大多数平台能够支持8192字节大小的报文。
DatagramPacket类的构建器共有4个:
DatagramPacket(byte[]buf,intlength,InetAddressaddr,intport):
从Buf数组中,取出Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport):
从Buf数组中,取出Offset开始的、Length长的数据创建数据包对象,目标是Addr地址,Port端口。
DatagramPacket(byte[]buf,intoffset,intlength):
将数据包中从Offset开始、Length长的数据装进Buf数组。
DatagramPacket(byte[]buf,intlength):
将数据包中Length长的数据装进Buf数组。