网络编程

本文详细解析了计算机网络的基本构成,包括通信子网和资源子网,并阐述了IP地址、端口号以及协议(如UDP和TCP)的作用。重点介绍了TCP/IP模型及其工作原理。通过实例演示了如何使用Socket进行网络编程,实现客户端向服务器发送字符串并接收服务器的响应,包括客户端程序和服务器端程序的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      背景知识

       计算机网络由负责数据转发的通信子网和负责运算存储的资源子网所构成。在网络中每一台主机通过IP地址标识,每一个程序在计算机中通过端口号标识。然后通过共有的规则又称为协议才能使得计算机网络等到合理有效地运行。

     这里需要注意两点:

     1.常用的程序端口号:

         web: 80

         mysql: 3306

         tomcat: 8080

         QQ: 4000

          oracle:1521

     2.协议

        UDP:高效、非安全、异步协议,类似于发短信

        TCP:三次握手、安全、同步协议,类似于打电话

下面是整个网络的TCP/IP模型

图片

注意:IP和端口号是一个程序的唯一标识,外界就是通过IP+端口号对程序进行访问。协议中TCP和HTTP协议比较重要,其中TCP是HTTP协议的基础。


  TCP协议

     网络编程就是Socket(套接字)间编程,所谓的套接字就是与IP+Port生成的唯一网络标识。通信的双方(程序)都拥有属于自己的套接字,然后编程就是完成这些套接字之间字节或者字符流的发送和接受。

练习:客户端向服务器写字符串(键盘录入),服务器(多线程)将字符串反转后写回,客户端再次读取到是反转后的字符串

客户端程序:

package com.heima.practice;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class MyClient {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		/**
		 * 设置客户端套接字,并向服务器127.0.0.1:80端口发送请求
		 */
		Socket socket=new Socket("127.0.0.1", 8888);
		/**
		 * 获取输入和输出流
		 */
		OutputStream os=socket.getOutputStream();
		/**
		 * 向服务器发送请求
		 */
		String sendMsg="";
		Scanner sc=new Scanner(System.in);
		while(sc.hasNext()){
			sendMsg+=sc.next();
		}
		os.write(sendMsg.getBytes());
		/**
		 * 接受服务器的响应
		 */
		InputStream is=socket.getInputStream();
		byte[] content=new byte[1024];
		is.read(content);
		int len=content.length;
		System.out.println(new String(content,0,len));
		
		//关闭套接字
		socket.close();
		
		
	}

}

服务器端程序

package com.heima.practice;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class MyServer {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		/**
		 * 设置服务器套接字
		 */
		ServerSocket server=new ServerSocket(8888);
		/**
		 * 监听8888端口发出的信息
		 */
		final Socket socket=server.accept();
		System.out.println("Server is working!");
		while(true){
			new Thread(new Runnable() {
				@Override
				public void run(){
					try {
						InputStream is=socket.getInputStream();
						OutputStream os=socket.getOutputStream();
						/**
						 *获取输入的字符串 
						 */
						byte[] content=new byte[1024];
						is.read(content);
						int len=content.length;
						/**
						 * 将字符反转输出
						 */
						os.write(new StringBuilder(new String(content,0,len)).reverse().toString().getBytes());
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
		
	}


}
实验结果:

图片

这里对多程序的优化(Printer),以及实验的结果还存在一些问题,由于时间问题,需要更正下。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值