网络编程

网络编程

网络编程概述

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

网络编程

在网络通信协议下,不同计算即上运行的程序,可以进行数据传输

网路编程三要素

IP地址:计算机设备的标识,类似身份证的作用

端口:计算机内部各个程序之间用来识别身份的标识

协议:相互通信的规则,互相遵守才能完成数据交换,常见的协议有UDP协议和TCP协议

DOS常用命令:

ipconfig:查看本机IP地址

ping IP地址:检查网络是否连通

特殊IP地址:

127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

InetAddress

InetAddress:此类表示Internet协议(IP)地址

  • 相关方法

    方法名 说明
    static InetAddress getByName(String host) 确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP地址
    String getHostName() 获取此IP地址的主机名
    String getHostAddress() 返回文本显示中的IP地址字符串
  • 代码演示

    public class InetAddressDemo {
        public static void main(String[] args) throws UnknownHostException {
          //InetAddress address = InetAddress.getByName("itheima");
            InetAddress address = InetAddress.getByName("192.168.1.66");
    
            //public String getHostName():获取此IP地址的主机名
            String name = address.getHostName();
            //public String getHostAddress():返回文本显示中的IP地址字符串
            String ip = address.getHostAddress();
    
            System.out.println("主机名:" + name);
            System.out.println("IP地址:" + ip);
        }
    }
    

端口和协议

端口:设备上应程序的唯一标识.俩个字节表示的整数,取值范围为0-65535.

协议分为俩个

UDP协议

面向无连接通信协议,不建立接连,只管发送和接收,这个协议消耗系统资源小,通信效率高,但是数据不安全,传输重要数据还是不建议使用UDP协议

TCP协议

面向连接的通信协议,就是在传输数据之前,先建立连接,然后在传输数据,每次连接的创建都需要经过三次握手.

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

第一次握手,客户端向服务器端发出连接请求,等待服务器确认

第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

第三次握手,客户端再次向服务器端发送确认信息,确认连接

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等

UDP通信程序

固定信息发送

package com.heima.test;

import java.io.IOException;
import java.net.*;
//发送端
public class test09 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        //创建数据包
        byte[] bys = "hello udp,我来了".getBytes();
        DatagramPacket ps = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),1234);
        ds.send(ps);
        ds.close();
    }
}
//接受端
class test091{
    public static void main(String[] args) throws Exception {
        DatagramSocket da = new DatagramSocket(1234);
        //创建一个数据包  用于接受数据
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys,bys.length);
        //调用DatagramSocket方法  接受数据
        da.receive(dp);
       System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
    }
}

键盘输入练习

package com.heima.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class test10 {
    public static void main(String[] args)throws Exception {
        DatagramSocket ds = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        while(true){
            String s = sc.nextLine();
            if("886".equals(s)){
                break;
            }
            //创建数据  并把数据打包
            byte[] bys = s.getBytes();
            //数据打包
            DatagramPacket dp = new DatagramPacket(bys,0,bys.length, InetAddress.getByName("127.0.0.1"),2020);
            //数据发送
            ds.send(dp);
        }
        ds.close();
    }
}
class test101{
    public static void main(String[] args)throws Exception {
        DatagramSocket ds = new DatagramSocket(2020);
        while(true){

            byte [] bys = new byte[1024];
            DatagramPacket dr = new DatagramPacket(bys,0,bys.length);
            ds.receive(dr);
            System.out.println("他说:"+new String(dr.getData(),0,dr.getLength()));
        }
    }
}

UDP组播实现

package com.heima.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

//发送端
public class test11 {
    public static void main(String[] args) throws Exception{
       //创建发送端Socket对象
        DatagramSocket socket = new DatagramSocket();
        String s ="你好,信号良好吗";
        byte [] bytes = s.getBytes();
        InetAddress inetAddress = InetAddress.getByName("224.0.1.0");//组播 地址  224.0.1.0
        int port = 10000;
        //打包
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length,inetAddress,port);
        //调用DatagramSocket对象的方法发送给数据(在单播中,这是发给指定IP 电脑但是在组播中,这是发给组播地址)
        socket.send(packet);

        socket.close();
    }
}
//接收端
class test110{
    public static void main(String[] args) throws Exception{
        //创建接受端Socket对象(MulticastSocket)
        MulticastSocket ms = new MulticastSocket(10000);
        //创建一个箱子
        DatagramPacket box = new DatagramPacket(new byte[1024],1024);
        //把当前计算机绑定一个组播地址,表示添加到这一组中
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        //将数据接收到箱子中
        ms.receive(box);
        //解析数据包
        byte[] data = box.getData();
        int len = box.getLength();
        System.out.println(new String(data , 0,len));
        ms.close();
    }
}

UDP广播实现

package com.heima.test;

import javax.xml.transform.SourceLocator;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//发送端
public class test12 {
    public static void main(String[] args)throws Exception {
//        1. 创建发送端Socket对象(DatagramSocket)
        DatagramSocket socket = new DatagramSocket();
//        2. 创建存储数据的箱子,将广播地址封装进去
        String s = "嗨喽,你们都在吗";
        byte [] bys = s.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        DatagramPacket dp = new DatagramPacket(bys,0,bys.length,address,10000);
//        3. 发送数据
        socket.send(dp);
//        4. 释放资源
        socket.close();
    }
}
//接收端
class test121{
    public static void main(String[] args) throws  Exception{
//        1. 创建接收端的Socket对象(DatagramSocket)
        DatagramSocket socket = new DatagramSocket(10000);
//        2. 创建一个数据包,用于接收数据
        byte [] bytes = new byte[1024];
//        3. 调用DatagramSocket对象的方法接收数据
        DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length);
//        4. 解析数据包,并把数据在控制台显示
        socket.receive(dp);
       byte[] data =  dp.getData();
       int length = dp.getLength();
        System.out.println(new String(data,0,length));
//        5. 关闭接收端
        socket.close();
    }
}

TCP通信程序

Java中的TCP通信

Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表俩端的通信端口,并通过Socket产生了IO流来进行网络通信

Java为客户端提供了Socket类,为服务器提供了ServerSocket类

TCP发送数据和TCP接受数据

package com.heima.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//发送信息
public class test13 {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象       Socket(String host,int port)
        Socket s = new Socket("127.0.0.1",10000);
        //获取输出流 写数据  OutputStream getOutputStream() 返回输出流
        OutputStream os = s.getOutputStream();
        os.write("你好昂啊 我是好人".getBytes());
        //释放资源
        s.close();
    }
}
//接受信息
class test131{
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        //SrverSocket(int port)  创建绑定到指定端口的服务器套接字
        ServerSocket ss = new ServerSocket(10000);
        //等待连接     侦听要连接到次套接字并接受它
        Socket accept = ss.accept();
        //获取输入流  读数据 把数据显示在控制台上
        InputStream is = accept.getInputStream();
        byte [] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("数据是:"+data);
        //释放资源
        is.close();
        accept.close();
        ss.close();

    }
}

TCP程序练习

  • 案例需求

    客户端:发送数据,接受服务器反馈

    服务器:收到消息后给出反馈

  • 案例分析

    • 客户端创建对象,使用输出流输出数据
    • 服务端创建对象,使用输入流接受数据
    • 服务端使用输出流给出反馈数据
    • 客户端使用输入流接受反馈数据
  • 代码实现

    package com.heima.test;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    //客户端
    public class test14 {
        public static void main(String[] args) throws IOException {
            //客户端发送确认信息
            Socket s = new Socket("127.0.0.1",2021);
            OutputStream os = s.getOutputStream();
            os.write("你好,服务器".getBytes());
            s.shutdownOutput();//如果  os.close(); 将流关闭 会导导致整个socket都无法使用
            //Socket中的shutdownOutput()方法仅仅关闭输出流
            BufferedInputStream bis = new BufferedInputStream(s.getInputStream());//使用字符缓冲流最方便
            int len;
            byte[] buffer = new byte[1024];
            while((len=bis.read(buffer)) != -1){
                System.out.println(new String(buffer,0,len));
            }
            bis.close();
            os.close();
            s.close();
        }
    }
    //服务器
    class test141{
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(2021);
            Socket accept = ss.accept();
            InputStream is = accept.getInputStream();
            int len;
            byte [] buffer = new byte[1024];
            while((len=is.read(buffer)) != -1){
                System.out.println(new String(buffer,0,len));
            }
            System.out.println("看看我执行了吗");
            OutputStream os = accept.getOutputStream();//使用字符缓冲流最方便
           os.write("你谁啊".getBytes());
           os.close();
           is.close();
            accept.close();
           ss.close();
    
        }
    }
    

    TCP程序文件上传练习

package com.heima.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//客户端
public class test15 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",2021);
        //读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\ps.cc\\ps素材\\证件照\\蕊.jpg"));
        //发送到网络流
        OutputStream os = socket.getOutputStream();
        int len;
        byte [] buffer= new byte[1024];
        while((len=bis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        socket.shutdownOutput();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while((line=br.readLine()) != null){
            System.out.println(line);
        }
        bis.close();
        br.close();
        socket.close();

    }
}
//服务器端
class test151{
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(2021);
        Socket accept = ss.accept();
        //接受客户端发来的文件
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("itHeiMa\\美女.jpg"));
        int len;
        byte [] buffer = new byte[1024];
        while((len=bis.read(buffer))!=-1){
            bos.write(buffer,0,len);

        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("上传成功");

        bw.close();
        bis.close();
        accept.close();
        bos.close();
        ss.close();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容