五月二十九日
1.Socket通信机制
①.建立连接
②连接地址
③TCP/IP Socket通信
2.Socket通信模式
①服务器创建ServerSocket对象并指明端口号
②运行ServerSocket对象的accept()方法,等待客户端请求
③服务器接收到客户请求,创建Socket对象与客户端建立连接
④客户端创建Socket对象,指定服务器IP和端口号,向服务器发出请求
⑤服务器和客户端分别建立输入流和输出流进行数据传输
⑥通信结束后,服务器与客户端关闭自己的Socket连接
⑦服务器程序运行结束后,调用ServerSocket对象close()方法停止等候客户端请求
3.DatagramPacket将数据打包,DatagramSocket将打包的数据报发送与接收
4.数据报通信发送与接收过程
①创建一个用于发送数据的DatagramPacket对象,
该对象包含发送数据,数据长度,目的主机IP和目的端口号
②指定和可用主机端口创建DatagramSocket对象
③调用DatagramSocket对象send()方法,以DatagramPacket对象为参数发送数据报
(1)创建接收DatagramPacket对象,包括空白是数据缓冲区和数据报分组长度
(2)指定或可用本机端口创建DatagramSocket对象
(3)调用DatagramSocket对象的recieve()方法,以DatagramPacket对象为参数接收数据报
内容有:数组报分组,发送端主机IP,发送端主机发送端口
public class UDPClient { public static void main(String[] args) { UDPClient udpc = new UDPClient(); } public UDPClient(){ CliThread ct = new CliThread();//创建客户类线程类对象 ct.start();//启动线程 } } class CliThread extends Thread{ public CliThread(){} public void run(){ String str1; String serverName = "DESKTOP-KRRAI5I/100.64.183.19";//服务器端计算机名 System.out.println("请求信息发送给服务器"+"《"+serverName+"》"); try{ while(true) { DatagramSocket dsk = new DatagramSocket();//创建UDP Socket对象 DatagramPacket dpk;//创建DatagramPacket对象 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));//创建输入变量 System.out.print("请输入数据:"); str1 = buf.readLine();//键盘读取数据 byte[] outBuf = new byte[str1.length()]; InetAddress address = InetAddress.getByName(serverName); dpk = new DatagramPacket(outBuf, outBuf.length, address, 8000);//数据打包 dsk.send(dpk); } } catch(IOException e){} } }
public class UDPServer { public static void main(String[] args) { UDPServer udps = new UDPServer(); } String strBuf; public UDPServer(){ SerThread st = new SerThread(); st.start(); } } class SerThread extends Thread { public SerThread() { } public void run(){ String str1; try{ //使用端口8000,建立连接 DatagramSocket dsk = new DatagramSocket(8000); System.out.print("服务器名:"); //显示服务器计算机名 System.out.println(InetAddress.getLocalHost().getHostName()); while(true){ byte[] inBuf = new byte[256]; //创建并设置接受dpk对象的接受信息 DatagramPacket dpk = new DatagramPacket(inBuf,inBuf.length); dsk.receive(dpk);//接受数据报分组 //将接受的分组中数据转换成字符串 str1 = new String(dpk.getData()); str1 = str1.trim();//去掉字符串中的收尾空格 if (str1.length()>0){ int pot = dpk.getPort();//获取远程端口号 System.out.println("远程端口:"+pot); System.out.println("服务器已接收到消息:"+str1); } } } catch (IOException e){ return; } } }
第四天:
7.算法:求两数之和
第一种:暴力破解,双循环
问题:为什么输出下标用return new int[]{i,j}
以及结尾用return new int[0];
return关键字在循环中如果得到了答案,那么相当于break,直接返回值
new int[]{i,j}相当于重新创建一个数组存储下标i和j
而if语句如果不成立那么,就返回一个空数组new int[0];
class solution{
public int twosum(int []nums,target){
for(int i = 0;i<nums.length;i++){
for(int j =0;j<nums.length;j++){
if(nums[i]+nums[j]==target){
return new int[]{i,j}} }
}
return new int[0];
}
}
第二种,HashMap<k,v>键值对
问题:containsKey方法的作用是什么
containsKey() 方法检查 hashMap 中是否存在指定的 key 对应的映射关系。
包括键映射值,值也能映射键吗?
hm.get(target-nums[i])的作用?
获取数组中对应元素的位置下标
为什么hm.put(num[i],i)放在for结构后面?
put方法将键值对插入到哈希图中
class solution{
public int twosum(int [] nums,target){
Map<Integer,Integer>hm = new HashMap<Integer,Integer>();
for(int i = 0;i<nums.length;i++){
if(hm.containsKey(target-nums[i])){//检查
return new int[]{hm.get(target-nums[i]),i}}
hm.put(num[i],i)}//将元素值与下标存入哈希图
retuen new int[0];}
}
8.数据库:组合两个表:
列名 | 类型 |
+-------------+---------+
| AddressId | int | Address为主键
| PersonId | int | Person为外主键
| City | varchar |
| State | varchar |
列名 | 类型 |
+-------------+---------+
| PersonId | int | Person为主键
| FirstName | varchar |
| LastName | varchar |
select FirstName,LastName,City,State from Person left join Address on Person.PersonId
=Address.PersonId;
问题:
join连接分为三种:
①内连接即inner join,
②outer join分为 left outer join和right outer join。
left outer join:结果集除匹配行外,包括左表有而右表没有的行
right outer join:结果集除匹配行外,包括右表有而左表没有的行
③交叉连接:将两个表进行笛卡尔积计运算,结果表行数两表之和
left join的作用?
左外连接:是否以左边表为主呢?
on的作用?
on关键字用来连接表
总结:了解了Socket通信,通过DatagramPacket类对象打包,DatagramSocket对象来发送和接受
对于数组中的一个个地比较数组中的元素,可以通过for(int i = 0;i<nums.length;i++){for(int j = i+1;j<nums.length;j++){}}不重复地比较
数据库中组合两个表可以根据外键通过outer on语句来组合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!