网络编程(计算机网络)

IP协议

计算机网络通信三要素:

  1. 明确的IP地址
  2. 一致的端口号
  3. 传输协议一致

面试题

1:Ip地址是用来标记网络中计算机的唯一识别方式
2:端口号是同来标记计算机中的所运行的每一个程序的
3:传输协议分为TCP和UDP

4:TCP和UDP的区别
TCP协议(传输控制协议) :属于面向有连接的、传输速度慢、安全性高、没有传输数据大小限定特点:必须是经过三次握手之后,在建立连接通道后,才可以传输数据
UDP协议(数据报文协议):属于面向无连接、传输速度快、安全性低、传输的数据必须限定在64K以内,不适应于传输数据较大、对数据安全的要求的程序
5:计算机网络中三次握手
第一次客户端发送连接请求
第二次服务端发送收到确认
第三次互相通信

6:HTTPS和HTTP区别
https需要到ca(数字证书颁发机构)申请证书(这套数字证书其实就是一对公钥和私钥,私钥存放在服务端,公钥发给客户端用),一般都要钱
http是超文本传输协议,信息是明文传输。

7:各种服务的端口号

服务端口号服务端口号
FTP21SSH22
telnet23SMTP25
Domain53HTTP80
POP3110NTP123
MySQL3306SQL Server
POP-2109

TCP客户端和服务端通信

TCP连接会用到一个特殊的类:ServerSocket
此类实现了服务器套接字,服务器套接字等待请求网络传入

//构造方法,创建非绑定服务器套接字
ServerSocket()
//创建绑定到特定端口的服务器套接字
ServerSocket(int port)
//倾听并接收到此套接字的连接,服务器会一直阻塞,等待客户端连接
Socket accept()

初次连接通信

服务端 :

	public static void main(String[] args) throws IOException {
		System.out.println("服务器启动中...");
		//创建服务端对象
		ServerSocket ss = new ServerSocket(8888);
		//获取客户端对象
		Socket server = ss.accept();//执行到此时,会进入阻塞状态
		//基于客户端对象获取服务端的输入流
		InputStream is =server.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		//打印接收到数据
		System.out.println(new String(b,0,len));
		//向客户端输入数据
		OutputStream os = server.getOutputStream();
		os.write("你好,client".getBytes());
		os.close();
		is.close();
		server.close();

客户端:

public static void main(String[] args) throws IOException {
		//创建socket对象,请求连接
		Socket client = new Socket("localhost",8888);
		//通过Socket对象获取OutputStream,向服务器写数据
		OutputStream os = client.getOutputStream();
		//向服务器中写数据
		os.write("hello".getBytes());
		//通过Socket对象获取OutputStream,解析回写的数据		
		InputStream is = client.getInputStream();
		byte[] b = new byte[1024];
		int len = is.read(b);
		System.out.println(new String(b,0,len));
		//刷新并关闭资源
		os.flush();
		is.close();
		os.close();
		client.close();

	}

通信的时候需要先启动服务器,再启动客户端

实现服务端并发

将服务端一直开启,接收多次发来的数据

/**
 * TCP并发
 * @author zhuang
 *
 * 2020年11月18日 下午8:20:01
 */
public class ServerRunnable implements Runnable{
	//客户端对象
	Socket server = null;	
	public ServerRunnable() {
		
	}
	
	public ServerRunnable(Socket server) {
		this.server = server;
	}

	@Override
	public void run() {
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			bis = new BufferedInputStream(server.getInputStream());
			bos = new BufferedOutputStream(new FileOutputStream(System.currentTimeMillis()+".png"));
			byte[] b = new byte[1024*8];
			int len = 0;
			while((len = bis.read(b)) != -1) {
				bos.write(b, 0, len);
				bos.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(bos != null)
					bos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(bis != null)
					bis.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
 				e.printStackTrace();
			}
		}
		
	}

}
/**
 * TCP文件传输客户端
 * @author zhuang
 *
 * 2020年11月18日 下午8:20:56
 */
public class TransFileClient {

	public static void main(String[] args) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream("abc2.jpg"));
		Socket socket = new Socket("localhost",8888);
		BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
		byte[] b = new byte[1024*8];
		int len = 0;
		while((len = bis.read(b)) != -1) {
			bos.write(b, 0, len);
			bos.flush();
		}
		System.out.println("文件上传完毕");
		bos.close();
		socket.close();
		bis.close();

	}

}
/**
 * TCP传输服务端
 * @author zhuang
 *
 * 2020年11月18日 下午8:21:56
 */
public class TransFileServer {

	public static void main(String[] args) throws IOException {
		System.out.println("服务器启动中。。。");
		ServerSocket ss = new ServerSocket(8888);
		while(true) {
			Socket server = ss.accept();
			ServerRunnable sr = new ServerRunnable(server);
			new Thread(sr).start();
			System.out.println("文件上传成功");			
		}
	
	}

}

UDP传输

DatagramSocket:是一个底层使用UDP协议传输的对象
服务器端:

public static void main(String[] args) throws IOException {
		//创建接收数据包的UDP对象
		DatagramSocket server = new DatagramSocket(9999);
		System.out.println("服务器已经准备好,等待客户端发送数据...");
		
		byte[] buf = new byte[1024];//定义接收数据包
		//接收数据包
		DatagramPacket dp = new DatagramPacket(buf,buf.length);
		server.receive(dp);
		System.out.println("客户端 "+dp.getAddress().getHostAddress()+"已连接");
		//利用数据包对象中的getLength()获取到实际接收到的数据长度
		int len = dp.getLength();
		//第一种方案,直接用byte数据,转换成字符串
		String str = new String(buf,0,len);
		System.out.println(str);

		//第二种方案,使用Datagrampacket对象中的getData()方法
		byte[] buf2 = dp.getData();
		System.out.println(new String(buf,0,dp.getLength()));
		
		server.close();
	}

客户端:

public static void main(String[] args) throws IOException {
		//创建UDP协议
		DatagramSocket client = new DatagramSocket(8888);
		
		//要发送的数据
		byte[] buf ="发送UDP文件信息".getBytes();
		
		InetAddress ip = InetAddress.getByName("localhost");

		//创建数据包对象,9999属于服务端的端口号
		DatagramPacket dp = new DatagramPacket(buf,buf.length,ip,9999);
		
		//把数据包发送到指定的服务器程序
		client.send(dp);
		
		//关闭客户端
		client.close();
	}

多线程并发

客户端

public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		System.out.println("发送端发送数据中。。。");

		DatagramSocket ds = new DatagramSocket();
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		String line = null;
		while((line = br.readLine()) != null) {
			if("exit".equals(line)) {
				break;}
			else {
				byte[] buf = line.getBytes();
				
				DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName("localhost"),9999);
				ds.send(dp);
			}
		}
		ds.close();
		System.out.println("发送结束");
	}

多线程代码:

public class UdpServerRunnable implements Runnable{
	
	DatagramSocket ds ;
	
	public UdpServerRunnable() {
		
	}
	 public UdpServerRunnable(DatagramSocket server) {
		 this.ds = ds;
	 }
	@Override
	public void run() {
		DatagramSocket ds;
		try {
			ds = new DatagramSocket(9999);
			while(true) {
				byte[] buf = new byte[1024];
				DatagramPacket dp = new DatagramPacket(buf, buf.length);
				try {
					ds.receive(dp);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				byte[] b = dp.getData();
				System.out.println(new String(b));
			}
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}

服务端:

public static void main(String[] args) throws IOException {
		System.out.println("接收端启动中。。。");
		DatagramSocket ds = new DatagramSocket(9999);
		while(true) {
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);
			ds.receive(dp);
			byte[] b = dp.getData();
			System.out.println(new String(b));
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算机网络编程设计是指在计算机网络中实现不同计算机之间的通信和数据交换的设计过程。这个设计过程需要考虑网络层、传输层和应用层等多个方面的协议和技术。 在网络编程设计中,首先需要了解网络层的协议。其中,ICMP协议是网络层的重要补充,用于检测网络连接。它可以通过发送和接收控制报文来实现网络故障的检测和诊断。 另外,为了实现进程间的通信,需要使用IP地址和端口号。每个进程需要有自己的IP地址和端口号,并与对方的IP地址和端口号建立连接。这需要依赖网络协议,如TCP/IP协议。 在网络编程设计中,数据链路层的功能是处理数据在物理媒介上的传输。它通过实现网卡接口的网络驱动程序来隐藏不同物理网络的细节,为上层协议提供一个统一的接口。数据链路层主要关注封装成帧、透明传输和差错检测等问题。 综上所述,在计算机网络网络编程设计中,需要考虑网络层的协议,如ICMP协议,以及IP地址和端口号的使用。同时,还需要了解数据链路层的功能和实现细节。这些都是实现计算机网络中不同计算机之间通信和数据交换的重要方面。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [网络编程/计算机网络](https://blog.csdn.net/qq_53830608/article/details/128024827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值