Socket网络编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket网络编程相关的知识,希望对你有一定的参考价值。

网络编程总结(按照视频顺序):

1.网络模型概述

1.1OSI(七层)

应用层         

表示层

会话层

传输层

网络层

数据链路层

物理层

应用层:用户可以看到的,终端应用如WEB,QQ

表示层:对接收到的数据进行加密和解析

会话层:通过传输层建立数据传输通道

传输层:定义传输数据的协议和端口号

网络层:将从下层收到的数据进行IP地址的封装和解封装

数据链路层:从下层收到的数据进行MAC地址的封装与解封装

物理层:定义物理设备标准

1.2TCP/IP

应用层

传输层

网络层

主机至网络层

 

2网络要素:

      2.1IP地址:物理设备的网络地址,标识

      2.2端口:进程的标识,属于IP地址下属的端口位置

      2.3传输协议

          DNS(域名解析器)

   

当在网页上输入网址名时,会先访问本地有没有对应的DNS文件(c://system32/driver/etc/hosts,格式为IP地址-IP名,然后访问网络服务器上的DNS文件,返回相对应的IP地址,然后根据IP地址访问网站。

3网络编程

 

        3.1 InetAddress

 

 

 1 public class InetAdressTest {
 2     public static void main(String[] args) throws UnknownHostException {
 3     //获得本地主机IP对象    
 4     InetAddress ip = InetAddress.getLocalHost() ;
 5     System.out.println(ip.getHostName());
 6     System.out.println(ip.getHostAddress());
 7     //获得其他主机的ip对象
 8     ip =InetAddress.getByName("192.168.1.104");
 9     System.out.println(ip.getHostAddress());
10     System.out.println(ip.getHostName());
11 }
12 }

 

在其中我发现getHostAdress()方法和getHostName()方法不可以使用InetAdress变量直接调用,需要先获取要查询主机的IP地址。之前我一直以为类中的方法都可以直接调用该类的对象直接调用。

 

3.2域名解析(DNS

 

在服务器有这么一个DNS文件,里面记录了ip名和IP地址的对应关系,一般在服务时,通过ip名找到对应的ip地址,然后通过ip地址进行查找。

 

3.3Socket

 

Socket可以比喻为港口,船在港口间传输;。

 

两端都有socket;

 

网络通信其实就是socket间的通信;

 

数据在两个Socket间是io传输;

 

服务器端先开启服务,用户端再进行连接。

 

安全系数较高。

 

3.4UDP协议

 

就好像发快递一样,发送方只需在快递单上写明收信地址和收信人姓名即可,发出去之后就不再管对方是否收到;接收方收到之后也不向发送方进行确认。

 

安全系数低。

发送方:

public class AutoSend {

    /**
     * @param args
     * UDP协议实现思路
     * 1建立udp的socket服务
     * 2封装数据到数据包中
     * 3发送通过socket的服务
     * 4关闭socket的服务
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        System.out.println("发送端启动...");
        //1
        DatagramSocket ds = new DatagramSocket();
        //2
        BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while((line=bis.readLine())!=null){
        if("over".equals(line))
                    break;
        byte[] buf = line.getBytes();
        DatagramPacket dp =
                new DatagramPacket(buf,buf.length,InetAddress.getByName("10.100.1.255"),8000);
       
        ds.send(dp);
        }
                ds.close();
    }
}

接收方:

 1 public class AutoRecive {
 2 
 3     /**
 4      * @param args
 5      * 思路:
 6      * 1.创建SOCKET服务
 7      * 2.创建数据包,用于存储接收到的数据,方便用数据包中的方法来解析数据
 8      * 3.使用Recive方法将接受到的数据存储到数据包中
 9      * 4用数据包中的方法来解析数据
10      * 5关闭SOCKET服务
11      * @throws IOException 
12      */
13     public static void main(String[] args) throws IOException {
14         //1
15         System.out.println("接收端启动...");
16         DatagramSocket ds = new DatagramSocket(8000);
17         //2
18         while(true){
19         byte[] buf = new byte[1024];
20         DatagramPacket dp = new DatagramPacket(buf,buf.length);
21         //3
22         ds.receive(dp);
23         //4
24         String ip = dp.getAddress().getHostAddress();
25         int port = dp.getPort();
26         String text = new String(dp.getData());
27         System.out.println(ip+":"+port+":"+text);
28     if("over".equals(text)){
29         ds.close(); 
30     }
31     }
32 }
33 }

还可以使用实现Runnable接口的方式创建聊天室的多线程

最后是接收方与发送方的交互

 

3.5TCP协议

需要进行三次握手确认,建立信息传输的渠道。如打电话,拨打方问,你在吗,接收方回答,我在,拨打方再回复,好的,我知道了。然后就可以进行数据的传输了。

//这是服务器端

 1 package itcast.p5.text;
 2 
 3 
 4 import java.io.BufferedReader;
 5 import java.io.BufferedWriter;
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.io.InputStreamReader;
 9 import java.io.OutputStreamWriter;
10 import java.io.PrintWriter;
11 import java.net.ServerSocket;
12 import java.net.Socket;
13 
14 public class TextServer {
15 
16     /**
17      * @param args
18      * @throws IOException
19  * 服务端实现思路:
20      * 1建立Socket服务对象
21      * 2对外提供一个端口
22      * 3获取连接过去的客户端对象
23      * 4输出转变后的大写的数据
24 5关闭资源(Socket服务,socket)
25      */
26     public static void main(String[] args) throws IOException {
27         //System.out.println("服务器端已启动");
28         ServerSocket ss = new ServerSocket(1100);
29         Socket s = ss.accept();
30         //获取ip
31         String ip = s.getInetAddress().getHostAddress();
32         System.out.println(ip+"connect");
33         //获取读取流
34         BufferedReader in = 
35                 new BufferedReader(new InputStreamReader(s.getInputStream()));
36         
37         //输出流
38      PrintWriter out = 
39                 new PrintWriter(s.getOutputStream(),true);
40         
41         
42         String str = null;
43         while((str=in.readLine())!=null){
44        
45             System.out.println(str);
46             out.println(str.toUpperCase());
47         }
48         s.close();
49         ss.close();
50     }
51 }

//客户端

 1 package itcast.p5.text;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.io.PrintWriter;
 7 import java.net.Socket;
 8 
 9 public class TextClient {
10 
11     /**
12      * @param args
13      * @throws IOException 
14       1 创建tcp客户端socket服务
15      * 2如果连接建立,说明数据通道已连接
16      * 3将数据写出
17      * 4获取数据
18 5关闭资源
19      */
20     public static void main(String[] args) throws IOException {
21         System.out.println("客户端已启动");
22         Socket s = new Socket("10.100.1.150",1100);
23         //输出流
24         BufferedReader br =
25                 new BufferedReader(new InputStreamReader(System.in));
26         PrintWriter out = new PrintWriter(s.getOutputStream(),true);
27         
28         BufferedReader in = 
29                 new BufferedReader(new InputStreamReader(s.getInputStream()));
30         
31         String line = null;
32         while((line=br.readLine())!=null){
33             
34             if("end".equals(line)){
35                 System.out.println("客户端关闭");
36                 break;    
37             }
38             out.println(line);
39             String upper =in.readLine();
40             System.out.println(upper);
41         }
42 
43         s.close();
44     }
45 
46 }

另外上传文件时,服务器端需建立一个文件储存从客户端上传的文件夹中的数据。上传图片,没有用到高级缓冲io流,使用的是inputStream and OutputStream流。

4常见客户端

浏览器:IE

 最常见的服务端:

服务器:Tomcat

5

C/S  client/server

B/S  browser/server

 

以上是关于Socket网络编程的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

Python--网络编程-----socket代码实例