网路编程

news/2024/10/19 15:22:31
UDP
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报包的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快

UDP传输发送端思路

1:建立udp的socket服务
2:将要发送的数据封装成数据包
3:通过udp的socket服务,将数据包发送出
4:关闭资源
点击查看代码
public class SendDemo1 {public static void main(String[] args) throws Exception {// 1:建立udp的socket服务// DatagramSocket//DatagramSocket()//构造数据报套接字并将其绑定到本地主机上的任何可用端口。
//        1:建立udp的socket服务DatagramSocket socket = new DatagramSocket();
//      2:将要发送的数据封装成数据包 DatagramPacket//DatagramPacket(byte[] buf, int length, InetAddress address, int port)//构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。byte[] bytes = "他见到我,跑着过来了".getBytes();int length = bytes.length;InetAddress address = InetAddress.getByName("192.168.22.25");DatagramPacket packet = new DatagramPacket(bytes, length, address, 10086);//10086是自己给定的端口号// 3:通过udp的socket服务,将数据包发送出//public void send(DatagramPacket p)socket.send(packet);//    4:关闭资源socket.close();}
}

UDP传输接收端思路

   1:建立udp的socket服务.2:通过receive方法接收数据3:将收到的数据存储到数据包对象中4:通过数据包对象的功能来完成对接收到数据进行解析.5:可以对资源进行关闭
点击查看代码
public class ReceiveDemo1 {public static void main(String[] args) throws Exception {
//        1:建立udp的socket服务.//DatagramSocket socket = new DatagramSocket(10086);//发送端和接收端的端口号要保持一致
//        2:通过receive方法接收数据
//        3:将收到的数据存储到数据包对象中byte[] bytes = new byte[1024];DatagramPacket packet = new DatagramPacket(bytes, bytes.length);socket.receive(packet);
//        4:通过数据包对象的功能来完成对接收到数据进行解析byte[] data = packet.getData();int length = packet.getLength();String s = new String(data, 0, length);System.out.println("收到的数据:" + s);}
}

InetAddress: java提供的类,用于表示ip地址

点击查看代码
public class InetAddressDemo1 {public static void main(String[] args) throws  Exception{// static InetAddress getLocalHost()//返回本地主机的地址。InetAddress ip1 = InetAddress.getLocalHost();System.out.println(ip1);// String getHostName()//获取此IP地址的主机名。String hostName = ip1.getHostName();//String getHostAddress()//获取此IP地址String address = ip1.getHostAddress();System.out.println("主机名:"+hostName+",ip地址:"+ address);}
}

实现聊天室

发送端

点击查看代码
public class SendDemo1 {public static void main(String[] args) throws Exception{
//    1:建立udp的socket服务DatagramSocket socket = new DatagramSocket();Scanner sc = new Scanner(System.in);
while(true){//    2:将要发送的数据封装成数据包System.out.println("请输入发送内容:");String data = sc.nextLine();byte[] bytes = data.getBytes();int length = bytes.length;InetAddress address = InetAddress.getByName("192.168.22.25");DatagramPacket packet = new DatagramPacket(bytes, length, address, 10000);//    3:通过udp的socket服务,将数据包发送出socket.send(packet);if("886".equals(data)){System.out.println("用户已经离开");break;}}//    4:关闭资源
socket.close();}
}

接收端

点击查看代码
public class ReceiveDemo1 {public static void main(String[] args) throws Exception{
//        1:建立udp的socket服务.DatagramSocket socket = new DatagramSocket(10000);
//        2:通过receive方法接收数据
//        3:将收到的数据存储到数据包对象中System.out.println("==============欢迎来到聊天室=================");while(true){byte[] bytes = new byte[1024];int length = bytes.length;DatagramPacket packet = new DatagramPacket(bytes, length);socket.receive(packet);
//        4:通过数据包对象的功能来完成对接收到数据进行解析.byte[] data = packet.getData();int length1 = packet.getLength();String s = new String(data, 0, length1);InetAddress address = packet.getAddress();String hostName = address.getHostName();BufferedWriter bw = new BufferedWriter(new FileWriter("src/com/shujia/day19/recode/" + hostName + ".txt",true));//将用户的聊天内容打包写入if("886".equals(s)){System.out.println("=====================");System.out.println("用户已经下线");System.out.println("=====================");}else{String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a").format(new Date());System.out.println(time);System.out.println(hostName+":"+s);bw.write(time);bw.newLine();bw.write(s);bw.newLine();bw.flush();}
}}
}
TCP建立连接,形成传输数据的通道;在连接中进行大数据量传输;
通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

TCP传输

    1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.3:通过Socket对象的方法,可以获取这两个流4:通过流的对象可以对数据进行传输5:如果传输数据完毕,关闭资源
TCP传输-客户端代码
    1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.3:通过Socket对象+的方法,可以获取这两个流4:通过流的对象可以对数据进行传输5:如果传输数据完毕,关闭资源
点击查看代码
public class ClientDemo1 {public static void main(String[] args) throws Exception{// 1:建立客户端的Socket服务,并明确要连接的服务器。//Socket(String host, int port)//创建流套接字并将其连接到指定主机上的指定端口号。Socket socket = new Socket("192.168.22.15", 12345);Scanner sc = new Scanner(System.in);// 3:通过Socket对象的方法,可以获取这两个流//获取通道中的输出流,将数据发送给服务端OutputStream outputStream = socket.getOutputStream();//获取通道中的输入流InputStream inputStream = socket.getInputStream();while (true){System.out.print("请输入要发送的内容:");String info = sc.nextLine();if("886".equals(info)){break;}// 4:通过流的对象可以对数据进行传输outputStream.write(info.getBytes());outputStream.flush(); // 来自于通道中的类byte[] bytes = new byte[1024];int length = inputStream.read(bytes);String s = new String(bytes, 0, length);System.out.println(s);}// 5:如果传输数据完毕,关闭资源
//        outputStream.close();socket.close();}
}

TCP传输-服务器端代码

    1:建立服务器端的socket服务,需要一个端口2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信3:通过客户端的获取流对象的方法,读取数据或者写入数据4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
点击查看代码
public class ServerDemo1 {public static void main(String[] args){try {// 1:建立服务器端的socket服务,需要一个端口//ServerSocket(int port)//创建绑定到指定端口的服务器套接字。ServerSocket ss = new ServerSocket(12345);// 2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信Socket socket = ss.accept();while (true){InetAddress inetAddress = socket.getInetAddress();String hostName = inetAddress.getHostName();// 3:通过客户端的获取流对象的方法,读取数据或者写入数据// 获取通道中的输入流InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int length = inputStream.read(bytes);String s = new String(bytes, 0, length);System.out.println(hostName+": "+s);// 获取通道中的输出流OutputStream outputStream = socket.getOutputStream();outputStream.write("服务器已接收!".getBytes());outputStream.flush();}}catch (Exception e){System.out.println("用户已退出。。。");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/73461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

修改VS的代码高亮颜色

点击工具->选项选择“字体和颜色”找到“用户成员-xx”、“用户类型-xx”,点击即可修改前景色、背景色

ArkUI-Image详解

ArkUI-Image详解 文章摘要: 给Image组件设置属性可以使图片显示更灵活,达到一些自定义的效果。以下是几个常用属性的使用示例。这时可以使用interpolation属性对图片进行插值,使图片显示得更清晰。Image组件引入本地图片路径,即可显示图片(根目录为ets文件夹)。通过rende…

强化学习算法笔记之【DDPG算法】

强化学习笔记第2篇,讲解DDPG算法。 感兴趣可以参考或者复刻。强化学习笔记之【DDPG算法】 目录强化学习笔记之【DDPG算法】前言:原论文伪代码DDPG 中的四个网络代码核心更新公式前言: 本文为强化学习笔记第二篇,第一篇讲的是Q-learning和DQN 就是因为DDPG引入了Actor-Crit…

python输出hello world

输出print("hello world")

2161: 【例9.3】小写字母转大写字母 【超出字符数据范围】

include <bits/stdc++.h> using namespace std; int main( ) { char a; cin >> a; cout << char(a-32); return 0; } // 反思1: cin >> a; 忘记写了 反思2: +是转为小写字母-是转为大写字母 【做错】

航飞参数计算

作者:太一吾鱼水 宣言:在此记录自己学习过程中的心得体会,同时积累经验,不断提高自己! 声明:博客写的比较乱,主要是自己看的。如果能对别人有帮助当然更好,不喜勿喷! 文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家…

第4课 SVN

1、svn的定义: svn是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式管理。 2.snv的作用: 在项目中对需求规格说明书,测试用例,代码,以及项目项目的文件进项管理和分享。 3、svn…

npm run的时候报错: this[kHandle] = new _Hash(algorithm, xofLen);

在前面加入以下配置信息 set NODE_OPTIONS=--openssl-legacy-provider && 后面跟原来的启动配置信息 凡哥,别他妈吹牛逼了