网络通信程序java.docx

上传人:b****1 文档编号:2176780 上传时间:2023-05-02 格式:DOCX 页数:8 大小:17.43KB
下载 相关 举报
网络通信程序java.docx_第1页
第1页 / 共8页
网络通信程序java.docx_第2页
第2页 / 共8页
网络通信程序java.docx_第3页
第3页 / 共8页
网络通信程序java.docx_第4页
第4页 / 共8页
网络通信程序java.docx_第5页
第5页 / 共8页
网络通信程序java.docx_第6页
第6页 / 共8页
网络通信程序java.docx_第7页
第7页 / 共8页
网络通信程序java.docx_第8页
第8页 / 共8页
亲,该文档总共8页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

网络通信程序java.docx

《网络通信程序java.docx》由会员分享,可在线阅读,更多相关《网络通信程序java.docx(8页珍藏版)》请在冰点文库上搜索。

网络通信程序java.docx

网络通信程序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数组。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2