基础4-高级-网络编程

网络编程网络编程3要素 IP获取 UDP传输协议(多线程传输) TCP传输协议(多线程)

网络编程3要素

网络编程(三要素)
1、  IP地址:一栋小区楼相当于IP地址
2、  端口号:小区内每一个住户相当于端口号
3、  协议:每个住户间来往原则

网络编程(二协议)

UDP:面向无连接,数据不安全,速度快,不区分客户端和服务器端。
TCP:面向连接(三次连接),数据安全,速度略低,分为客户端和服务端。
三次握手:客户端先向服务端发起请求,服务器响应请求,传输数据。

Socket通信原理

1、 套接字是两台机器之间通讯的端点 
2、网络通信其实就是Socket之间的通信
3、数据在两个Socket之间通过IO流传输

一、IP

package exercise;
import java.net.InetAddress;
public class exercise {
    public static void main(String[] args) throws Exception  {
        InetAddress host=InetAddress.getLocalHost();//创建对象
        String ip=host.getHostAddress();//获取本机IP地址
        System.out.println(ip);
    }
}
上面获取IP是172.16.56.21,然后打开控制台,ping 172.16.56.21,如果成功就代表正确。

二、Socket

/*
作用:进行不同的程序之间的通信 
原理:
1. 服务端开启8888端口,并监听着,时刻等待着客户端的连接请求
2. 客户端知道服务端的ip地址和监听端口号,发出请求到服务端
客户端的端口地址是系统分配的,通常都会大于1024
一旦建立了连接,服务端会得到一个新的Socket对象,该对象负责与客户端进行通信。 
*/

模拟练习

package com.llhc;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {//服务端
    public static void main(String[] args) throws IOException{
        try{
            ServerSocket ss = new ServerSocket(8888);//打开端口
            Socket s=ss.accept();//开启监听
            InputStream is=s.getInputStream();//用流
            int count=is.read();
            System.out.println(count);
            ss.close();
            s.close();
            is.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

package com.llhc;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
//客户端
public class Client {
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket s = new Socket("127.0.0.1",8888);//链接本地端口
        OutputStream os=s.getOutputStream();//读写文件
        os.write(110);
        os.close();
        s.close();
        
    }
}

三、UDP传输协议(多线程传输):QQ、微信、视频聊天。

package exercise;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class exercise {
    /**
     * @param args
     */
    public static void main(String[] args) {
        new Receive().start();
        new Send().start();
    }
}
//接收端
class Receive extends Thread {
    public void run() {
        try {
            DatagramSocket socket = new DatagramSocket(9999);       //创建Socket相当于创建码头
            DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);//创建Packet相当于创建集装箱
            
            while(true) {
                socket.receive(packet);                                 //接货,接收数据
                
                byte[] arr = packet.getData();                          //获取数据
                int len = packet.getLength();                           //获取有效的字节个数
                String ip = packet.getAddress().getHostAddress();       //获取ip地址
                int port = packet.getPort();                            //获取端口号
                System.out.println("接收数据是:"+ip + ":" + port + ":" + new String(arr,0,len));
            }
        } catch (IOException e) {   
            e.printStackTrace();
        }
    }
}
//发送端
class Send extends Thread {
    public void run() {
        try {
            Scanner sc = new Scanner(System.in);                        //创建键盘录入对象
            DatagramSocket socket = new DatagramSocket();               //创建Socket相当于创建码头
            
            while(true) {
                String line = sc.nextLine();                            //获取键盘录入的字符串
                if("quit".equals(line)) {
                    break;
                }
                DatagramPacket packet =                                 //创建Packet相当于集装箱
                        new DatagramPacket(line.getBytes(), line.getBytes().length, InetAddress.getByName("127.0.0.1"), 9999);
                socket.send(packet);                                    //发货,将数据发出去
            }
            socket.close();
        }  catch (IOException e) {
            
            e.printStackTrace();
        }       
    }
}

四、TCP传输协议(多线程):文件传输、邮件。

Client发送端:
package exercise;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
    /**
     * * 1.客户端
        * 创建Socket连接服务端(指定ip地址,端口号)通过ip地址找对应的服务器
        * 调用Socket的getInputStream()和getOutputStream()方法获取和服务端相连的IO流
        * 输入流可以读取服务端输出流写出的数据
        * 输出流可以写出数据到服务端的输入流
     * @throws IOException 
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("127.0.0.1", 12345);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     //将字节流包装成了字符流
        PrintStream ps = new PrintStream(socket.getOutputStream());                 //PrintStream中有写出换行的方法
        System.out.println(br.readLine());
        ps.println("我想报名黑马程序员");
        System.out.println(br.readLine());
        ps.println("大哭!!!能不能给次机会");
        socket.close();
    }
}
Server服务端:
package exercise;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    /**
     * * 2.服务端
    * 创建ServerSocket(需要指定端口号)
    * 调用ServerSocket的accept()方法接收一个客户端请求,得到一个Socket
    * 调用Socket的getInputStream()和getOutputStream()方法获取和客户端相连的IO流
    * 输入流可以读取客户端输出流写出的数据
    * 输出流可以写出数据到客户端的输入流
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        //demo1();
        ServerSocket server = new ServerSocket(12345);
        while(true) {
            final Socket socket = server.accept();                      //接受客户端的请求
            new Thread() {
                public void run() {
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     //将字节流包装成了字符流
                        PrintStream ps = new PrintStream(socket.getOutputStream());                 //PrintStream中有写出换行的方法
                        ps.println("欢迎咨询黑马程序员");
                        System.out.println(br.readLine());
                        ps.println("不好意思,爆满了");
                        System.out.println(br.readLine());
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
        }
    }
    public static void demo1() throws IOException {
        ServerSocket server = new ServerSocket(12345);
        Socket socket = server.accept();                        //接受客户端的请求
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));     //将字节流包装成了字符流
        PrintStream ps = new PrintStream(socket.getOutputStream());                 //PrintStream中有写出换行的方法
        ps.println("欢迎咨询黑马程序员");
        System.out.println(br.readLine());
        ps.println("不好意思,爆满了");
        System.out.println(br.readLine());
        socket.close();
    }
}


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

推荐阅读更多精彩内容