Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中通过TCP流传输阵列_Java_Sockets_File Io - Fatal编程技术网

在Java中通过TCP流传输阵列

在Java中通过TCP流传输阵列,java,sockets,file-io,Java,Sockets,File Io,我正在尝试通过网络传输字符串数组。我可以发送单个字符串,但一旦尝试发送字符串数组,就会遇到问题。我做了一些研究,提出了一个在IDE中可以正常工作的修复方案,但是当我在外部运行它时,程序崩溃了。我已经把它缩小到一个我意外创建的无限循环。我将粘贴所有的代码,因为这里有太多的东西要贴 以下是我努力实现的目标的总结 打开文本文件 逐行读入(每行读入一个单独的字符串中) 阵列) 文件读取完成后,开始对每个字符串进行流式处理 在接收端有一个for循环,将字符串放回 另一个数组 最后,在服务器端,分解字符串的

我正在尝试通过网络传输字符串数组。我可以发送单个字符串,但一旦尝试发送字符串数组,就会遇到问题。我做了一些研究,提出了一个在IDE中可以正常工作的修复方案,但是当我在外部运行它时,程序崩溃了。我已经把它缩小到一个我意外创建的无限循环。我将粘贴所有的代码,因为这里有太多的东西要贴

以下是我努力实现的目标的总结

  • 打开文本文件
  • 逐行读入(每行读入一个单独的字符串中) 阵列)
  • 文件读取完成后,开始对每个字符串进行流式处理
  • 在接收端有一个for循环,将字符串放回 另一个数组
  • 最后,在服务器端,分解字符串的每个部分 分成5个不同的字符串
  • 这是我的客户机类:

    public class Transfers {
    
        public int port = 1223;
        //public String Ip = LoginForm.IP;
        //public String ip = null;
        public static Socket login = null;
        public static Socket sock = null;
        public static PrintWriter outStream = null;
        private static BufferedReader inStream = null;
        private static boolean ON = false;
        public static String authorize = null;
        public static boolean connected = true;
    
        public static void transfers(String IP, int port, String content) throws UnknownHostException, IOException {
    
    
            try {
                login = new Socket(IP, port);
                //System.out.println("Connected for streaming");
                outStream = new PrintWriter(login.getOutputStream(), true);
                outStream.println(content);
            } catch (UnknownHostException ex) {
                Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE, null, ex);
                login.close();
            }
        }
    
        public static String[] recieveArray(String IP) throws UnknownHostException, IOException {
            String[] farray = null;
            sock = new Socket(IP, 1224);
            inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String count = inStream.readLine();
            int counter = Integer.parseInt(count);
            System.out.println("counter");
            for (int i = 0; i < counter; i++) {
                inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                farray[i] = inStream.readLine();
                System.out.println(farray[i]);
            }
            return farray;
        }
    }
    
    公共类传输{
    公共int端口=1223;
    //公共字符串Ip=LoginForm.Ip;
    //公共字符串ip=null;
    公共静态套接字登录=null;
    公共静态套接字sock=null;
    公共静态PrintWriter扩展流=null;
    私有静态BufferedReader inStream=null;
    私有静态布尔ON=false;
    公共静态字符串authorize=null;
    公共静态布尔连接=true;
    公共静态void传输(字符串IP、int端口、字符串内容)引发UnknownHostException、IOException{
    试一试{
    登录=新套接字(IP、端口);
    //System.out.println(“连接用于流媒体”);
    outStream=新的PrintWriter(login.getOutputStream(),true);
    exptream.println(内容);
    }捕获(未知后异常除外){
    Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE,null,ex);
    }捕获(IOEX异常){
    Logger.getLogger(Transfers.class.getName()).log(Level.SEVERE,null,ex);
    login.close();
    }
    }
    公共静态字符串[]ReceiveArray(字符串IP)引发UnknownHostException,IOException{
    字符串[]farray=null;
    插座=新插座(IP,1224);
    inStream=新的BufferedReader(新的InputStreamReader(sock.getInputStream());
    字符串计数=inStream.readLine();
    int计数器=整数.parseInt(计数);
    系统输出打印项次(“计数器”);
    对于(int i=0;i
    这是我的服务器类:

    public class Specials {
    
        private static ServerSocket server = null;
        private static Socket client = null;
        private static PrintWriter outStream = null;
        private static BufferedReader inStream = null;
        private static boolean ServerOn = true;
        public static String message = "";
        public static String command = null;
        static public InetAddress IP = null;
        public static String status = null;
        private static String file = "accounts.dat";
        private static int counter;
    
        public static void arraysend(String filename) throws FileNotFoundException, IOException {
    
            counter = 0;
            FileInputStream fstream = new FileInputStream("AppData/" + filename);
            String strLine;
            String[] filearray;
    
    
            try (DataInputStream in = new DataInputStream(fstream)) {
                BufferedReader br = new BufferedReader(new InputStreamReader(in));
    
                filearray = new String[1000];
                for (int j = 0; j < 10; j++) {
                    filearray[j] = br.readLine();
                    counter++;
                }
                in.close();
            }
    
            try {
                server = new ServerSocket(1224);
                client = server.accept();
                IP = client.getInetAddress();
                outStream = new PrintWriter(client.getOutputStream(), true);
                filearray[0] = Integer.toString(counter);
                outStream.println(filearray[0]);
                for (int i = 1; i < counter; i++) {
                    outStream = new PrintWriter(client.getOutputStream(), true);
                    outStream.println(filearray[i]);
                }
                client.close();
                server.close();
            } catch (IOException ex1) {
                Logger.getLogger(Specials.class.getName()).log(Level.SEVERE, null, ex1);
            }
        }
    }
    
    公共类特价{
    私有静态服务器套接字服务器=null;
    私有静态套接字客户端=null;
    私有静态PrintWriter扩展流=null;
    私有静态BufferedReader inStream=null;
    私有静态布尔ServerOn=true;
    公共静态字符串消息=”;
    公共静态字符串命令=null;
    静态公共地址IP=null;
    公共静态字符串状态=null;
    私有静态字符串file=“accounts.dat”;
    专用静态整数计数器;
    公共静态void arraysend(字符串文件名)抛出FileNotFoundException、IOException{
    计数器=0;
    FileInputStream fstream=新的FileInputStream(“AppData/”+文件名);
    弦斯特林;
    字符串[]文件数组;
    try(DataInputStream in=newdatainputstream(fstream)){
    BufferedReader br=新的BufferedReader(新的InputStreamReader(in));
    filearray=新字符串[1000];
    对于(int j=0;j<10;j++){
    filearray[j]=br.readLine();
    计数器++;
    }
    in.close();
    }
    试一试{
    服务器=新服务器套接字(1224);
    client=server.accept();
    IP=client.getInetAddress();
    outStream=新的PrintWriter(client.getOutputStream(),true);
    filearray[0]=整数.toString(计数器);
    exptream.println(filearray[0]);
    对于(int i=1;i
    我没有收到任何错误消息,应用程序只是崩溃了。为了方便起见,我在下面添加了我代码的粘贴箱

    任何帮助都将不胜感激,谢谢


    c

    在传输类中查看您的代码您正在初始化
    farray
    数组并使用null 。并且您在
    for
    循环中也使用了此选项

    inStream = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    
    在特价课程中,您再次使用
    for

    outStream = new PrintWriter(client.getOutputStream(), true);
    

    这段代码有很多问题,我不知道从哪里开始。以下是一个(非详尽的)列表:

    • 您正在为类变量使用静态修饰符,并且 方法。它们不适用于以这种方式定义的任何目的,并且 让调试变得痛苦。将它们全部移除
    • 只创建顺序中实际需要的类变量 保持状态。当前,您在 类级别实际上可以在使用 他们
    • 在客户端
      receiveArray
      方法中,您正在重新初始化 在接收循环的每次迭代期间缓冲读取器。这是 最有可能导致数据丢失,因为您将丢弃一些数据 在前一个读卡器中缓冲的数据(不再是 可从套接字输入流获取)
    • 在客户端
      receiveArray
      方法中,您最多可以读取
      count
      字符串,但在服务器端发送
      count-1
      字符串,因为您将计数存储在第一个元素中
      for (int j = 0; j < 10; j++) {
          filearray[j] = br.readLine();
          counter++;
      }
      
      for (int i = 1; i < counter; i++) {
          outStream = new PrintWriter(client.getOutputStream(), true);
          outStream.println(filearray[i]);
      }