Java网络编程

计算机网络:

        网络概念:由点和线构成,表示诸多对象间的互相联系

        作用:为了实现资源共享和信息传递,通过通信线路连接起来的若干计算机

          互联网:Internet

        万维网:www(world wide web)

        物联网:Iot(Interner of things)

网络模型:

        OSI参考模型,七层:

                应用层:如http协议,SMTP协议(邮件)...

                表示层:将数据格式进行传话与加密.

                会话层:维持通讯

                传输层:如恢复通讯,数据流重用等事情.UDP,TCP

                网络层:ip,计算机在互联网的地址

                数据链路层:对其数据进行格式化的要求

                物理层:硬件设备,如网线,网线接口等

                                因为OSI过于理想化,所有没有被实现

TCP/IP模型:


                        应用层
                                对应OSI模型的应用层,表示层,会话层
                                对应的协议:HTTP,SMTP,HTTPS
                        传输层
                                对应OSI模型的传输层
                                对应的协议:TCP,UDP协议
                        网络层
                                对应OSI模型的网络层
                                对应的协议:IP
                        网络接口层
                                对应OSI模型的数据链路层与物理层
                                对应协议:以太网协议,ADSL协议等

                        网络编程需要:IP,端口号,通讯协议

IP

        概念:计算机在互联网中的地址

                IPV4

                        4个字节,每个字节由8位组成.所以每段的值0~255

                                0000 0000 ~ 1111 1111

                        192.168.7.151

                IPV6         

                        16个字节,每个字节8位组成,每段16位,所以每段取值范围0~65535

        查看当前计算机IP:

                        步骤: 1,打开dos命令框

                                  2,输入ipconfig

         IP地址的分类:

                        A类地址:大型网络,主要服务与国家与政府企业

                         B类地址:中型网络,主要服务与大型实验室等

                         C类地址:个人网络,咱们普通人与普通企业用的网络

        特殊IP:127.0.0.1表示本机

                 英文localhost 专业名称:回路地址

                相关命令: ipconfig 作用:查看当前计算机的ip信息

                 ping 作用:尝试连接对方

 InetAddress类: 作用:表示计算机在网络中的地址

	InetAddress ip =InetAddress.getLocalHost();
	
		System.out.println(ip);//获取计算机名称与ip地址
		System.out.println(ip.getHostAddress());//获取计算机ip地址
		System.out.println(ip.getHostName());//获取计算机名称

端口

        概念:程序在计算机中的地址

        范围:0~65535

                注意: 0~1023:一般被系统占用         

                1024~49151:注册端口

                49152~65535:动态端口:服务端必须确定监听端口号,但是客户端不需要确定端口号,可以交由操作系统动态分配,操作系统可以为每个应用程序分配互不冲突的端口号,系统分配的端口号范围介于 49152 到 65535 之间。

        常见的端口:

                 mysql端口号:3306

                Tomcat端口号:8080

                http协议端口号:80

                Oracle端口号:1521

                 redis端口号:6379

通信协议:

                TCP

                        中文名:传输控制协议

                        特点:面向连接,安全可靠,效率低,基于字节流进行通讯的,传输数据大小无限制

                             三次握手,四次挥手

                      Java中对应的类:

                                        Socket:客户端

                                        ServerSocket:服务器

 UDP

                中文名:数据包协议

                特点:面向无连接,不安全,效率高,基于数据包格式进行传输,一个数据包最多64kb

                俗称:对讲机

//随机生成一个字符串
		//因为内部的算法可以保证该字符串不会重复
		UUID uuid = UUID.randomUUID();
		String str = uuid.toString();
		str = str.replace("-", "");//去掉-和空格
		System.out.println(str);

基于TCP协议的通讯

       客户端需要在服务端有个映射,使用映射来进行操作

         服务端

               1. 创建ServerSocket

ServerSocket serverSocket = new ServerSocket(9988);//里面参数为端口号

             2.   等待客户端连接

Socket server = serverSocket.accept(); //此方法返回值为客户端映射
		InputStream is = server.getInputStream();//通过映射获取输入流
		byte[] b = new byte[1024];
		int len = 0;
		while ((len=is.read(b))!=-1) {//读取数据进行操作			
			String str = new String(b,0,len);
			System.out.println(str);//将客户端数据读取到控制台上
		}

              3.   关闭资源

                

    	is.close();
		server.close();
		serverSocket.close();

        客户端

                 创建客户端Socket

        

Socket socket = new Socket("127.0.0.1", 9988);//参数:服务器地址,端口号

           

OutputStream os = socket.getOutputStream();//创建输出流
		os.write("为世界上的所有美好而战".getBytes());
		

      关闭资源

        os.close();
		socket.close();
		System.out.println("客户端结束");

 

试试服务端给客户端发消息

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

public class Server {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		ServerSocket serverSocket = new ServerSocket(9988);//创建服务端
		Socket socket = serverSocket.accept();//使用映射获
		InputStream iS = socket.getInputStream();//使用映射获取输入流
		byte[] b = new byte [1024];//用此接收
		int len = iS.read(b);//读取到b
		
		String string =new String(b,0,len);
		
		System.out.println("服务端接收到客户端说:"+string);
		
		OutputStream oS = socket.getOutputStream();//使用映射输出
		oS.write("符号看象限".getBytes());//用字符串输出
		oS.flush();
		oS.close();
		
		socket.close();
		serverSocket.close();
		
		System.out.println("服务端关闭");
		
				
	}

}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Cilent {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1",9988);
		OutputStream oS = socket.getOutputStream();//输出流
		oS.write("奇变偶不变".getBytes());
		oS.flush();
		
		InputStream iS = socket.getInputStream();//输入流
		byte[] b = new byte[1024];
		int len = iS.read(b);
		String string=new String(b, 0, len);
		
		iS.close();
		oS.close();
		socket.close();
		
		System.out.println("服务端对客户端说:"+string);
		
		System.out.println("客户端结束");
		
	}

}

 试试实现上传

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.UUID;

public class Server {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		
		
		
		ServerSocket serverSocket = new ServerSocket(9988);
		System.out.println("服务端启动");
		
		Socket socket = serverSocket.accept();//获取映射
		
		InetAddress address = socket.getInetAddress();//获取客户端的信息
		
		InputStream iS = socket.getInputStream();//输入流,把客户端的数据拿到
		
		String name = UUID.randomUUID().toString().replace("-","");//创建一个不可能重名的名称
		name="E:\\Javanew\\Test"+name+".jpg";
		FileOutputStream fos = new FileOutputStream(name);//输入流		
		
		byte[]b = new byte[1024];
		int len = 0;
		
		while ((len=iS.read(b))!=-1) {
			//得客户端主动结束才可以为-1
			fos.write(b,0,len);
			fos.flush();
			
		}
		fos.close();
		
		System.out.println("客户端上传结束");
		
		OutputStream os = socket.getOutputStream();//输出流,准备给服务端反馈
		
		os.write("上传成功".getBytes());
		
		
		os.flush();
		os.close();
		iS.close();
		socket.close();
		serverSocket.close();
		
		
	}
}

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.text.AbstractDocument.BranchElement;

public class Cilent {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket socket = new Socket("127.0.0.1",9988);
		OutputStream oS = socket.getOutputStream();
		
		FileInputStream fiS= new FileInputStream("D:\\QQ图片20220325160444.jpg");
		byte[]b =new byte[1024];
		int len = 0;
		while ((len = fiS.read(b))!=-1) {			
			oS.write(b);
			oS.flush();
		}
		socket.shutdownOutput();//结束客户端输出流
		System.out.println("上传结束");
		
		InputStream iS= socket.getInputStream();//接收服务端的输入
		byte[]b1 =new byte[1024];//
		int len1 = 0;
		while ((len1 = iS.read(b1))!=-1) {			
			String string = new String(b1, 0, len1);
			System.out.println(string);
		}
		
		iS.close();
		fiS.close();
		oS.close();
		socket.close();
		System.out.println("客户端结束");
		
	}
}

 

上传成功 

基于UDP的通讯协议

         接收端

                DatagramSocket(端口号)

                接收端对象.receive(数据包):接收数据

         发送端

                DatagramSocket()

                发送端对象.send(数据包):用于发送数据包

        数据包

                DatagramPacket

package work3;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receive {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket(9988);//创建接收端socket
		byte[]b=new byte[1024];
		DatagramPacket packet = new DatagramPacket(b, b.length);//接收数据
		//用包接收
		socket.receive(packet);//用包接收
		
		byte [] b2 = packet.getData();//获取包中数据
		int len = packet.getLength();//获取包装数据长度
		String str = new String(b2,0,len);
		
		System.out.println("接收到了"+str);
		
		socket.close();
		
	}

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

public class Send {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		DatagramSocket socket = new DatagramSocket();//创建发送的sock
		byte[]b="为世界上所的美好而战".getBytes();//准备好发送的包
		
		InetAddress address = InetAddress.getByName("127.0.0.1");//接收端ip
		
		
		/**
		 * 准备要发送的数据包
		 * 1参:要发送数据所在的数组
		 * 2参:开始位置
		 * 3参:发送的字节长度
		 * 4参:接收端地址
		 * 5参:接收端端口号
		 */
		DatagramPacket packet = new DatagramPacket(b, 0, b.length, address, 9988);
		//发送数据
		
		socket.send(packet);
		
		socket.close();
	
	
	}

}


试一试让两个即时通讯

package tcp02;

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

/**
 * 1.创建服务器Socket
 * 2.等待客户端连接。获取客户端映射
 * 3.接收客户端消息
 * 		
 * 让两个输入输出一直保持同步运行
 * 
 *
 *
 */

public class Server {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		
		ServerSocket serverSocket = new ServerSocket(9988);//创建服务端
		Socket socket = serverSocket.accept();//搞映射	
		InputStream is = socket.getInputStream();	//用映射搞输入流
		ExecutorService pool = Executors.newFixedThreadPool(2);	//创2线程
		pool.submit(new Runnable() {		
			@Override
			public void run()   {
					while (true) {//	一直挂着	
						byte[] b = new byte[1024];
						int len;
						try {
							len = is.read(b);//读取
							String str = new String(b, 0, len);				 
							System.out.println("客户端说:"+str);//接收客户端消息,打印
						} catch (IOException e) {
						e.printStackTrace();
						}					
				   }
			}
		});
				
			
		pool.submit(new Runnable() {		
			@Override
			public void run() {
				while (true) {		//挂着		
					OutputStream os = null;
						try {
							os = socket.getOutputStream();
						} catch (IOException e) {					
							e.printStackTrace();
						}	
					Scanner scanner = new Scanner(System.in); //输入字符串
					String str2=scanner.next();//
							try {
								os.write(str2.getBytes());//将其输出
							} catch (IOException e) {								
								e.printStackTrace();
							}
						try {
							os.flush();
						} catch (IOException e) {					
							e.printStackTrace();
						}				
				}
			}
		});
				
		pool.shutdown();
	
	}
}

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.sql.PooledConnection;

public class Client {
	@SuppressWarnings("resource")
	public static void main(String[] args) throws UnknownHostException, IOException {
		
		Socket socket = new Socket("127.0.0.1",9988);
		OutputStream os = socket.getOutputStream();
		
		ExecutorService pool = Executors.newFixedThreadPool(2);
		
		pool.submit(new Runnable() {	
			@Override
			public void run() {
	
				while (true) {
					Scanner scanner = new Scanner(System.in); 
					String str2=scanner.next();
						try {
								os.write(str2.getBytes());
						} catch (IOException e) {			
								e.printStackTrace();
						}//给服务端的信息
		
						try {
							os.flush();
						} catch (IOException e) {
							e.printStackTrace();
						}
					
				}
				
		   }	
		
		});
		
		
	
		pool.submit(new Runnable() {		
			@Override
			public void run() {		
				while (true) {
					InputStream is = null;
					try {
						is = socket.getInputStream();
					} catch (IOException e) {
						e.printStackTrace();
					}
					 byte[]b  = new byte[1024];
					 int len;					
						try {
							len = is.read(b);						
							 String str = new String(b, 0, len);				 
							 System.out.println("服务端说:"+str);
						} catch (IOException e) {
							e.printStackTrace();
						}
				
			    }
			 
				
		   }
		});
		
		pool.shutdown();
	
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值