最近在学习Labview,以前做课设的时候,经常做的题目都是聊天室什么的。所以想把这个工程做出来,先实现第一步服务器向客户端发送数据。(为什么是这样,是因为b站大佬焊板子的兔子讲了相关的教程,感谢大佬)。
以下是服务器代码,我将结合图片说一下。最左边的有一个C的标志那个控件是一些初始化的参数它在java中相当于这么一句
ServerSocket socket1=new ServerSocket(25000); 另一个1000常量是超时时间(实际过程中把while去掉,配置成1,也不发生超时时间,或许是概念理解有误吧)
第二个有w的是监听,相当于Java中的
socket1.accept();
所以只实行一次,通常要结合while使用。第三个是写入,这个很好理解,图上很形象,从主机将流传往外部世界。第四个是销毁流的函数。这里为什么有两个销毁的函数呢,是因为我们如果在用Java的时候是不是ServerSocket也要销毁,如果连上来一个socket在通信完成后也要销毁呢,所以一个在while里面,一个在外面。
仿照大佬的做法,将循环变量传给连接上来的主机。在将变量转字符串的时候,我发现客户端如果一次读一个字节,那么客户端的显示控件只能正常显示到9,到10的时候就变成了0。所以在服务器端输入的时候我们就将其直接填充为4字节,然后把接收方直接每次接受4字节就可以了,但是在Java这种高级语言中不用,可以直接用read函数读取,返回值不等于-1就可以判断数据流还没接收完。
下面放一个在IDEA中运行的结果下面是Java代码
import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public class Main { public static void main(String[] args) throws Exception{ //ServerSocket socket1=new ServerSocket(25000); //socket1.accept(); for (int i = 0; i < 100; i++) { Socket socket = null; InputStream inputStream = null; try { // 连接到服务器 socket = new Socket("127.0.0.1", 25000); inputStream = socket.getInputStream(); byte[] buffer = new byte[1024]; int bytesRead; // 循环读取数据 while ((bytesRead = inputStream.read(buffer)) != -1) { // 将读取到的字节转换为字符串 String receivedData = new String(buffer, 0, bytesRead, "UTF-8"); // 打印接收到的数据 System.out.println("Received: " + receivedData); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭资源 try { if (inputStream != null) { inputStream.close(); } if (socket != null) { socket.close(); } } catch (Exception e) { e.printStackTrace(); } } } } }
其实说到底要进行的操作都是相通的,图形化编程也是按照创建对象的思想的。