JAVA基础--网络编程

 网络编程是基于网络进行数据传输,通过IP地址来确定主机在网络中的位置,通过端口号来让计算机和外界进行数据交互。

1.InetSocketAddress类

  • 可以代表IP地址和端口号
  • 继承抽象类SocketAddress
  • 实例代码:
package cn.tedu.test;

import java.net.InetSocketAddress;

public class TestDemo1 {
    public static void main(String[] args){
        //创建代表IP地址和端口号的对象
        //第一个参数代表ip地址
        //第二个参数为端口号
        //localhost解析成127.0.0.1永远指向本地
        InetSocketAddress is=new InetSocketAddress("172.0.0.1",8080);
        //获取信息
        //获取IP地址
        System.out.println(is.getAddress());
        //获取主机名
        System.out.println(is.getHostName());
        //获取端口号
        System.out.println(is.getPort());

    }
}

2.UDP协议

 底层基于流,传输不建立连接,不安全但是速度快

  • 底层是根据数据包(64kb)来进行数据传输
  • 使用场景:直播、视频、音频等
  • 代表UDP的类DatagramSocket
    代表数据包的类DatagramPacket
  • 实例代码:
    发送端:
package cn.tedu.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TestDemo1 {
    public static void main(String[] args) throws IOException {
        /*
        发送端:
        1)创建UDP对象
        2)创建数据包(指定IP地址、端口号以及要发送的数据)
        3)发送数据包
        4)关流
         */
        //创建UDP发送端代码
        DatagramSocket ds=new DatagramSocket();
        //创建数据包对象--准备要发送的数据
        //第一个参数代表要发送的数据,byte数组   底层基于字节流
        //第二个参数代表实际发送数据的长度
        //第三个参数代表IP地址和端口号
        DatagramPacket dp=new DatagramPacket("你好".getBytes(),
                "你好".getBytes().length,
                new InetSocketAddress("127.0.0.1",8080));

        //发送数据包
        ds.send(dp);
        //由于底层基于流实现
        //所以需要关流
        //关流
        ds.close();
    }
}

接收端:

package cn.tedu.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TestDemo2 {
    public static void main(String[] args) throws IOException {
        /*
        接收端
        1)创建UDP接收端对象--监听发送端的端口
        2)创建数据包对象接收数据
        3)接收数据包
        4)关流
        5)解析数据包
         */
        //创建UDP接受端对象--监听发送端的端口
        DatagramSocket ds=new DatagramSocket(8080);
        //创建数据包对象--用于接收数据
        //第一个参数代表存储数据的字节数组
        //第二个参数代表实际接收数据的长度
        DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
        //接收数据
        ds.receive(dp);
        //关流
        ds.close();
        //解析数据包
        //返回IP地址
        System.out.println(dp.getAddress());
        //getData--显示接收到的数据
        //getLength---展示接收数据的长度
        //展示接收的数据
        System.out.println(new String(dp.getData(),0,dp.getLength()));
    }
}

需要注意的是:需要先启动接收端程序,之后启动发送端代码

  • 练习:使用UDP协议以及线程实现一个简易的的聊天室。
package cn.tedu.test;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Scanner;

public class TestDemo1 {
    public static void main(String[] args) throws IOException {
        //创建接收端和发送端线程,启动线程
        new Thread(new Recevier()).start();
        new Thread(new Sender()).start();

    }
}
//定义发送端的类
class Sender implements Runnable{
    //代表信息发送过程
    @Override
    public void run() {
        try {
            //创建UDP发送端对象
            DatagramSocket ds=new DatagramSocket();
            //创建Scanner对象
            Scanner sc=new Scanner(System.in);
            //保证一直能够发送信息
            while(true){
                //创建存储发送信息的字节数组
                byte bs[]=sc.nextLine().getBytes();
                //创建数据包对象
                DatagramPacket dp=new DatagramPacket(bs,bs.length,
                        new InetSocketAddress("127.0.0.1",8080));
                //发送数据
                ds.send(dp);
                //不能关流
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//定义接收端的类
class Recevier implements Runnable{

    //定义代表接收信息的过程
    @Override
    public void run() {
        //创建代表UDP接收端的对象--监听发送端的端口
        try {
            DatagramSocket ds=new DatagramSocket(8080);
            //创建数据包对象--接收数据
            DatagramPacket dp=new DatagramPacket(new byte[1024],1024);
            //创建Scanner对象
            Scanner sc=new Scanner(System.in);
            //保证一直能够发送数据
            while(true){
                //接收数据
                ds.receive(dp);
                //解析数据包
                System.out.println(dp.getAddress());
                System.out.println(new String(dp.getData(),0,dp.getLength()));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
聊天室.png

3.TCP协议

  • 底层基于流,传输建立连接(三次握手),安全可靠但是传输速度很慢
    三次握手.png
  • 底层基于IO流来进行数据传输,不限制传输数据的大小
  • 使用场景:上传和下载、聊天
  • Socket 客户端类、ServerSocket 服务器端类
  • 实例代码:
    客户端
package cn.tedu.net.tcp;

import jdk.internal.util.xml.impl.Input;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class TCPClientDemo {
        /*
        客户端:
        1)创建TCP客户端对象
        2)建立连接
        3)获取自带的字节输出流对象往服务器端写出数据
        4)写出数据
        5)通知服务器端数据已经发送完毕
        6)关流
         */
    public static void main(String[] args) throws IOException {
        //创建TCP客户端对象
        Socket s=new Socket();
        //发起连接
        s.connect(new InetSocketAddress("127.0.0.1",9092));
        //获取自带的字节输出流
        //默认往服务器端来传输
        OutputStream os=s.getOutputStream();
        //写出数据
        os.write("下午好".getBytes());
        //通知服务器端数据以及发送完毕
        s.shutdownOutput();

        //从服务器端读取数据
        //获取自带字节数计入流
        InputStream is=s.getInputStream();
        //自建缓冲区---字节数组
        byte [] bs=new byte[1024];
        int len=-1;
        while((len=is.read(bs))!=-1){
            //把读取到的内容进行展示
            System.out.println(new String(bs,0,len));
        }
        //通知客户端数据已经接收完毕
        s.shutdownInput();
        //关流
        os.close();
    }
}

服务器端:

package cn.tedu.net.tcp;

import jdk.internal.util.xml.impl.Input;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;

public class TCPClientDemo {
        /*
        服务器端:接收数据
        1)创建TCP服务器端对象--监听端口
        2)接收连接
        3)获取自带的字节输入流
        4)读取数据
        5)通知客户端数据已经读取完毕
        6)关流
         */
    public static void main(String[] args) throws IOException {
        //创建TCP客户端对象
        Socket s=new Socket();
        //发起连接
        s.connect(new InetSocketAddress("127.0.0.1",9092));
        //获取自带的字节输出流
        //默认往服务器端来传输
        OutputStream os=s.getOutputStream();
        //写出数据
        os.write("下午好".getBytes());
        //通知服务器端数据以及发送完毕
        s.shutdownOutput();

        //从服务器端读取数据
        //获取自带字节数计入流
        InputStream is=s.getInputStream();
        //自建缓冲区---字节数组
        byte [] bs=new byte[1024];
        int len=-1;
        while((len=is.read(bs))!=-1){
            //把读取到的内容进行展示
            System.out.println(new String(bs,0,len));
        }
        //通知客户端数据已经接收完毕
        s.shutdownInput();
        //关流
        os.close();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343