黑马程序员_java_06_java网络编程

来源:互联网 发布:分析网站制订优化目标 编辑:程序博客网 时间:2024/06/05 20:32

------Java培训、Android培训、iOS培训、.Net培训、期待与您交

1.网络编程概述

网络编程就是涉及到多个电脑使用的程序。如果要设计多个电脑连接并传输数据就必须涉及到ip地址,和计算机的端口号,计算机的ip地址在同一个网段的唯一的,这样就能够确定一台计算机,然后在确定这台计算机上的哪个端口(端口确定计算机上面的访问程序)。这样两台计算机上面的同一款软件就能够实现通讯功能。

两台计算机能够实现通讯必须确定使用那种计算机通讯协议,在计算机中有两种网络传输协议udp协议和tcp协议。

Udp协议: Upd不需要建立链接就能传送数据,把需要传输的数据打成一个包,应用程序只管发送或接收数据不管对方是否能够收到。传输数据的速度较快,但是安全性较低。一般情况下在传输视频格式的文件时用udp协议传输。因为该方式无连接所以为不可靠协议。

Tcp:在使用tcp协议传输的过程中必须建立链接(三次握手)才能够通讯。

这种传输数据的方式教安全,但是效率较低。

在java中网络编程类的结构图如下图所示

2.基于UDP协议的编程方法

  在java中使用Udp协议传输数据,使用DatagramSocket类来完成数据的传输,使用DatagrammPacket类包装数据。

DatagramSocket类的使用规则

该类的三个常用构造方法

1.DatagramSocket()创建一个套接字对象,并把该对象绑定到可用的端口上面。

2.DatagramSocket(intport)创建一个套接字对象,并指定绑定本机端口号。

3.DatagramSocket(SocketAddress bindaddr) 创建一个套接字对象,并把该套接字对象绑定到指定的套接字地址。

该类常用方法介绍:

1.getInetAddress()该方法返回一个套接字链接地址的InetAddress对象。

2. voidreceive(DatagramPacket p) 从此套接字接收数据包

3. voidsend(DatagramPacket p) 从此套接字发送数据包

4. int getPort()该方法用于返回此套接字的端口号

5. void close() 关闭该套接字。

DatagramPacket类的使用规则

该类中的构造方法描述:

1.DatagramPacket(byte[]buf, int length) 创建一个数据包用来存储字节数组length长度的数据。

2. DatagramPacket(byte[]buf, int offset, int length) 创建一个数据包用来存储字节数组从offset到length长度的数据。

该类中的常用方法:

1. InetAddressgetAddress() 返回要发送到(接收到)数据包的地址

2. byte[]getData() 返回该数据包的缓冲区

3. int getLength()返回接收或发送的数据的长度。

练习一

建立一个文本转换器,客户端给服务器发送文本,服务端会将大写返回给客户端,而且客户端可以不断的进行文本转换。

import java.io.*;class UdpDemo2{public static void main(String[] args){}}class UdpSend2{public static void main(String[] args) throws Exception {DatagramSocket ds=new DatagramSocket(8888);BufferedReader br=new BufferedReader(new InputStreamReader(System.in));String line=null;while((line=br.readLine())!=null){if("886".equals(line)){break;}byte[] buf=line.getBytes();DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);ds.send(dp);}ds.close();}}class UdpReceive2{public static void main(String[] args) throws Exception{DatagramSocket ds=new DatagramSocket(10000);while(true){byte[] buf=new byte[1024];DatagramPacket dp=new DatagramPacket(buf,buf.length);ds.receive(dp);System.out.println(dp.getAddress()+"::"+new String(dp.getData(),0,dp.getLength()).toUpperCase()+"::"+dp.getPort());}}}


运行结果如下:

3.基于TCP协议的编程方法

在java语言中如果需要传输比较重要的数据,比如文件、图片等数据时用udp传输方式会造成文件损坏打不开的情况,这个时候我们就要选择使用tcp传输协议来完成我们的需求。Java在使用tcp协议传输的时候用到的是serverSocket,和socket类。

ServerSocket类是在服务器端使用的类主要用于描述服务器的功能。

ServerSocket类中的常用方法;

构造方法:

ServerSocket() 创建一个套接字服务器,但是该服务并没有绑定特定的端口。

ServerSocket(intport) 创建一个套接字服务器,但是该服务器绑定了port端口。

该类中的常用方法:

Socket accept() 监听服务端口,有客户端连接进来时返回一个socket对象。该方法在没有客户端链接进来之前一致处于阻塞状态。

InetAddressgetInetAddress()返回此套接字的所监听的InetAddress对象。

booleanisClosed() 返回该服务器是否已经关闭。

void close() 关闭此服务器对象。

Socket类的使用方式

该类用于计算机交互过程中描述客户端功能的对象。

该类中的常用方法:

  Socket() 创建一个客户端服务,但是该服务并没有链接地址和链接端口。

  Socket(InetAddress address, int port) ,Socket(String host, int port) 创建一个客户端服务器,该客户端服务器指定服务器端地址,及端口。

InetAddressgetInetAddress() 返回该套接字链接地址的InetAddress对象

InputStreamgetInputStream() 返回该套接字的字节输入流

OutputStreamgetOutputStream()返回该套接字的字节输出流

int getPort() 返回该套接字服务的端口号

voidshutdownInput() 向服务器发送字节输出流已经结束标识;

 void shutdownOutput() 向服务器发送字节输出流已经结束

练习二

向服务器上传一个图片文件,上传成功以后服务器返回“上传成功”提示

importjava.io.*;import java.net.*;classPicUpThread implements Runnable{  private Sockets;publicPicUpThread(Socket s){      this.s=s;} public voidrun(){           try{           InputStream is=s.getInputStream();      OutputStream os=newFileOutputStream("C:\\11.jpg");      byte[] b=new byte[1024];      int len=0;      while((len=is.read(b))!=-1)      {           os.write(b,0,len);      }      OutputStream ops=s.getOutputStream();      ops.write("File uploodsuccess".getBytes());      os.close();      s.close();      ops.close();      }catch(Exception e){            new RuntimeException("文件上传失败");      }} public staticvoid main(String[] args){     } }class PicServer{      public static void main(String[] args)throws Exception{           ServerSocket ss=new ServerSocket(10000);      while(true){      Socket s=ss.accept();      System.out.println(ss.getInetAddress().getHostAddress()+"lianjiejinlai");      new Thread(new PicUpThread(s)).start();      }} }class PicClinet{      public static void main(String[]args)throws Exception      {           Socket s=newSocket("192.168.0.37",10000);      InputStream is=newFileInputStream("c:\\1.jpg");      OutputStream pw=s.getOutputStream();      byte[] b=new byte[1024];      int len=0;      while((len=is.read(b))!=-1){           pw.write(b,0,len);      }      s.shutdownOutput();      InputStream ips=s.getInputStream();           byte[] sb=new byte[1024];           int slen=0;             slen=ips.read(sb);           System.out.println(newString(sb,0,slen));      is.close();      pw.close();     }               }


运行结果如下所示:

Url类的使用方式

类代表统一资源定位符,在java网络编程中代表网络地址的字符串。在其内部有各种方法得到网络地址的协议,服务器返回的数据,端口。等方法

url类中的常用方法介绍

构造方法总结

1.URL(Stringspec) 根据网络地址字符串创建一个URL对象。

2.URL(Stringprotocol, String host, int port, String file)  其中,protocol代表通信协议,host代表主机名,file代表文件名。如:new URL ("http" ,www.baidu.com, "/ test / a.text");

3. URL ( Stringprotocol , String host , int port , String file)

URL url = new URL ("http" , www.baidu.com, 80 , "/test / a.txt");

普通方法总结;

getDefaultPort(): 返回默认的端口号。

getFile(): 获得URL指定资源的完整文件名。

getHost(): 返回主机名。

getPath(): 返回指定资源的文件目录和文件名。

getPort(): 返回端口号,默认为-1。

getProtocol(): 返回表示URL中协议的字符串对象。

getRef(): 返回URL中的HTML文档标记,即#号标记。

getUserInfo: 返回用户信息。

toString: 返回完整的URL字符串。

InetAddress 类的使用方式

InetAddress类是吧网络链接的地址封装正对象,描述链接信息。

InetAddress类中的常用方法总结

该类中没有构造方法,所以想要得到该类的对象必须通过链接对象来返回该类的对象,比如。ServerSocket类中的,InetAddress getInetAddress() 、Socket类中的InetAddress getInetAddress()

该类中的普通方法:

getAddress(): 返回IP地址的字节形式。

getAllByName(): 返回指定主机名的IP地址。

getbyAddress(): 返回指定字节数组的IP地址形式。

getByName(): 返回指定主机名的IP地址对象。

getHostAddress(): 返回主机地址的字符串形式。

getLocalHost(): 返回当前主机名。

hastCode(): 返回InetAddress对象的哈希码。

toString: 返回地址转换成的字符串。

0 0
原创粉丝点击