osi网络7层架构

举报
tea_year 发表于 2021/12/22 23:21:35 2021/12/22
【摘要】 一、osi网络7层架构 ip:网络唯一标识。(internet protocol address)网络互联协议地址。分为网络地址和主机地址。 port:端口号,每一个网络应用程序都需要一个以上的端口号。(...

一、osi网络7层架构
ip:网络唯一标识。(internet protocol address)网络互联协议地址。分为网络地址和主机地址。
port:端口号,每一个网络应用程序都需要一个以上的端口号。(1-65535)。1000以内的不要用。
osi7层架构

物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。

tcp协议(传输控制协议),保证两个应用程序之间可靠的网络通信。可靠的,低效的。
telent ftp smtp等
udp协议(用户数据报文协议)。面向无连接的不可靠的,高效的。
qq snmp dns 在线视频

二、socket简介
套接字,用于描述一个ip和端口号绑定的通信会话(socket连接)。每一个网络服务都会打开一个socket连接。
serverSocket
位于java的net包下面。

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

Socket
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。

三、基于TCP协议的socket编程
创建一个基于tcp协议的scoket服务器
类 ServerSocket

此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
public class TalkServer {
public static void main(String[] args) throws Exception {
//创建一个serversocket在端口7000上,监听客户端请求
ServerSocket server= new ServerSocket(7000);
Socket socket = server.accept();//获取socket对象
//由Scoket对象获得输入流,并构造相应的bufferedReader对象
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由socket对象得到输出流,并构造printWrite对象
PrintWriter os = new PrintWriter(socket.getOutputStream(), true);
//由控制台输入构造BufferedReader对象
BufferedReader sin= new BufferedReader(new InputStreamReader(System.in));
System.out.println(“client:”+in.readLine());//打印客户端消息
String line = sin.readLine();//从控制台读取输入消息
while(!line.equals(“bye”)){
//把line返回给client
os.println(line);
System.out.println(“server:”+line);
System.out.println(“client:”+in.readLine());
line=sin.readLine();//读取下一条消息

	}
	in.close();
	os.close();
	sin.close();
	socket.close();
	
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

}

使用多线程技术完成多服务对多客户端

package com.aaa.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TalkServerThread implements Runnable {

private Socket socket;


public TalkServerThread(Socket socket) {
	super();
	this.socket = socket;
}


@Override
public void run() {
	//由Scoket对象获得输入流,并构造相应的bufferedReader对象
	BufferedReader in;
	try {
		in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//由socket对象得到输出流,并构造printWrite对象
		PrintWriter os = new PrintWriter(socket.getOutputStream(), true);
		//由控制台输入构造BufferedReader对象
		BufferedReader sin= new BufferedReader(new InputStreamReader(System.in));
		System.out.println("client:"+in.readLine());//打印客户端消息
		String line = sin.readLine();//从控制台读取输入消息
		while(!line.equals("bye")){
			//把line返回给client
			os.println(line);
			System.out.println("server:"+line);
			System.out.println("client:"+in.readLine());
			line=sin.readLine();//读取下一条消息
			
		}
		in.close();
		os.close();
		sin.close();
		socket.close();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	

}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

}

测试类
package com.aaa.tcp;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MultiSocketServerTest {

/**
 * @param args
 * @throws Exception 
 */
public static void main(String[] args) throws Exception {
	//多个socket连接,但是端口号一致
	ServerSocket server=new ServerSocket(7000);
	Socket socket=null;
	while(true){
		socket = server.accept();//等待获取来自客户端的socket请求
		//一旦客户端请求到达,开启一个线程,来跟客户端交互
		new Thread(new TalkServerThread(socket)).start();
	}
	
	
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

}

四、基于UDP协议的socket编程
InetAddress
public static void main(String[] args) throws Exception {
InetAddress localHost = InetAddress.getLocalHost();
String hostName = localHost.getHostName();
System.out.println(hostName);
String hostAddress = localHost.getHostAddress();
System.out.println(hostAddress);

	//获取远程网站的ip
	InetAddress baidu = InetAddress.getByName("www.baidu.com");
	System.out.println(baidu.getHostAddress());
}

  
 
  • 1
  • 2
  • 3
  • 4

使用upd模拟飞秋发送消息
package com.aaa.network;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Date;

/**

  • @author sunshaoshan

  • @description java 模拟飞秋发送消息

  • @company AAA软件

  • 2018-11-5下午4:45:53
    */
    public class FeiQiuTest {

    /**
    *TODO
    *@param args
    *2018-11-5下午4:45:45
    */
    public static void main(String[] args) {
    DatagramSocket ds= null;
    DatagramPacket dp = null;
    InetAddress localHost;
    String Version=“1_lbt4_0#128#000C29D68D8F#0#0#0#2.5a”;
    Long id=new Date().getTime();//获取当前系统毫秒
    String user=“孙韶山”;
    String host=“sunshaoshan”;
    //long IPMSG_SENDMSG = 0x00000020;//发消息
    long IPMSG_SENDMSG = 209;//发消息
    String msg=“I kill you!”;
    while(true){

      try {
      	ds=new DatagramSocket();
      	//localHost = InetAddress.getByName("DESKTOP-H5URIFQ");
      	localHost=InetAddress.getLocalHost();
      	String message=Version+":"+id+":"+user+":"+host+":"+IPMSG_SENDMSG+":"+msg;
      	//封装数据报文,2425是飞秋的端口号
      	///1version(IPMSG版本):no(消息编号,可以用系统时间):user(发送消息的用户名):host(发送消息的主机名):command(上述Command常量,可以用|组合多个值):msg(消息内容) 
      	byte[] buff= message.getBytes("gbk");
      	dp = new DatagramPacket(buff, buff.length,localHost,2425);
      	//发送报文
      	ds.send(dp);
      } catch (UnknownHostException e) {
      	e.printStackTrace();
      } catch (SocketException e) {
      	e.printStackTrace();
      } catch (IOException e) {
      	e.printStackTrace();
      }
      }
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    }

}

文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。

原文链接:aaaedu.blog.csdn.net/article/details/118511009

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。