黑马程序员Java__网络编程

------- android培训java培训、期待与您交流! ----------

13 网络编程


                 TCP:是可靠的,面向连接的、连续的、流的协议。


                 UDP:是一种无向的连接


端口:端口号是从0-65535(其中0-1023是系统保留的)。


                 URL:(Uniform Resource Locator)是资源定位符的简称,它声明了internet上某一资源的地址。


                 常用的方法:


                  URL(String spec) 根据 String 表示形式创建 URL 对象。


                  String getProtocol() 获取此 URL 的协议名称。


                  String getHost() 获取此 URL 的主机名(如果适用)。


                  String getPath() 获取此 URL 的路径部分。


                  int getPort() 获取此 URL 的端口号。


                  String getFile() 获取此 URL 的文件名。


                  String getFile() 获取此 URL 的文件名。


                  String getRef() 获取此 URL 的锚点(也称为“引用”)。


 


                java读取并处理网络上文件内容的步骤如下:


                  (1)创建一个URL类型的对象


                       URL  url = new URL("http://www.163.com");


                   (2)利用URL类的openStream方法获得对应的InputStream对象


                      InputStream in=url.openStream();


                   (3)将InputStream转换成为DataInputStream


                      DataInputStream data = new DataInputStream(in);


                      //创建一个字节数组


                      byte[] buf=new byte[1024];


                      int len=0;


                   (4)读取内容并处理。


                      while((len=data.read(buf))!=-1){


                         System.out.println(new String(buf,0,len));


                                         }


                            in.close();


                           }


                  


             java提供了套接口类(Socket)和服务套接口类(ServerSocket)作为标准的TCP套接口编程技术,通过货位可以实现主机与主机之间的对话。


                 


                


             Socket类提供的方法:


                              Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。


                              void close() 关闭此套接字


                              void connect(SocketAddress endpoint) 将此套接字连接到服务器。


                              void connect(SocketAddress endpoint, int timeout) 将此套接字连接到服务器,并指定一个超时值。


                              InetAddress getInetAddress() 返回套接字连接的地址。


                              InputStream getInputStream() 返回此套接字的输入流。


                              OutputStream getOutputStream()  返回此套接字的输出流。


                              void shutdownInput() 此套接字的输入流置于“流的末尾”。


                              void shutdownOutput() 禁用此套接字的输出流。


                              int getLocalPort() 返回此套接字绑定到的本地端口。 


                              InetAddress getLocalAddress() 获取套接字绑定的本地地址。


                              int getLocalPort() 返回此套接字绑定到的本地端口。


                              int getPort() 返回此套接字连接到的远程端口


                              boolean isClosed() 返回套接字的关闭状态。


                              boolean isConnected() 返回套接字的连接状态


                              void setSoTimeout(int timeout) 启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。


 


                                  /**


                                 需求:利用socket向服务端发送数据


                              1 创建客户端socket服务,指定目的主机和端口


                              2 获取socket流中的输出流


                              3 将数据打印在控制台中


                              4 关闭服务


       */


      public static void client()throws Exception{


           // 创建客户端socket服务,指定目的主机和端口


           Socket  c = new Socket("127.0.0.1",8899);


           //获取socket流中的输出流


                 OutputStream out=c.getOutputStream();   


             //将数据打印在控制台中


                 out.write("socket is comming".getBytes());


                   //关闭资源


                c.close();


      }


 


  ServerSocket:此类实现服务器套接字。


常用方法如下:


 Socket accept() 
          侦听并接受到此套接字的连接。 
 void bind(SocketAddress endpoint) 
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
 void bind(SocketAddress endpoint, int backlog) 
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。 
 void close() 
          关闭此套接字。 
 InetAddress getInetAddress() 
          返回此服务器套接字的本地地址。 
 int getLocalPort() 
          返回此套接字在其上侦听的端口。 
 boolean isBound() 
          返回 ServerSocket 的绑定状态。 
 boolean isClosed() 
          返回 ServerSocket 的关闭状态。 
static void setSocketFactory(SocketImplFactory fac) 
          为应用程序设置服务器套接字实现工厂。 
 void setSoTimeout(int timeout) 
          通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。 
 String toString() 
          作为 String 返回此套接字的实现地址和实现端口。


 /*


      * 需求:定义端点接收数据并打印在控制台上。
      * 服务端:
      * 1建立服务端的Serversocket,并监听一个端口。
      * 2获取连接过来的客户端对象;
      * 通过serversocket.accpet(),没有连接就等,所以这个方法阻塞式的
      * 3用客户端s.getInputStream获取客户端发送过来的数据,并打印在控制台上
      * 4关闭服务(可选操作)
      *
      */
 
public class SocketServer {
          
    public static void server()throws Exception{
    //建立服务端的Serversocket,并监听一个端口。
    ServerSocket server = new ServerSocket(8899);
    //获取连接过来的客户端对象;
    Socket s=server.accept();
    //用客户端s.getInputStream获取客户端发送过来的数据及客户端信息,并打印在控制台上
    //获取客户端的IP
    String clientIP=s.getInetAddress().getHostAddress();
    //将信息输出
    System.out.println(clientIP+"connect:");
    //用客户端s.getInputStream获取客户端发送过来的数据
    InputStream in=s.getInputStream();
    //创建一个 字节数组,用来存储接收的数据
    byte[] buf=new byte[1024];
    //读取接收的数据,并存放在数组中
    int len=in.read(buf);
    //打印数据到控制台
    System.out.println(new String(buf,0,len));
    server.close();
    }


多用户并发上传图片例子


/*
 * 上传图片
 * 客户端
 * 1 服务点
 * 2 读取客户端已有的图片数据
 * 3 通过socket,输出沇将数据发给服务端。
 * 4 读取服务端反馈信息
 * 5 关闭流。
 */


public class PicClient {


 public static void main(String[] args)throws Exception{
  //与服务端建立连接
  Socket s= new Socket("127.0.0.1",8899);
  //创建一个输入流与文件相关联
  FileInputStream fis = new FileInputStream("D:\\1.jpg");
  //从套接字中获取一个输出流
  OutputStream fos =s.getOutputStream();
  //创建一个字节缓冲数组
  byte[]  buf = new byte[1024];
     int len=0;
     //循环读取数据
  while((len=fis.read(buf))!=0){
   //向套接字输出流中写入数据,用数组缓冲
   fos.write(buf,0,len); 
  }
  //告诉服务端已经写完数据
  s.shutdownOutput();
  //从套接字中获取一个输入流,用于读取主机反馈回来的信息
  InputStream in=s.getInputStream();
  //创建一个字节缓冲数组
  byte[]  bufin = new byte[1024];
  //接收主机回返的信息数据
  int num=in.read(bufin);
  //转换成字符输出
  System.out.println(new String(bufin,0,num));
  //关闭流
  fos.close();
  fis.close();
  in.close();
 }
}


将客户端封装在一个单独的线程


public class PicThread implements Runnable {


 private ServerSocket server;
 public PicThread(ServerSocket server){
  this.server=server;
 }
 @Override
 public void run() {
  try {
    Socket s=server.accept();
   //从套接字中获取一个输出流,用于读取套接字中输出沇的数据
   InputStream in=s.getInputStream();
   //将图片数据写入到指定位置
   FileOutputStream fos = new FileOutputStream("D:\\1.jpg");
   //创建一个字节缓冲数组
   byte[] buf=new byte[1024];
   int len=0;
   //循环读取数据
         while((len=in.read(buf))!=0){
          //将数据写入文件中
          fos.write(buf,0,len);
         }  
         //向输出流中写出反馈信息
   OutputStream out=s.getOutputStream();
   //将字符转换成为字节数据
   out.write("上传成功".getBytes());
   //关闭流
   fos.close();
   in.close();
   server.close();
  } catch (Exception e) {
   new RuntimeException("上传失败");
  }


 }


}


测试类:


public class PicServer {


 /**
  * 服务端:
  * 1 读取客户端上传的图片,并保存到指定文件下
  * 2 向客户端发送反馈信息
  * 
  */
 public static void main(String[] args)throws Exception {
      ServerSocket server = new ServerSocket(8899);
      while(true){
       Socket s=server.accept();
      }
 }


}------- android培训java培训、期待与您交流! ----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值