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