Java网络编程

来源:互联网 发布:一线建材品牌 知乎 编辑:程序博客网 时间:2024/06/06 01:49

一、网络模型

1.OSI参考模型
应用层
表示层
会话层
网络层
数据链路层
物理层

2.TCP/IP参考模型
应用层
传输层
网际层
主机至网络层

二、网络通讯的要素

1.IP地址

 1. 网络中设备的标识(一台远程计算机的唯一标识) 2. 不易记忆,可以用主机名称 3. 本地回环地址:127.0.0.1,主机名:localhost

2.端口号:

1. 用于标识进程的逻辑地址,不同进程的标识2. 有效端口:0~65535,其中0~1024是系统使用或者保留端口,尽量不要使其设置端口号

3.传输协议:

 1. 通讯的规则 2. 常见的传输协议:TCP,UDP

三、TCP和UDP

1.UDP

1. 将数据及源和目的封装成数据包中,不需要建立连接2. 每个数据包的大小限制在64k内3. 因无连接,是不可靠协议4. 不需要建立连接,速度快

生活中应用的小例子,比如对讲机,发短信息等。。不需要建立连接,只管发送就哦了。

2.TCP

 1. 建立连接,形成传输数据的通道 2. 在连接中进行大量的数据传输 3. 通过三次握手完成连接,是可靠的协议 4. 必须建立连接,效率稍低。

四、Socket

1. Socket就是为网络服务提供的一种机制2. 通讯的两端都有Socket3. 网络通讯其实就是Socket间的通信4. 数据在两个Socket之间通过IO传输

五、UDP传输

1. DatagramSocket和DatagramPacket2. 建立发送端,接收端3. 建立数据包4. 调用Socket的发送和接收方法5. 关闭Socket

发送端和接收端是两个独立的应用程序

发送端:

在发送端要进行数据包的封装,数据包对象中明确目的地、IP以及端口

接收端:

在接收端要指定监听的端口

六、TCP传输

1. Socket和ServerSocket2. 建立客户端和服务器端3. 建立连接后,通过Socket中的IO流进行数据的传输4. 关闭Socket

同样客户端和服务端是两个独立的程序

基本的思路(客户端)

  1. 客户端需要明确服务端的IP地址和端口,这样才可以去试着建立连接,如果连接失败会出现异常
  2. 连接成功说明客户端和服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入输出流
  3. 与服务端通信结束后,关闭Socket

基本的思路(服务端)

1.服务端需要明确它要处理的数据是从哪个端口进入的
2.当有客户端访问的时候,要明确是哪个客户端,可以通过accept()获取已连接的客户端对象,并通过该对象与客户端进行IO流进行数据传输
3.当客户端访问结束,关闭该客户端

思考:

对于Web服务器而言,当有多个客户端同时访问服务器时,服务器又该如何提供服务呢?TCP传输最容易出现的问题?

(1)客户端连接上服务端,两端都在等待,没有任何的数据传输
(2)通过历程分析:因为read方法或者readLine方法都是阻塞式

解决办法:

1. 自定义结束标记2. 使用shutdownInput,shutdownOutput方法

UPD协议传输案例

UDP发送端实现

public class UDPSendDemo {    public static void main(String[] args) throws IOException {        System.out.println("客户端启动了。。。。。");        /**         * 创建UDP传输的发送端         *  思路:          *  1.建立udp的Socket服务         *  2.将要发送的数据封装到数据包中         *  3.通过udp的Socket服务将数据发送出去          *  4.关闭Socket服务         */        // 1.建立udp连接服务----->使用DatagramSocket对象        DatagramSocket ds = new DatagramSocket();        // 2.创建数据包对象------->使用DatagramPacket对象        String str = "UDP演示:你好,哥们你好,我来了!";        byte[] buf = str.getBytes();        DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.0.126"), 10008);        // 通过udp的Socket服务发送数据包        ds.send(dp);        // 关闭资源        ds.close();    }}

UDP接收端实现

public class UDPReceiveDemo {    public static void main(String[] args) throws IOException {        System.out.println("服务端启动了.....");        /**         * 创建UDP的接收端         * 思路:         * 1.建立udp的Socket服务端,因为是要接收数据,所以要明确一个端口号         * 2.创建数据包,用于存储接收到的数据,方便用数据包对象中的方法来解析这些数据         * 3.使用Socket服务的receive方法,将接收到的数据存储到数据包中         * 4.通过数据包的方法解析数据包中的数据         * 5.关闭资源         *          */        //1.建立udp socket服务,指定要监听的端口号        DatagramSocket ds=new DatagramSocket(10008);        //2.创建数据包        byte[] by=new byte[1024];        DatagramPacket dp=new DatagramPacket(by, by.length);        //3.使用接收方法,将接收到的数据存到数据包中,该方法是阻塞式的        ds.receive(dp);        String str=new String(dp.getData(),0,dp.getLength());        //4.通过数据包对象中的方法,解析数据包中的数据        System.out.println(str+"---"+dp.getAddress());        //5.关闭资源        ds.close();    }}

TCP协议传输案例

TCP客户端实现

public class TCPSendDemo {    public static void main(String[] args) throws UnknownHostException, IOException {        //TCP传输,客户端建立的过程        /**         * 1.创建tcp客户端Socket服务,使用的是Socket对象         * 建议该对象一创建就明确目的地,要连接的主机         * 2.如果连接建立成功,说明数据传输通道已建立         *  该通道就是Socket流,是底层建立好的,既然是流,说明这里既有输入又有输出         *  想要输入或者输出流对象,可以通过Socket获取。         *  可以通过getOutputStream和getInputStream来获取这两个字节流         * 3.使用输出流将数据写出         * 4.关闭资源         */        System.out.println("客户端启动了...");        //1.创建客户端Socket服务------>明确要连接的目的地        Socket socket=new Socket("192.168.0.126",10004);        System.out.println(socket);        //2.获取Socket中的输出流        OutputStream out=socket.getOutputStream();        //3.使用输出流将指定的数据写出去        String str="tcp演示:哥们你好,我又来了";        out.write(str.getBytes());        //4.关闭资源        socket.close();    }}

TCP服务端实现

public class TCPReceiveDemo {    public static void main(String[] args) throws IOException {        // TCP传输,服务端建立过程,服务端接收客户端传过来的数据并打印在控制台上        /**         * 建立tcp服务端的思路         * 1.创建服务端Socket服务,通过ServerSocket对象         * 2.服务端必须对外提供一个端口,否则客户端无法连接         * 3.获取连接过来的客户端对象         * 4.获取客户端对象获取Socket流,读取客户端发来的数据,并打印在控制台上         * 5.关闭资源,关客户端,关闭服务端。         */        System.out.println("服务端启动了...");        //1.创建服务端对象        ServerSocket ss=new ServerSocket(10004);        //2.获取连接过来的客户端对象        Socket s=ss.accept();//阻塞式‘        System.out.println(s);        String ip=s.getInetAddress().getHostAddress();        //3.通过Socket对象获取输入流,读取客户端发来的数据        InputStream in=s.getInputStream();        byte[] by=new byte[1024];        int len=-1;        while((len=in.read(by))!=-1){            String str=new String(by,0,len);            System.out.println(ip+"---"+str);        }        s.close();        ss.close();    }}
0 0
原创粉丝点击