《Java语言》课件第12章_第1页
《Java语言》课件第12章_第2页
《Java语言》课件第12章_第3页
《Java语言》课件第12章_第4页
《Java语言》课件第12章_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第12章

Java的网络编程12.1网络编程基础12.2Socket通信12.3无连接的数据报12.4URL访问12.1.1网络协议TCPUDP12.1.2InetAddress类InetAddress对象用如下格式表示主机的信息:/0InetAddress的主要方法staticInetAddressgetByName(Stringhost)

staticInetAddressgetLocalHost()StringgetHostAddress()StringgetHostName()

如何得到当前计算机的IP地址1、Socket类Socket(String,int)----构造一个连接指定主机、指定端口的流Socket。

Socket(String,int,boolean)---构造一个连接指定主机、指定端口的Socket类,boolean类型的参数用来设置是流Socket还是数据报Socket。

Socket(InetAddress,int)----构造一个连接指定Internet地址、指定端口的流Socket。

Socket(InetAddress,int,boolean)----构造一个连接指定Internet地址、指定端口的Socket类,boolean类型的参数用来设置是流Socket还是数据报Socket。

2、ServerSocket类ServerSocket(int)

在指定端口上构造一个ServerSocket类。ServerSocket(int,int)在指定端口上构造一个ServerSocket类,并进入监听状态,第二个int类型的参数是监听时间长度。

3、建立连接与数据通信例12-1一个最简单的Socket通信演示程序程序1:服务方程序import.*;

importjava.io.*;

publicclassSimpleServer{

publicstaticvoidmain(Stringargs[]){

ServerSockets=null;

try{

s=newServerSocket(5432);//规定服务端口

}catch(IOExceptione){}

程序1:服务方程序(续)while(true){

try{

Sockets1=s.accept();

OutputStreams1out=s1.getOutputStream();

DataOutputStreamdos=newDataOutputStream(s1out);

dos.writeUTF("HelloWorld!");

System.out.println("aclientisconneted….");

s1.close();

}catch(IOExceptione){}

}

}

}无连接请求时阻塞程序2:客户方程序import.*;importjava.io.*;

publicclassSimpleClient{

publicstaticvoidmain(Stringargs[])throwsIOException{

Sockets1;

DataInputStreamdis;

s1=newSocket("localhost",5432);

InputStreams1In=s1.getInputStream();

DataInputStreamdis=newDataInputStream(s1In);

Stringmessage=newString(dis.readUTF());

System.out.println(message);

s1.close();

}

}请求连接简单的多用户聊天程序import.*;

importjava.io.*;

publicclassSimpleTalkServer{

publicstaticClient[]allclient=newClient[20];//存放所有通信线程

publicstaticintclientnum=0;//连接客户数

publicstaticvoidmain(Stringargs[]){

try{

ServerSockets=newServerSocket(5432);

while(true){

Sockets1=s.accept();//等待客户连接

DataOutputStreamdos=newDataOutputStream(s1.getOutputStream());

DataInputStreamdin=newDataInputStream(s1.getInputStream());

allclient[clientnum]=newClient(clientnum,dos,din);

//创建与客户对应的通信线程

allclient[clientnum].start();

clientnum++;

}

}catch(IOExceptione){}

}

}classClientextendsThread{

intid;//客户标识

DataOutputStreamdos;//去往客户的输出流

DataInputStreamdin;//来自客户的输入流

publicClient(intid,DataOutputStreamdos,DataInputStreamdin){

this.id=id;

this.dos=dos;

this.din=din;

}

publicvoidrun(){

while(true){

try{

Stringmessage=din.readUTF();

intm=SimpleTalkServer.clientnum;

for(inti=0;i<m;i++){

SimpleTalkServer.allclient[i].dos.writeUTF(message);

}

}catch(IOExceptione){}

}

}

}聊天客户端import.*;

importjava.io.*;

importjava.awt.event.*;

importjava.awt.*;

publicclassSimpleTalkClient{

publicstaticvoidmain(Stringargs[])throwsIOException{

Sockets1=newSocket(args[0],5432);

DataInputStreamdis=newDataInputStream(s1.getInputStream());

finalDataOutputStreamdos=newDataOutputStream(s1.getOutputStream());

Framemyframe=newFrame("client");

Panelpanelx=newPanel();

finalTextFieldinput=newTextField(20

TextAreadisplay=newTextArea(5,20);

panelx.add(input);

panelx.add(display);

myframe.add(panelx);

newreceiveThread(dis,display);//创建一个接收数据线程

input.addActionListener(newActionListener(){

publicvoidactionPerformed(ActionEvente){

try{

dos.writeUTF("client:"+input.getText());

}catch(IOExceptionz){}

}

}

);

myframe.setSize(300,300);

myframe.setVisible(true);

}

}

classreceiveThreadextendsThread{

DataInputStreamdis;

TextAreadisplayarea;

publicreceiveThread(DataInputStreamdis,TextAream){

this.dis=dis;

displayarea=m;

this.start();

}

publicvoidrun(){

for(;;){

try{

Stringstr=newString(dis.readUTF());//读取其他客户经服务器转发的消息

displayarea.append(str+"\n");//将消息添加到文本域显示

}catch(IOExceptione){}

}

}

}1、DatagramPacket类构造方法DatagramPacket(byte[],int)

构造一个用于接收数据报的DatagramPacket类,byte[]类型的参数是接收数据报的缓冲,int类型的参数是接收的字节数。DatagramPacket(byte[],int,InetAddress,int)

构造一个用于发送数据的DatagramPacket类,byte[]类型参数是发送数据的缓冲区,int类型参数是发送的字节数,InetAddress类型参数是接收机器的Internet地址,最后一个参数是接收的端口号。2、DatagramSocket类DatagramSocket()构造一个用于发送数据报的DatagramSocket类。DatagramSocket(int)构造一个用于接收数据报的DatagramSocket类,参数为接收端口号。3、发送和接收过程接收端先建立一个接收的DatagramSocket,在指定端口上监听,构造一个DatagramPacket类指定接收的缓冲区发送端需要首先构造DatagramPacket类,指定要发送的数据、数据长度、接收主机地址及端口号,然后使用DatagramSocket类来发送数据报。接收端接收到后,将数据保存到缓冲区.接收端的程序byte[]inbuffer=newbyte[1024];DatagramPacketinpacket=newDatagramPacket(inbuffer,inbuffer.length);DatagramSocketinsocket=newDatagramSocket(80);insocket.receive(inpacket);

Strings=newString(inbuffer,0,0,inpacket.getLength());缓冲区用来存放数据报发送端的程序DatagramPacketoutpacket=newDatagramPacket(message,200,"",80);DatagramSocketoutsocket=newDatagramSocket();outsocket.send(outpacket);

要发送的数据例12-3利用数据包发送信息或文件

程序1:发送程序

importjava.io.*;

import.*;

publicclassUDPSend{

publicstaticfinalStringusage="用法:javaUDPSend<hostname><port>

<msg>...\n"+"或javaUDPSend<hostname><port>-f<file>";

publicstaticvoidmain(Stringargs[]){

try{

if(args.length<3)

thrownewIllegalArgumentException("参数个数不对");

Stringhost=args[0];

intport=Integer.parseInt(args[1]);

byte[]message;

if(args[2].equals("-f")){

Filef=newFile(args[3]);

intlen=(int)f.length();

message=newbyte[len];

FileInputStreamin=newFileInputStream(f);

intbytes_read=0;

in.read(message,bytes_read,len);//从文件读数据到字节数组

}

else{

Stringmsg=args[2];

for(inti=3;i<args.length;i++)msg+=""+args[i];

message=msg.getBytes();

}

InetAddressaddress=InetAddress.getByName(host);

DatagramPacketpacket=newDatagramPacket(message,

message.length,address,port);

DatagramSocketdsocket=newDatagramSocket();

dsocket.send(packet);

dsocket.close();

}catch(Exceptione){

System.err.println(e);

System.err.println(usage);

}

}

}程序2:接收程序

importjava.io.*;

import.*;

publicclassUDPReceive{

publicstaticfinalStringusage="用法:javaUDPReceive<port>";

publicstaticvoidmain(Stringargs[]){

try{

if(args.length!=1)

thrownewIllegalArgumentException("参数个数不足");

intport=Integer.parseInt(args[0]);

DatagramSocketdsocket=newDatagramSocket(port);

byte[]buffer=newbyte[2048];

DatagramPacketpacket=newDatagramPacket(buffer,buffer.length);

for(;;){

dsocket.receive(packet);//接收数据报

Stringmsg=newString(buffer,0,packet.getLength());

System.out.println(packet.getAddress().getHostName()+":"+msg);

}

}catch(Exceptione){

System.err.println(e);

System.err.println(usage);

}

}

}测试程序时,要首先运行接收程序,接收程序运行时需要提供一个端口号,该程序将无限循环反复等待接收来自发送方的数据报。发送程序需要的参数较多,首先要给定目标主机地址、端口号,接下来如果要发送文件内容,则-f后接文件名;否则,剩下的所有参数均作为发送内容。12.3.4数据报多播所谓多播就是发送一个数据报文,所有组内成员均可接收到。多播通信使用D类IP地址,地址范围为:~55。发送广播的主机给指定多播地址的特定端口发送消息。接收广播的主机必须加入到同一多播地址指定的多播组中,并从同样端口接收数据报。MulticastSocket是DataPacketSocket的子类。常用构造方法如下:MulticastSocket():创建一个多播Socket,可用于发送多播消息;MulticastSocket(intport):创建一个与指定端口捆绑的多播Socket,可用于收发多播消息。(1)接收多播数据

接收方首先通过使用发送方数据报指定的端口号创建一个MulticastSocket对象,通过该对象调用joinGroup(InetAddressgroup)方法将自己登记到一个多播组中。然后,就可用MulticastSocket对象的receive方法接受数据报。在不需要接收数据时,可调用leaveGroup(InetAddressgroup)方法离开多播组。(2)发送多播数据

用MulticastSocket对象的send方法发送数据报。由于在发送数据报中已指定了多播地址和端口,发送方创建MulticastSocket对象时可用不指定端口的构造方法。以下为实现数据报多播的关键代码:Stringmsg="Hello";InetAddressgroup=InetAddress.getByName("");MulticastSockets=newMulticastSocket(6789);s.joinGroup(group);//加入多播组DatagramPackethi=newDatagramPacket(msg.getBytes(),msg.length(),group,6789);//创建要发送的数据报s.send(hi);//发送接收多播数据报

byte[]buf=newbyte[1000];DatagramPacketrecv=newDatagramPacket(buf,buf.length);s.receive(recv);实际应用中,发送数据是主动的动作,而接收数据是被动的动作,为了不至于阻塞应用,接收可以创建一个专门的线程,让其循环等待接收数据。例12-4基于数据报多播技术的简单讨论区

publicclassTalkextendsFrameimplementsRunnable{MulticastSocketmSocket;//用于接收的MulticastSocket对象

TextAreadisplay;//显示消息的文本域

TextFieldinput;//发送信息的文本框

publicTalk(){super("多播测试");try{mSocket=newMulticastSocket(7777);InetAddressinetAddress=InetAddress.getByName("");receiveSocket.joinGroup(inetAddress);}catch(Exception){}display=newTextArea(5,40);input=newTextField(20);add("South",input);add("Center",display);setSize(200,400);setVisible(true);

input.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){try{byte[]data=input.getText().getBytes();//将文本框的输入串转化为字节

input.setText("");InetAddressinetAddress=InetAddress.getByName("");DatagramPacketdatagramPacket=newDatagramPacket(data,data.length,inetAddress,7777);mSocket.send(datagramPacket);}catch(Exceptione){}}});}

publicstaticvoidmain(String[]args){Talks=newTalk();newThread(s).start();}publicvoidrun(){//循环读取用户发送的消息.try{while(true){byte[]data=newbyte[200];//定义一个字节缓冲区用于存放接收数据

DatagramPac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论