Java 网络通信(TCP/UDP)

1.InetAdress类 与  Socket类

 >InetAdress

 >Socket

2.TCP/IP协议簇 

 客户端:

  • 创建 Socket根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
  • 打开连接到 Socket 的输入/出流: 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流,进行数据传输
  • 按照一定的协议对 Socket  进行读/写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
  • 关闭 Socket断开客户端到服务器的连接,释放线路

服务器端:

public class TestTCP3 {
    @Test
    public void client()throws Exception{
        //1.创建Socket的对象
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 9898);
        //2.从本地获取一个文件发送给服务端
        OutputStream os = socket.getOutputStream();
        FileInputStream fis = new FileInputStream(new File("1.jpg"));
        byte[] b = new byte[1024];
        int len;
        while((len = fis.read(b)) != -1){
            os.write(b,0,len);
        }
        socket.shutdownOutput();//告知服务器端传送完毕
        //3.接收来自于服务端的信息
        InputStream is = socket.getInputStream();
        byte[] b1 = new byte[1024];
        int len1;
        while((len1 = is.read(b1)) != -1){
            String str = new String(b1,0,len1);
            System.out.print(str);
        }
        //4.关闭相应的流和Socket对象
        is.close();
        os.close();
        fis.close();
        socket.close();
    }
    @Test
    public void server() throws Exception{
        //1.创建一个ServerSocket的对象
        ServerSocket ss = new ServerSocket(9898);
        //2.调用其accept()方法,返回一个Socket的对象
        Socket s = ss.accept();
        //3.将从客户端发送来的信息保存到本地
        InputStream is = s.getInputStream();
        FileOutputStream fos = new FileOutputStream(new File("3.jpg"));
        byte[] b = new byte[1024];
        int len;
        while((len = is.read(b)) != -1){
            fos.write(b, 0, len);
        }
        System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的文件");
        //4.发送"接收成功"的信息反馈给客户端
        OutputStream os = s.getOutputStream();
        os.write("你发送的图片我已接收成功!".getBytes());
        //5.关闭相应的流和Socket及ServerSocket的对象
        os.close();
        fos.close();
        is.close();
        s.close();
        ss.close();
    }
}

 

3.UDP网络通信

  • 调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求
  • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
  • 调用 该Socket类对象的 getOutputStream() 和 getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。
  • 关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。
//UDP编程的实现
public class TestUDP {

    // 发送端
    @Test
    public void send() {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket();
            byte[] b = "你好,我是要发送的数据".getBytes();
            //创建一个数据报:每一个数据报不能大于64k,都记录着数据信息,发送端的IP、端口号,以及要发送到
            //的接收端的IP、端口号。
            DatagramPacket pack = new DatagramPacket(b, 0, b.length,
                    InetAddress.getByName("127.0.0.1"), 9090);
            
            ds.send(pack);
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(ds != null){
                ds.close();
                
            }
        }
        
    }

    // 接收端
    @Test
    public void rceive() {
        DatagramSocket ds = null;
        try {
            ds = new DatagramSocket(9090);
            byte[] b = new byte[1024];
            DatagramPacket pack = new DatagramPacket(b, 0, b.length);
            ds.receive(pack);
            
            String str = new String(pack.getData(), 0, pack.getLength());
            System.out.println(str);
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(ds != null){
                ds.close();
                
            }
        }
    }
}

附上http请求:

URL的方法 openStream():能从网络上读取数据

l  若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。

URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.

  • URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
  • URLConnectonn u = netchinaren.openConnection( ); 
原文地址:https://www.cnblogs.com/pjlhf/p/8663506.html