2020-11-07

网络编程

网络编程的实质就是已经创建好的计算机网络的基础之上,经过使用程序控制的特定方式,让两个(或多个)设备(例如计算机)之间进行数据传输。

java中的网络编程并不要求咱们以前对计算机网络的知识有那么深刻的研究,只需对网络的概念有基本的认识,并了解IP地址、端口号、URL等内容,这样就可以学习并使用JDK中提供的网络编程的API

java中和网络编写相关的API都在java.net包下面
C/S架构的全称是Client/Server,即客户端服务器端架构,客户端包含一个或多个在用户的电脑上运行的程序,而服务器端可使用Socket来实现,服务器端的程序经过Socket与客户端的程序通讯。

C/S 架构也能够看作是胖客户端架构,由于客户端须要实现不少的业务逻辑和界面展现功能。这种架构中,做为客户端的部分须要承受很大的压力,由于显示逻辑和事务处理都包含在其中。
优势:
	C/S架构的界面和操做能够很丰富。
	安全性能能够很容易保证。
	响应速度较快。

缺点:
	适用面窄,一般用于局域网中。
	用户群固定,因为程序须要安装才可以使用,所以不适合面向一些不可知的用户。
	维护成本高,软件进行一次升级,则全部客户端的程序都须要改变。

测试客户端与服务器端通讯
Server:java

package com.work;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server1 { 
 
  
	public static void main(String[] args) { 
 
  

		ServerSocket server = null;
		Socket sock = null;
		try { 
 
  
			server = new ServerSocket(7777);
			System.out.println("服务器已经启动");
			while (true) { 
 
  
				sock = server.accept();
				System.out.println("ip地址是:" + sock.getInetAddress());
				System.out.println("端口号是:" + sock.getPort());
				Thread t1 = new MyThread(sock);
				t1.start();
			}
		} catch (Exception e) { 
 
  
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

class MyThread extends Thread { 
 
  
	public Socket sock;

	public MyThread(Socket sock) { 
 
  
		this.sock = sock;
	}

	public synchronized void run() { 
 
  
		BufferedReader in = null;
		PrintWriter out = null;
		try { 
 
  
			in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));
			out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
			String line = null;
			while (!"bye".equals(line = in.readLine())) { 
 
  
				out.println(Thread.currentThread().getName() + ",你好" + line);
				out.flush();
				System.out.println("客户端发送的" + Thread.currentThread().getName() + ":" + line);
			}
		} catch (Exception e) { 
 
  
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally { 
 
  
			try { 
 
  
				in.close();
				out.close();
			} catch (Exception e) { 
 
  
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

Clientweb

package com.work;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class client1 { 
 
  
	@SuppressWarnings("resource")
	public static void main(String[] args) { 
 
  
		PrintWriter out = null;
		BufferedReader in = null;
		try { 
 
  
			Socket sock = new Socket("127.0.0.1", 7777);
			out = new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), "gbk"));
			in = new BufferedReader(new InputStreamReader(sock.getInputStream(), "gbk"));

			while (true) { 
 
  
				Scanner scan = new Scanner(System.in);
				System.out.println("请输入要发送给服务器的话:");
				String str = scan.nextLine();
				out.println(str);
				out.flush();
				String line = in.readLine();
				System.out.println("接收到服务器的:" + line);
			}
		} catch (Exception e) { 
 
  
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally { 
 
  
			try { 
 
  
				in.close();
				out.close();
			} catch (IOException e) { 
 
  
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}
	}
}

结果分析:
一、 用Telnet测试:
(1)先开启服务器
在这里插入图片描述Telnet远程访问:编程

在这里插入图片描述
在这里插入图片描述再次启动一个客户端
在这里插入图片描述在这里插入图片描述输入bye结束通讯:
在这里插入图片描述运用client通讯:
在这里插入图片描述在这里插入图片描述下期再见!安全