java网络编程之UDP&&TCP
2021/9/11 22:35:00
本文主要是介绍java网络编程之UDP&&TCP,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录:
一、Socket
二、ServerSocket
三、ServerSocket(多线程实现)
1、UDP协议实现发送端和接收端(Socket)
- DatagramSocket类 :定义发送端&&接收端
- DatagramPacket类:定义数据包,打包数据**
- 数据是通过流传输的,所有需要定义字节数组接收,当然,也可根据需求转为其他
- 切记:先启动接收端,在启动发送端,不然找不到接口
发送端代码实现:
package com.yjxxt.oop.basic.Work04.day06; import java.io.IOException; import java.net.*; //实现放送端 public class UdpSendTest04 { public static void main(String[] args) throws IOException { //1、定义端口 DatagramSocket datagramSocket = new DatagramSocket(8888); //端口号 //2、准备数据 byte[] by = "你还好吗?".getBytes(); //定义字节数组,存储数据 //3、打包 - 》接收端的IP+端口 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) DatagramPacket packet = new DatagramPacket(by,0,by.length, new InetSocketAddress("localhost",8889)); //发送地址&&接收端的端口号 //4、发送 datagramSocket.send(packet); //通过send()方法 把打包好的数据发送至接收端 //5、关闭 datagramSocket.close(); //关闭端口 } }
接收端代码实现:
package com.yjxxt.oop.basic.Work04.day06; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UdpReceiveTest04 { public static void main(String[] args) throws IOException { //1、定义我是接口端 DatagramSocket datagramSocket = new DatagramSocket(8889); //定义端口号 //2、定义字节数组 byte[] by = new byte[1024]; //字节数组 存储传过来的流 //3、打包接收数据 DatagramPacket d1 = new DatagramPacket(by,0,by.length); //把接收过来的流 存储在by字节数组里 //4、接收 datagramSocket.receive(d1); //接收 //5、处理数据 System.out.println(new String(by, 0, d1.getLength())); //简单处理 打印至控制台 //6、关闭 datagramSocket.close(); //关闭端口 } }
TCP协议实行基础客户端&&服务端:
- 发送数据两端不平等,客户端与服务器端
- 数据的传输基于IO流
- 利用多线程可开看客户端
客户端代码实现(非多线程版):
package com.yjxxt.oop.basic.Work04.day06; import java.io.*; import java.net.Socket; /* TCP双向登录的客户端 */ public class TcpTwoWayClientTest07 { public static void main(String[] args) throws IOException, InterruptedException { System.out.println("-------我是客户端--------"); //1、定义我是客户端 Socket socket = new Socket("localhost",9988); //指定要发送的服务端端口 System.out.println("-------与服务器之间建立了连接-------"); //2、准备数据 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); //通过监听,获取用户名&密码 System.out.print("请输入用户名:"); String username = bufferedReader.readLine(); System.out.print("请输入密码:"); String password = bufferedReader.readLine(); //3、获取输出流 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); //定义输出流 //4、IO操作 dataOutputStream.writeUTF("username=" + username + "&password=" + password); //发送流,输出 //5、刷出 dataOutputStream.flush(); //6、获取输入流 DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); //获取服务端传回的数据 //7、读取 System.out.println(dataInputStream.readUTF()); //8、关闭 dataInputStream.close(); dataOutputStream.close(); socket.close(); } }
服务端代码实现(非多线程版):
package com.yjxxt.oop.basic.Work04.day06; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Arrays; /* TCP双向登录的服务端 */ public class TcPTwoWayCleverTest077 { public static void main(String[] args) throws IOException { System.out.println("--------我是服务器--------"); //1、定义我是服务器 ServerSocket serverSocket = new ServerSocket(9988); //自己的端口号 //循环读取客户端 boolean flag = true; while (flag){ //循环监听 客户端排队进入 //2、阻塞监听 Socket client = serverSocket.accept(); System.out.println("---------一个客户端连接成功-----------"); //3、获取输入流 DataInputStream dataInputStream = new DataInputStream(client.getInputStream()); //4、IO操作 String str = dataInputStream.readUTF(); //讲获取的输入流存储进字符串里 //5、处理数据 ,判断 String name = ""; String pwd = ""; String[] string = str.split("&"); System.out.println(Arrays.toString(string)); for (String s: string){ String[] string2 = s.split("="); if("username".equals(string2[0])){ name = string2[1]; }else if("password".equals(string2[0])){ pwd = string2[1]; } } //6、获取输出流,结果响应给客户端 DataOutputStream dos = new DataOutputStream(client.getOutputStream()); if("kebang".equals(name) && "123456".equals(pwd)){ dos.writeUTF("登录成功"); }else { dos.writeUTF("登录失败"); } //7、刷出 dos.flush(); //8、关闭 dos.close(); dataInputStream.close(); client.close(); } serverSocket.close(); } }
TCP协议实行基础客户端&&服务端:
客户端代码实现(多线程版):
package com.yjxxt.oop.basic.Work04.day06; import java.io.*; import java.net.Socket; /* TCP实现多用户登录的服务端 */ public class TcpLulSocketTest08 { public static void main(String[] args) throws IOException { System.out.println("-------我是客户端--------"); //1、定义我是客户端 Socket socket = new Socket("localhost",8888); //指定要发送的服务端端口 System.out.println("-------与服务器之间建立了连接-------"); //2、准备数据 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); //通过监听,获取用户名&密码 System.out.print("请输入用户名:"); String username = bufferedReader.readLine(); System.out.print("请输入密码:"); String password = bufferedReader.readLine(); //3、获取输出流 DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); //定义输出流 //4、IO操作 dataOutputStream.writeUTF("username=" + username + "&password=" + password); //发送流,输出 //5、刷出 dataOutputStream.flush(); //6、获取输入流 DataInputStream dataInputStream = new DataInputStream(socket.getInputStream()); //获取服务端传回的数据 //7、读取 System.out.println(dataInputStream.readUTF()); //8、关闭 dataInputStream.close(); dataOutputStream.close(); socket.close(); } }
服务端代码实现(多线程版):
package com.yjxxt.oop.basic.Work04.day06; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Arrays; /* TCP实现多用户登录的服务端 通过多线程实现服务器端的多用户登录 一个客户端就要开启一个 线程为当前客户端服务 */ public class TcpLulServerSocketTest09 { public static void main(String[] args) throws IOException { System.out.println("--------我是服务器--------"); //1、定义我是服务器 ServerSocket serverSocket = new ServerSocket(8888); //自己的端口号 //循环接收多个客户端 boolean flag = true; while (flag){ //循环监听 客户端排队进入 //2、阻塞监听 Socket client = serverSocket.accept(); System.out.println("---------一个客户端连接成功-----------"); //开启多线程 new Thread(new Channel(client)).start(); } serverSocket.close(); } //把执行过程封装一个静态内部内里面 static class Channel implements Runnable{ //属性 //把局部变量的作用域提上来 private Socket client = null; private DataInputStream dis = null; private DataOutputStream dos = null; //空参构造器 public Channel() { } //构造器 public Channel(Socket client) { this.client = client; try { //3、获取输入流 dis = new DataInputStream(client.getInputStream()); //6、获取输出流,结果响应给客户端 dos = new DataOutputStream(client.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } } //IO流,读入操作 public String read(){ String str = ""; try { str = dis.readUTF(); } catch (IOException e) { e.printStackTrace(); } return str; } //获取输出流,响应给客户端 public void write(String str){ try { dos.writeUTF(str); } catch (IOException e) { e.printStackTrace(); } } //关闭进程 public void close(){ if(client!=null){ try { client.close(); } catch (IOException e) { e.printStackTrace(); } } if(dis!=null){ try { dis.close(); } catch (IOException e) { e.printStackTrace(); } } if (dos!=null){ try { dos.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public void run() { //3、获取输入流 //4、IO操作 String str = read(); //讲获取的输入流存储进字符串里 //5、处理数据 ,判断 String name = ""; String pwd = ""; String[] string = str.split("&"); System.out.println(Arrays.toString(string)); for (String s: string){ String[] string2 = s.split("="); if("username".equals(string2[0])){ name = string2[1]; }else if("password".equals(string2[0])){ pwd = string2[1]; } } //6、获取输出流,结果响应给客户端 if("kebang".equals(name) && "123456".equals(pwd)){ write("登录成功"); }else { write("登录失败"); } // //7、刷出 // dos.flush(); //8、关闭 close(); } } }
这篇关于java网络编程之UDP&&TCP的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15鸿蒙生态设备数量超8亿台
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?