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自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装