网络编程

实现计算机互联的三要素:
    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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值