Socket

网络模型

  网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。

  数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。

  现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。

  在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),

  等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,

  而服务器为了能够时刻相应连接,则需要一直启动。

  例如以打电话为例,首先拨号的人类似于客户端,接听电话的人必须保持电话畅通类似于服务器。

  连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。

  在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule这类软件了。

 

IP地址与域名

  在网络中,需要知道一个设备的位置,则需要使用该设备的IP地址,具体的连接过程由硬件实现

  IP地址是一个规定,现在使用的是IPv4,既由4个0-255之间的数字组成,在计算机内部存储时只需要4个字节即可。  

  在计算机中,IP地址是分配给网卡的,每个网卡有一个唯一的IP地址,

  如果一个计算机有多个网卡,则该台计算机则拥有多个不同的IP地址,

  在同一个网络内部,IP地址不能相同。IP地址的概念类似于电话号码、身份证这样的概念。

  由于IP地址不方便记忆,所以有专门创造了域名(Domain Name)的概念,其实就是给IP取一个字符的名字,

  例如163.com、sina.com等。IP和域名之间存在一定的对应关系。如果把IP地址类比成身份证号的话,那么域名就是你的姓名。

  其实在网络中只能使用IP地址进行数据传输,所以在传输以前,需要把域名转换为IP,这个由称作DNS的服务器专门来完成。

  所以在网络编程中,可以使用IP或域名来标识网络上的一台设备

 

端口

  规定一个设备有216个,也就是65536个端口,每个端口对应一个唯一的程序

  每个网络程序,无论是客户端还是服务器端,都对应一个或多个特定的端口号。

  由于0-1024之间多被操作系统占用,所以实际编程时一般采用1024以后的端口号。

  使用端口号,可以找到一台设备上唯一的一个程序。

  所以如果需要和某台计算机建立连接的话,只需要知道IP地址或域名即可,

  但是如果想和该台计算机上的某个程序交换数据的话,还必须知道该程序使用的端口号。

网络模型图

  

 

 

Socket

  Socket就是为网络服务提供的一种机制。

  通讯的两端都有Sokcet

  网络通讯其实就是Sokcet间的通讯

  数据在两个Sokcet间通过IO传输

TCP与UDP在概念上的区别

udp:

  a、是面向无连接, 将数据及源的封装成数据包中,不需要建立连接

    b、每个数据报的大小在限制64k内

    c、因无连接,是不可靠协议

    d、不需要建立连接,速度快

tcp:

  a、建议连接,形成传输数据的通道.

    b、在连接中进行大数据量传输,以字节流方式

    c 通过三次握手完成连接,是可靠协议

    d 必须建立连接m效率会稍低

UDP服务端代码

package com.Soket.souket;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class SoketService {
    public static void main(String[] args) throws Exception{
        System.out.println("服务器端启动成功!!!");

        //创建一个连接,没有传入IP地址,默认是自己本机   127.0.0.1
        DatagramSocket socket=new DatagramSocket(8080);

        //接收客户端请求
        byte [] bytes=new byte[1024];
        DatagramPacket packet=new DatagramPacket(bytes,bytes.length);

        socket.receive(packet);

        //获取IP与端口
        System.out.println("IP地址:"+packet.getAddress()+"\t端口:"+packet.getPort());

        //接收数据
        String str=new String(packet.getData(),0,packet.getLength());
        System.out.println("内容是:"+str);
    }
}

UDP客户端代码

package com.Soket.souket;

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

public class SoketClient {
    public static void main(String[] args) throws Exception{
        System.out.println("客户端启动成功!!");

        //创建Scoket对象
        DatagramSocket socket=new DatagramSocket();
        Scanner scanner=new Scanner(System.in);
        System.out.print("传输内容:");
        String str=scanner.next();

        //创建数据包
        DatagramPacket packet=new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName("192.168.60.181"),8081);

        //发送数据包
        socket.send(packet);

        //关闭
        socket.close();
    }
}

 

TCP服务端代码

package com.Tcp;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpService {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP服务端");

        //创建链接
        ServerSocket socket=new ServerSocket(8080);
        InputStream inputStream=null;
        byte[] bytes=null;
        for(;;){
            //获取客户端请求,否则阻塞
            Socket accept=socket.accept();

            //获取客户端传输数据
            inputStream=accept.getInputStream();

            bytes=new byte[1024];
            int length=inputStream.read(bytes);

            System.out.println(new String(bytes,0,length));
        }
    }
}

TCP客户端代码

package com.Tcp;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class TcpClient {
    public static void main(String[] args) throws IOException {
        System.out.println("TCP客户端");

        OutputStream outputStream=null;
        for(;;){
            //创建一个连接
            Socket socket=new Socket("127.0.0.1",8080);
            outputStream=socket.getOutputStream();
            System.out.print("请输入:");
            Scanner scanner=new Scanner(System.in);
            String anwser =scanner.next();
            outputStream.write(anwser.getBytes());
        }
    }
}

 

 

 

 

 

 

 

posted @ 2020-01-14 10:55  梅川酷子灬  阅读(143)  评论(0编辑  收藏  举报