网络编程

来源:互联网 发布:双色球一等奖概率算法 编辑:程序博客网 时间:2024/06/07 11:37

实现计算机互联的三要素:
    1、IP地址
       本机回路IP:127.0.0.1
    2、端口号(逻辑端口):用于标识应用程序。
       端口号0~65535之间的整数;0~1024之间大部分已被用于一些知名的网络服务和应用,所以现在开发的网络应用程序端口号一般是1024以后的整数。
    3、通信协议
       TCP:三次握手机制,面向连接,稍慢。可靠
        UDP:无连接,每个数据报大小限制在64K内。传输快。不可靠。



       TCP/IP参考模型:

       

     
     网络编程:其实就是Socket编程
     通信的两端都有Socket, 数据在两个Socket间通过IO传输。
      UDP传输:DatagramSocket和DatagramPacket

  
      UDP通信示例:
     

class UDPsend {      public static void main(String[] args) throws Exception {          //创建UDP socket端点,可以指定固定端口发送数据,不指定则系统随机产生          DatagramSocket ds = new DatagramSocket();          //确定数据,并封装成数据包          byte[] buf = "Hello, java".getBytes();          DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);                    //通过UDP socket的sent方法发送数据          ds.send(dp);          System.out.println("发送成功");      }  }    class UDPreceive {      public static void main(String[] args) throws Exception {          //创建UDP socket端点,指定用于接收数据的端口          DatagramSocket ds = new DatagramSocket(8888);          //定义数据包用于接收数据          byte[] buf = new byte[1024];          DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);          //接收数据存入于数据包中          ds.receive(dp);                    String ip = dp.getAddress().getHostAddress();          String data = new String(dp.getData(), 0, dp.getLength());          int port = dp.getPort();          System.out.println(ip + ", " + port + ", " + data);                    ds.close();      }  }  

      实例:用TCP完成一个英文文本大小写转换的客户端和服务器端
      客户端发送一个英文字符串到服务端,服务端返回一个将字符串转为全大写后的信息到客户端
      

import java.net.*;  import java.io.*;  /*  * 建立一个文本转换器  *   * 分析:操作的是客户端发来的文本信息数据,所以要用到IO流技术。  *   * 步骤:  * 1、建立服务  * 2、获取键盘录入  * 3、将数据发给服务端  * 4、服务端将小写字母全部转换为大写后发送给客户端  * 5、关闭资源  * */  public class TCPTextCast {        public static void main(String[] args) {        }    }  class TCPClient1 {            public static void main(String[] args) throws Exception {          Socket s = new Socket("127.0.0.1", 10003);          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));                    BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));          //优化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);          //将bufOut传入PrintWriter(bufOut)也行          BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));                    String line = null;          while((line=br.readLine())!= null) {              if("over".equals(line))                  break;              bufOut.write(line);              bufOut.newLine();              bufOut.flush();              //三句变一句,用out.println(line);                            System.out.println("Server: " + bufIn.readLine());          }                    br.close();          s.close();      }        }  
     

       TCP实例: 

       

/*  * 使用TCP协议写一个可以上传文件的服务器和客户端。  *   * 思路:网络编程与IO流相拼命  * 客户端通过socket向其输出流中写入本地文件,用到FileInputStream读取文件,也可加上缓冲BufferedInputStream.  *  还有通过socket的输入流读取服务器端的反馈信息。  * 服务端通过socket从其输入流中读取文件,存入到服务器端,并返回文件复制情况信息   * 资源关闭  * */    import java.net.*;  import java.io.*;  public class FileLoader {        public static void main(String[] args) {        }    }    //客户端  class client {      public static void main(String[] args) throws Exception {          //建立Socket服务          Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);          //从客户端本地读取文件,并写入socket的输出流中          OutputStream out = fileLoaderSocket.getOutputStream();          InputStream fileRead = new FileInputStream("G:\\Demo.mp3");                    byte[] buf = new byte[1024];          int len = 0;          while((len=fileRead.read(buf)) != -1) {              out.write(buf, 0, len);          }          //告诉服务端,文件已传输完毕          fileLoaderSocket.shutdownOutput();                    //获取从服务端反馈的信息          BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));          String serverBack = in.readLine();          System.out.println(serverBack);                    //资源关闭          fileLoaderSocket.close();          fileRead.close();      }  }    //服务端  class Server {      public static void main(String[] args) throws Exception {          //建立服务端Socket          ServerSocket ss = new ServerSocket(10005);          //接收客户端Socket          Socket fileLoaderSocket = ss.accept();                    //打印连接信息          String ip = fileLoaderSocket.getInetAddress().getHostAddress();          System.out.println(ip + "...conncected");                    //接收文件,并保存          InputStream in = fileLoaderSocket.getInputStream();          OutputStream fileSave = new FileOutputStream("E:\\server.mp3");          byte[] buf = new byte[1024];          int len = 0;          while((len=in.read(buf)) != -1) {              fileSave.write(buf, 0, len);              fileSave.flush();          }          //返回文件复制情况信息          BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));          out.write("文件上传成功");          out.flush();                    //资源关闭          ss.close();          fileLoaderSocket.close();          fileSave.close();      }  }  class TCPServer1 {            public static void main(String[] args) throws Exception {          ServerSocket ss = new ServerSocket(10003);          Socket s = ss.accept();                    String ip = s.getInetAddress().getHostAddress();          System.out.println(ip + "...connceted");                    BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));                    String data = null;          while((data=br.readLine()) != null) {                            System.out.println(ip + "... : " + data);                            bw.write(data.toUpperCase());              bw.newLine();              bw.flush();          }                        s.close();          ss.close();      }        }  

    
0 0
原创粉丝点击