Java网络基础,Socket通信基础

一、网络基础

    1、InetAddress

        InetAddress构造器私有,可以通过多种方式获得inetAddress对象

InetAddressip = InetAddress.getLocalHost();//获取本机IP

ip = InetAddress.getByName("100.64.141.89");//通过名字获取指定地址IP

String name = ip.getHostName();//通过IP获取IP名字

    2、URL统一资源定位符

          典型构成:1、网络协议(http://);2、主机地址(192.168.46.20/myServlet);3、端口号(80);4、资源路径(crm/index.jsp);5、查询地址(gid=117)

//构造器多种,可以采用指定URL连接构造一个URL,也可以使协议,用端口号,文件名等信息构成URL

String str = "http://192.168.46.254:8888/easyBuy/crm/index.jsp";

 URL url = new URL(str);

String protocol = url.getProtocol();// 获取协议

 String host = url.getHost();// 主机名

int port = url.getPort();//端口号

        对资源文件的一般操作

String file = url.getFile();//获取资源中包含的文件名称

InputStream is = url.openStream();//打开此URL连接(URLConnection),并获取连接的输入流(URLconnection.getOutputStream())

        对URL地址进行转码,解码,防止乱码

String str1 = URLEncoder.encode(str, "UTF-8");//对str字符串进行UTF-8转码

 

String str2 = URLDecoder.decode(str1, "UTF-8");//解码

    3、HttpURLConnection

            继承URLConnection类;Http协议简介http是一个无状态协议,请求、响应协议由请求头和响应头构成 。

            ①请求头: 请求方法:get post delete put..... 

            ②响应头 响应状态码:status code:200(正常响应)  400~(404,405请求资源异常,不存在,请求响应格式不一致) 500~(500服务器内部异常)

 //利用HttpURL协议下载文件

           String str3 = "http://192.168.46.254:8888/easyBuy/images/plmm.jpg";

           URLurl2 = new URL(str3);

           // 打开一个URL连接

           HttpURLConnectionconn = (HttpURLConnection) url2.openConnection();//获取一个连接(URLConnection)

           // 设置请求方法

           //conn.setRequestMethod("GET");

           // conn.setRequestProperty("Accep-Language", "zh-en");

          // conn.setReadTimeout(10000);// 设置读取超时时间,可以默认

            //  conn.setDoInput(true);// 打开输入和输出,可以不设置,默认true

            //conn.setDoOutput(true);

          // intcode = conn.getResponseCode();// 获取响应状态码

            // System.out.println(code);

           // 判断是否响应成功

           if(code== HttpURLConnection.HTTP_OK) {

                InputStreamis1 = conn.getInputStream();

                FileOutputStreamfileOutputStream = new FileOutputStream(newFile("C:\\Users\\lx\\Desktop\\test\\mn.jpg"));

               BufferedInputStreambfi = new BufferedInputStream(is1);

               BufferedOutputStreambfo = new BufferedOutputStream(fileOutputStream);

                intlen;

                byte[]bs = new byte[1024];

              while((len=bfi.read(bs))!=-1){

                bfo.write(bs, 0, len);

                bfo.flush();

               }

           }



二、Socket通讯:

    1、TCP/IP

    IP:InternetProtocol    网络协议,支撑主机之间通讯的基本协议,如果需要实现主机之间的消息安全传输,通常会结合TCP协议共同使用。全称为TCP/IP。都是传输层协议。

    TCP:传输控制协议,能保证数据消息的在主机之间安全传输,三次握手,四次挥手。是一个安全传输数据协议,所以一般用于数据传输的准确性,安全性较高的应用,但是效率较低,如:视频通话。

 

C/S 架构:    Client/Server    客户端/服务器模式    

B/S 架构:    Browser/Server    浏览器/服务器模式

 

服务器端:

1、创建serverSocket,此套接字为服务器专用,构造器应当包含端口号,以供其他主机连接。

2、监听套接字,并获得连接:Socket socket = serverSocket.accept( );

3、获取套接字输出流:socket.getOutputStream( );

      

      ServerSocketserverSocket = new ServerSocket(9999);

           System.out.println("服务器开启");

           while(true) {

                Socketsocket = serverSocket.accept();

                System.out.println("客户端已经连接"+ socket.getInetAddress());

                PrintStreamps = new PrintStream(socket.getOutputStream());

                ps.print("欢迎使用socket服务器");

            }

       客户端

        1、利用构造器获取以供连接的套接字,属性包含目标IP和端口号

        2、获取套接字里面的输入流:socket.getInputStreeam( );       

    Socketsocket = new Socket("127.0.0.1", 9999);

           InputStreamReaderisr = new InputStreamReader(socket.getInputStream());

           BufferedReaderbr = new BufferedReader(isr);

           Stringmsg = br.readLine();

           System.out.println(msg);

    2、UDP

UDP:user datagram Protocol    用户数据协议,无法保证数据的安全性,但是可以提交数据传输的效

    接收数据:为阻塞式,需要单独作为一个线程

    1、创建网络通道datagramSocket,应当是包含端口地址的构造器

    2、创建数据包datagramPacket ,其中构造方法必须包含一个空的字符缓冲区,偏移量等信息。

    3、通过datagramSocket.receiver(datagramPacket);接受数据,向数据包写入数据。    4、获取数据包内容

new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());



public static void main(String[] args)throws IOException {

           DatagramSocketdatagramSocket = new DatagramSocket(2345);

           byte[]b = new byte[1024];

           while(true) {

                DatagramPacketdatagramPacket = new DatagramPacket(b,b.length);

                datagramSocket.receive(datagramPacket);//接受数据

                Stringstring = new String(datagramPacket.getData(),datagramPacket.getOffset(),

                           datagramPacket.getLength());               

                System.out.println("接受到的数据是"+ string);

           }

     }

    发送数据:

    1、创建网络通道datagramSocket,构造器不需写入

    2、创建数据包 datagramPacket,构造方法里面包含需要写入的字节数组,偏移量,目标地址,目标端口号,当然也可以通过set方式设置目标地址地址等信息

    3、发送数据报  datagramSocket.send(datagramPacket);

public static void main(String[] args)throws IOException {

           //创建一个网络通道

           DatagramSocketdatagramSocket = new DatagramSocket();

           //将数据打包成数据报包

           Stringmessage="nnnnnn";

           

           DatagramPacketdatagramPacket = new DatagramPacket(

                     message.getBytes(),message.getBytes().length,

                     InetAddress.getByName("192.168.46.19"),

                     2345);

           datagramSocket.send(datagramPacket);        

           datagramSocket.close();

     }

3、UDP多播广播

    发送数据:

1、创建多播广播通道 new MulticastSocket( );

2、获取组播地址并将广播加入此地址   multicastSocket.jionGroup(  InterAddress.getByName("266.81.9.8") );

3、构建datagramPacket,包含byte[]的内容,byte[]长度,ip,端口号。当然可以不用在构建方法添加ip和端口号。

4、发送消息:multicastSocket.send(datagramPacket); 

    public static void main(String[] args) throws IOException {

           MulticastSocketmulticastSocket = new MulticastSocket();

           InetAddressgroup = InetAddress.getByName("226.81.9.8"); 

           multicastSocket.joinGroup(group);

           Stringcontent = "刷屏100遍";

           

           DatagramPacketdp = new DatagramPacket(content.getBytes(),content.getBytes().length);

           dp.setAddress(group);

           dp.setPort(2426);

           

           multicastSocket.send(dp);

     }

    接收数据:阻塞式,需要单独作为一个线程

1、创建多播广播通道:new MuliticastSocket(2426);    构造方法应当包含开启的端口号

2、获取广播地址,并加入此广播地址  muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));

3、创建你个空的btye[]数组。和一个datdagramPacke对象。包含btye[]相关信息

4、接收数据:mutilicastSocket.receive(datagramPacket);

5、读取datagramPacket内容:利用String的构造方法     

publicstatic void main(String[] args) throws IOException {

           MulticastSocketms=new MulticastSocket(2426);

           InetAddressgroup = InetAddress.getByName("226.81.9.8");

           ms.joinGroup(group);

           byte[]b = new byte[1024];

        while (true) {

             DatagramPacketdatagramPacket = new DatagramPacket(b,b.length);

            ms.receive(datagramPacket);//接受数据

             Stringstring = new String(datagramPacket.getData(),datagramPacket.getOffset(),

                       datagramPacket.getLength());              

             System.out.println(datagramPacket.getAddress()+""+ string);

        }

     

4、NIO

    NIO是jdk1.4之后引入的一套全新的IO API,处理数据的方式不同于传统IO,传统IO的处理数据的方式以字节为单位,而NIO是一个Buffer(数据块) 为单位,传统IO属于阻塞式(流在读取数据时如果未读到时,程序会处于阻塞状态);而NIO的处理的方式为非阻塞式方式允许(底层为信号通讯),NIO可以在单线程应用中处理多个客户请求。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值