javaSE_day14学习笔记 —— 网络编程

1. 网络编程概述

1.1 计算机网络

将独立的,分散的计算机系统(手机,电脑)通过线路,通信设备(路由器,交换机)连接起来,由软件来实在资源共享,信息传递的系统。

1.2 网络模型

  • OSI开放式系统互联。国际标准组织制定了OS七层网络模型(Open System Interconnection)模型
  • OSI七层网络模型
    物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

1.3 协议

  • 事先规定好的通信规则
  • 协议分类
    • 公有:IP、HTTP、UDP
    • 私有: JDBC连接数据库的总协议

网络层:IP
传输层:UDP、TCP
应用层:FTP(上传下载(响应成功后不断开))、HTTP(宣传性网站(响应成功后断开))、HTTPS

1.4 IP地址

  • IP地址:标识网络上的唯一一台计算机
  • IP地址分为两个版本:IPv4(32位二进制)、IPv6(128位二进制)

1.5 端口

  • 范围:0-65535
  • (0-1024)是预留的端口号,已经被某些服务器占用

1.6域名解析

解析成IP地址
localhost(www.163.com) --> 127.0.0.1(72.1.1.1)

2. Java中的网络编程

2.1 UDP通信——写信

  • 不需要创建连接
  • 通过发送数据包通信 每个数据包最大64kb
  • 不可靠的传输机制
  • 传输速度
  • 追求速度快,可靠性要求不高的场景下 — 视频聊天

2.2 TCP通信——打电话

  • 需要先创建连接。并且在创建连接的过程中,需要经过三次握手
  • 底层通过 发送数据,数据大小没有限制
  • 可靠的传输机制 – 丢包重发 包的顺序的保障
  • 传输速度相对较
  • 对于速度要求不太高,但是对可靠性要求比较高的场景下 - 文件上传 下载

eg:
要先启动接收端,再启动发送端
在这里插入图片描述
在这里插入图片描述
因为TCP在通信的过程中是需要创建连接的,

  • 连接的发起者称为客户端
  • 监听端口等待被连接的一端称为服务端
    在这里插入图片描述
    服务端:
    在这里插入图片描述
    客户端:
    在这里插入图片描述

案例:实现文件上传服务器

/**
 * 实现上传功能
 */
public class DemoUploadServer {
	public static void main(String[] args) throws IOException{
		//1.创建套接字对象
		ServerSocket serverSocket = new ServerSocket(4444);
		Socket socket = serverSocket.accept();		
		//2.获取输入流对象,解析数据
		InputStream inputStream = socket.getInputStream();
		byte[] b = new byte[1];
		String str = "";
		while(!str.endsWith("\r\n")) {
			inputStream.read(b);
			str += new String(b);
		}
		//str="11\r\n";
		int fileNameLen = Integer.parseInt(str.substring(0,str.length()-2)); //[0,2)
		byte[] fileNameArr = new byte[fileNameLen];
		inputStream.read(fileNameArr);
		//文件名
		String fileName = new String(fileNameArr);		
		byte[] b2 = new byte[1];
		String str2 = "";
		while(!str2.endsWith("\r\n")) {
			inputStream.read(b2);
			str2 += new String(b2);
		}
		int fileLen = Integer.parseInt(str2.substring(0,str2.length()-2));
		byte[] fileArr = new byte[fileLen];
		inputStream.read(fileArr);		
		//3.创建文件的输出流,把数据文件的数据(byte),写到upload文件夹下,文件夹名为原数据文件的名字
		FileOutputStream fileOut = new FileOutputStream("upload/"+fileName);
		fileOut.write(fileArr);
		fileOut.close();		
		//4.使用输出流响应客户端的请求“上传成功!”
		OutputStream out = socket.getOutputStream();
		PrintWriter pWriter = new PrintWriter(out);//可以放字符流和字节流
		pWriter.println("上传成功!");//ln换行表示输入输出流结束
		pWriter.flush();//把没满的数据从缓冲区中推出来		
		//5.关闭流,关闭套接字对象
		pWriter.close();
		socket.close();
		serverSocket.close();
	}
}
/**
 * 实现上传功能
 */
public class DemoUploadClient {
	public static void main(String[] args) throws IOException {
		//1.创建套接字对象
		Socket socket = new Socket("127.0.0.1",4444);		
		//2.使用输出流输入数据文件内容
		OutputStream outputStream = socket.getOutputStream();
				
		//11 表示数据文件的文件名的长度(为了不浪费内存,也防止丢了数据);  \r回车  \n换行 ;  read_v1.txt表示传递给服务器的文件名 ;   100表示文件长度;    代码修正...表示文件内容 
		//[11\r\nread_v1.txt100\r\n代码修正...]
		File file = new File("read_v1.txt");
		//当前文件名长度
		outputStream.write((file.getName().getBytes().length+"\r\n").getBytes());
		//文件名
		outputStream.write(file.getName().getBytes());
		//文件长度
		outputStream.write((file.length()+"\r\n").getBytes());
		//写文件内容
		FileInputStream fileIn = new FileInputStream(file);
		byte[] buff = new byte[(int) file.length()];
		fileIn.read(buff);
		fileIn.close();
		outputStream.write(buff);		
		//5.接收服务器的响应
		InputStream inputStream = socket.getInputStream();
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));//字节流转换为字符流
		String msg = bufferedReader.readLine();
		System.out.println(msg);		
		//6.close()
		outputStream.close();
		inputStream.close();
		bufferedReader.close();
		socket.close();
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
package windows; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.Vector; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.params.ClientPNames; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; import org.apache.http.util.EntityUtils; /** * 核心功能封装类 * @author 冯晋强 * */ public class TmoocOperate { static String sessionid; static CloseableHttpResponse response = null; static CloseableHttpClient httpclient = null; //静态块 static{ // 创建提交数据对象 httpclient = HttpClients.createDefault(); } /** * 处理在线疑答贴子列表源码数据 * @author 刑保政 */ public static String[][] splist(String Str) { Str = Str.substring(Str.lastIndexOf("<ul>") + 4, Str.lastIndexOf("</ul>")).replaceAll("\\s", ""); String[] lis = Str.split("</li>");// 所有记录的数组 String[] jilu = null;// 单条记录的数组 String[][] allMsg = new String[lis.length - 1][4]; // 创建一个二维数组保存处理后的数据,其中每个一维数组中包含一个记录,每个二维数组中包含每条数据的信息 // allMsg[i][0]:标题; allMsg[i][1]:时间 allMsg[2]:处理状态 for (int i = 0; i < lis.length - 1; i++) {// 遍历所有记录,取出每一条记录 String ss = lis[i];// 取出每一条记录 jilu = ss.split("(</a></span>|</span>)"); // 每条记录分割成3部分 jilu[0]:标题 jilu[2]:时间 jilu[3]:处理状态 for (int j = 0; j < jilu.length; j++) {// 由于数据中还含有部分额外代码,遍历所有记录筛选数据 String msg = jilu[j];// 单条记录中的每一个数据 System.out.println(msg); msg = msg.substring(msg.lastIndexOf(">") + 1, msg.length()); String uid = jilu[0].substring(jilu[0].lastIndexOf("(") + 1, jilu[0].lastIndexOf(")")); allMsg[i][j] = msg; allMsg[i][3] = uid; } } return allMsg; } /** * 处理在线疑答帖子内容源码数据 * @author 刑保政 */ public static String[] splist1(String all) { String queStr = all.substring(all.indexOf("<div class=\"quesdetail\""),all.indexOf("<div id=\"answers\"")); // .replaceAll("\\s","");//处理源码筛选字符串,只获取含有问题标题的内容 // System.out.println(queStr);//测试标题部分字符串 String[] queArr = queStr.split("(</span|</pre|</div>)"); for(int i=0;i<queArr.length;i++){ String msg = queArr[i]; msg = msg.substring(msg.lastIndexOf(">")+1, msg.length()); if(i == 5){ msg = msg.substring(msg.indexOf(":")+1).trim(); } queArr[i] = msg; } String[] que = new String[4];//保存最终标题内容的数组 que[0] = queArr[1]; que[1] = queArr[3]; que[2] = queArr[4]; que[3] = queArr[5]; for(int i=0;i<2;i++){ que[i] = que[i].replaceAll("<","<"); que[i] = que[i].replaceAll(">",">"); que[i] = que[i].replaceAll(" "," "); que[i] = que[i].replaceAll("&","&"); que[i] = que[i].replaceAll(""","\""); que[i] = que[i].replaceAll("©","@"); que[i] = que[i].replaceAll("®","商标"); } return que; } // 回复帖子方法包 public static boolean SetTitle1(String message,String uid) { try { // url提交地址 HttpPost httpPost = new HttpPost("http://tts8.tmooc.cn/onlinefaq/anwser"); // 组合数据包 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("questionId", uid)); nvps.add(new BasicNameValuePair("context", message)); // 设置数据包 httpPost.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8)); // 提交数据包 response = httpclient.execute(httpPost); // 读取返回数据信息 String str = EntityUtils.toString(response.getEntity()); System.out.println(str); if(str.indexOf("true")!=-1){ return true; }else{ return false; } } catch (ClientProtocolException e) { System.out.println("数据包提交失败"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } // 发送帖子方法包 public static boolean SetTitle(String tilte, String message) { try { // url提交地址 HttpPost httpPost = new HttpPost("http://tts8.tmooc.cn/onlinefaq/add"); // 组合数据包 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("title", tilte)); nvps.add(new BasicNameValuePair("context", message)); // 设置数据包 httpPost.setEntity(new UrlEncodedFormEntity(nvps,HTTP.UTF_8)); // 提交数据包 response = httpclient.execute(httpPost); // 读取返回数据信息 String str = EntityUtils.toString(response.getEntity()); System.out.println(str); if(str.indexOf("true")!=-1){ return true; }else{ return false; } } catch (ClientProtocolException e) { System.out.println("数据包提交失败"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } /** * * @author 刑保政 */ public static Vector<Vector<String>> getAite(Vector<Vector<String>> vvs){ /** 保存所有姓名的集合,因为回帖人中有重复数据,所以这里用Set去除重复 */ Set<String> usersSet = new HashSet<String>(); /** 保存所有回帖内容的集合 */ List<String> texts = new ArrayList<String>(); /* 遍历回帖集合,分别取出每一条记录中的回帖人和回帖内容,并添加到 * 对应的集合中,方便下一步遍历筛选 */ for(int i=0;i<vvs.size();i++){ Vector<String> v = vvs.get(i); String user = v.get(1); String text = v.get(3); usersSet.add(user); texts.add(text); } // System.out.println(users);//测试回帖人集合 // System.out.println(texts);//测试回帖内容集合 String[] users = new String[usersSet.size()]; usersSet.toArray(users);//将usersSet回帖人集合转为数组方便遍历 // System.out.println(Arrays.toString(users));//测试回帖人数组 /* 遍历回帖人数组,取出每一个回帖人, * 遍历每一条回帖内容,判断内容是否以@+回帖人开头,(当前设置@只能在开头有用,中间的不予考虑) * 若是则提取该回帖人并添加到当前楼层集合中 */ for(int i=0;i<users.length;i++){ String user = users[i]; for(int j=0;j<texts.size();j++){ String text = texts.get(j); if(text.startsWith("@" + user)){ // System.out.println(text); vvs.get(j).add("@" + user); } } } return vvs;//将处理后的集合返回 } /** * * @author 刑保政 */ public static Vector<Vector<String>> getAnswer(String all){ all = all.substring(all.indexOf("<div id=\"answers\""), all.indexOf("<div id=\"appendQues\"")); //抽取数据片段(答案部分) // System.out.println(all); String[] ansArr = all.split("<div class=\"answer");//分割成存储单条回帖的数组 String[] answer = null;//每一条回帖数组 Vector<Vector<String>> vvs = new Vector<Vector<String>>();//创建二维集合保存信息 /* * 遍历回帖集合,取出每一条回帖记录,分割成一组回帖信息元素, * 进行处理后添加进二维集合 */ for(int i = 1;i<ansArr.length;i++){ String ansStr = ansArr[i]; answer = ansStr.split("(</span>|</pre>)"); vvs.add(new Vector<String>()); vvs.get(i-1).add(i + "");//楼层数 for(int j=0;j<answer.length-1;j++){//处理每条回帖的信息 String msg = answer[j].trim(); msg = msg.substring(msg.lastIndexOf(">")+1,msg.length()).trim(); if(j == 1){//对时间单独进行处理一下 msg = msg.substring(msg.indexOf("(")+1,msg.length()-1).trim(); } vvs.get(i-1).add(msg);//添加进二维集合 } } vvs = getAite(vvs); return vvs; } // 读取在线疑答帖子内容源码数据 public static String Get_title(String uid) { try { // url提交地址 HttpGet httpGet = new HttpGet("http://tts8.tmooc.cn/onlinefaq/detail/"+ uid); // 提交数据包 response = httpclient.execute(httpGet); // 取出cookie System.out.println(response.getFirstHeader("Cookie")); // 读取返回数据信息 String str = EntityUtils.toString(response.getEntity()); return str; } catch (ClientProtocolException e) { System.out.println("数据包提交失败"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } // 读取在线疑答帖子列表源码数据 public static String Get_tilte() { try { // url提交地址 HttpGet httpGet = new HttpGet("http://tts8.tmooc.cn/onlinefaq/questionList"); // 提交数据包 response = httpclient.execute(httpGet); System.out.println("第七次请求成功"); // 读取返回数据信息 String str = EntityUtils.toString(response.getEntity()); return str; } catch (ClientProtocolException e) { System.out.println("数据包提交失败"); e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } // 初始化登陆,判断是否需要登陆验证码 暂时未完善 public static void GetCode(String user) { CloseableHttpClient httpclient = null; CloseableHttpResponse response2 = null; try { // url提交地址 HttpPost httpPost = new HttpPost("http://tmooc.cn/login/loginTimes"); // 组合数据包 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("login_name", user)); // 设置数据包 httpPost.setEntity(new UrlEncodedFormEntity(nvps)); // 创建提交数据对象 httpclient = HttpClients.createDefault(); // 提交数据包 response2 = httpclient.execute(httpPost); // 读取返回数据信息 String str = EntityUtils.toString(response2.getEntity()); System.out.println(str); TmoocOperate.SetTitle("今天的表示没怎么听懂", "你们呢。。。"); } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { response2.close(); httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } // 登陆Tmooc方法 public static boolean Tmooc_Login(String user, String pass) { try { // url提交地址 HttpPost httpPost = new HttpPost("http://tmooc.cn/login"); // 组合数据包 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("login_name", user)); nvps.add(new BasicNameValuePair("password", Login_MD5(pass).toLowerCase())); nvps.add(new BasicNameValuePair("type", "P")); nvps.add(new BasicNameValuePair("uuid","E1CC4286A419C899CCBF6A04E5A1CF02")); // 设置数据包 httpPost.setEntity(new UrlEncodedFormEntity(nvps)); // 提交数据包 response = httpclient.execute(httpPost); // 读取返回数据信息 String str = EntityUtils.toString(response.getEntity()); //判断是否登陆成功 if (str.indexOf(user) != -1) { sessionid = str.substring(14, str.indexOf("|P#")); // 取出cookie方法 这里用不到 //Cookie = response2.getFirstHeader("Set-Cookie").toString(); // url提交地址 HttpGet httpGet = new HttpGet("http://tmooc.cn/login/hadlogin/"+ sessionid); // 提交数据包 response = httpclient.execute(httpGet); // url提交地址 httpGet = new HttpGet("http://tts8.tmooc.cn/user/myTTS?sessionId=" + sessionid + "&date="); // 提交数据包 response = httpclient.execute(httpGet); return true; } } catch (UnsupportedEncodingException e) { System.out.println("设置数据包出错"); e.printStackTrace(); } catch (ClientProtocolException e) { System.out.println("提交数据异常"); e.printStackTrace(); } catch (IOException e) { System.out.println("其他错误"); e.printStackTrace(); } return false; } //utf-8编码 public static String bm_utf8(String Str){ String bmjg = null; try { bmjg = URLEncoder.encode(Str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return bmjg; } // 登陆tmooc时md5加密方法 public final static String Login_MD5(String s) { char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; try { byte[] btInput = s.getBytes(); // 获得MD5摘要算法的 MessageDigest 对象 MessageDigest mdInst = MessageDigest.getInstance("MD5"); // 使用指定的字节更新摘要 mdInst.update(btInput); // 获得密文 byte[] md = mdInst.digest(); // 把密文转换成十六进制的字符串形式 int j = md.length; char str[] = new char[j * 2]; int k = 0; for (int i = 0; i < j; i++) { byte byte0 = md[i]; str[k++] = hexDigits[byte0 >>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } }
JavaSE网络编程采用的是基于TCP/IP协议的网络模型。这个模型包括客户端和服务器端两部分。客户端通过套接字(Socket)与服务器建立连接,服务器则监听客户端的连接请求并进行响应。 在Java中,可以使用Socket类和ServerSocket类来实现网络编程。Socket类用于建立客户端与服务器之间的通信连接,而ServerSocket类则用于创建服务器端的套接字,监听并接受客户端的连接请求。 客户端通过创建Socket对象,指定服务器的IP地址和端口号,然后通过Socket对象的方法与服务器进行通信。服务器端通过创建ServerSocket对象,指定服务器要监听的端口号,并通过accept()方法接受客户端的连接请求。一旦建立了连接,客户端和服务器端就可以通过输入流和输出流来进行数据的传输。 网络模型是基于TCP/IP协议的,因此可以使用Java的InputStream和OutputStream来进行数据的读写。客户端可以通过InputStream从服务器端接收数据,通过OutputStream向服务器端发送数据。服务器端则可以通过InputStream接收客户端发送的数据,通过OutputStream向客户端发送数据。 总结来说,JavaSE网络编程采用的是基于TCP/IP协议的网络模型,通过Socket和ServerSocket来实现客户端和服务器端之间的通信。通过InputStream和OutputStream来进行数据的读写。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JavaSE——网络编程](https://blog.csdn.net/yzl1293346757/article/details/126192384)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [JavaSE学习——网络编程](https://blog.csdn.net/Demon_and_Angle_/article/details/126387829)[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^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值