内部类BlockDataInputStream.的方法peekByte抛出的异常,意思就是到达了文件的末尾,程序却没有正常结束读取文件内容
Client:
streamToServer.println(userName+";"+strPwd); //向Server发送name与password;
String frmServer = (String)streamFromServer; //Client接收Server返回的信息;
if(frmServer.equals("Welcome"))
{
new ClientInt(userName); //start the chat screen;
this.dispose();
}
Server:
msg = streamFromClient.readLine(); //接收Client的登录信息
int ver = verify(msg); //验证信息从txt文件中读
if(ver==1)
{
String colon = new String(";");
int index = ((String)msg).lastIndexOf(colon);
String userName = (String)msg.substring(0,index);
if(!(vctrList.indexOf((String)userName)>0))
{
streamToClient.writeObject("Welcome");
streamToClient.flush();
vctrList.addElement((String)userName);
}
--------------------------------------------
else //为上过线的用户返回信息
{
streamToClient.writeObject("Welcome");
streamToClient.flush();
}
-------------------------------------------
}
int verify(String mesg)
{
try{
RandomAccessFile RAS = new RandomAccessFile("UserPwd.txt","r");
System.out.println(RAS.getFilePointer()+" "+RAS.length());
RAS.seek(0);
int i = 0;
String str = "";
while(!((RAS.getFilePointer())==(RAS.length()))) //getFilePointer:返回此文件中的当前偏移量。到此文件开头的偏移量(以字节为单位)
{
str = RAS.readLine();
if(str.equals(mesg))
{
System.out.println(RAS.getFilePointer()+" "+RAS.length());
ctr = 1;
break;
}
}//end of while
RAS.close();
}catch(Exception e){
System.out.println("Connect.java verify(String mesg)");
System.out.println("Connect.java 58 Exception Occurred:"+e);
}
return ctr;
}//end of verify()
解决这问题时花费时间很多,这就是经验的问题。引发这异常的问题点是寻到的并解决,可这问题点触发这异常里的过程却还不是很清楚。当Client发送登录信息时,Server接收并验证在验证函verify()中所使用的是RandoAccesFile类进行读取后流关闭。Hashtable vctrList(用于存贮在线用户)是问题的关键,当Client关闭时Server的vrtrList并没有删除对应用户,所以再次登录检验用户时,server端并没有相应的streamToClient.writeObject(),才引发java.io.EOFException。具本为什么这样我也很迷惑,没有相应的返回信息它会返回上一步再次读取登录信息吗?可文件流有关闭呀,且每次读前我都有从新定位的。看来Socket与线程还要好好读读。
分享到:
相关推荐
在C#编程中,"索引超出了数组界限"是一个常见的错误,通常发生在尝试访问数组元素时,使用的索引值超过了数组定义的合法范围。数组的索引是从0开始的,因此一个包含n个元素的数组,其有效的索引范围是0到n-1。如果你...
**数组** 本身不具备线程安全特性,如果多个线程同时对同一个数组进行修改,可能会引发数据一致性问题。开发者需要自己采取措施(如使用 `synchronized` 关键字或其他同步工具)来确保线程安全。 **集合** 提供了...
例如,一个排序函数可能接收一个数组和它的长度,然后对数组进行排序,如`void sort(int arr[], int length);` 数组在实际应用中发挥着多种作用,包括但不限于排序、查找和特定问题的解决方案。例如,快速排序算法...
2. **查找**:数组查找通常通过循环实现,如线性查找。Java还提供了`Arrays.binarySearch()`方法,适用于已排序的数组,执行二分查找,效率更高。 **Arrays工具类** `java.util.Arrays`类提供了许多方便的方法,如...
【数组操作】是编程中一个基础且重要的概念,它涉及到数据的高效管理和处理。数组是一种在内存中存储相同类型数据的有序集合,每个元素在数组中都有一个唯一的索引,可以方便地通过索引来访问和操作这些数据。数组...
二维数组在公交换乘问题中的应用是一个典型的路径搜索问题,主要涉及到数据结构和算法的知识。在这个问题中,二维数组被用来存储公交线路及其途径的站点信息。数组的每一行代表一条公交线路,第一列存储线路编号,...
这个方法首先检查传入的数组是否为空或长度为零,如果是,则抛出一个`IllegalArgumentException`,因为无法在空数组中找到最大值。 在`findMax`方法中,我们声明了一个变量`max`,初始值为数组的第一个元素`arr[0]`...
此外,数组在多线程环境下需要注意线程安全问题,如果多个线程同时访问和修改数组,可能引发数据不一致。此时,可以考虑使用并发工具类,如Collections.synchronizedList()将数组转换为线程安全的列表。 数组作为...
这篇文章主要介绍两种在JavaScript中获取数组最后一个元素的方法,一个是使用`pop()`方法,另一个则是通过数组的`length`属性来获取。 首先,`pop()`方法是JavaScript数组的内置方法之一,用于移除数组的最后一个...
在这个“数组.zip”压缩包中,可能包含了一个相关的课后作业,旨在帮助你深入理解和熟练掌握数组的这些基本操作。 数组的“增”指的是向数组中添加元素。在大多数编程语言中,数组在创建时通常会指定固定大小,因此...
数组的长度`length`是一个非常关键的属性,它是数组类中的一个数据成员变量。当使用`new`关键字创建数组时,系统会自动为`length`赋值,表示数组中元素的数量。这个长度一旦确定,就不能改变,这与动态语言中的数组...
当底层数组空间不足以容纳新元素时,Python会自动创建一个新的更大的数组,并将旧数组中的元素复制到新数组中,然后继续添加新元素。 列表和数组在Python中的使用非常广泛,它们的动态性质使我们能够灵活地处理各种...
字符数组用于存储字符串,每个字符数组中的元素存储一个字符。 在C语言中,数组的定义格式为“类型说明符 数组名[常量表达式]”。数组名是一个合法的标识符,用于引用数组。常量表达式指定数组可以容纳的元素数量,...
例如,如果有一个大小为5的一维数组arr[5],它的有效索引范围是0到4。如果尝试访问arr[5]或者arr[-1],就会发生越界。这种情况下,程序可能读取到未定义的数据,或者更严重的是,修改了原本不应该修改的内存区域,...
`定义了一个包含10个整数的数组。一旦数组定义,它的大小就固定了,无法动态调整。数组元素的引用格式为`数组名[下标]`,如`a[2]`代表数组a的第三个元素。 在数组的初始化方面,有几种不同的情况。如果在定义时初始...
如果数组过大,可能导致内存不足,从而引发程序运行缓慢甚至崩溃。 - 为优化内存使用,可以避免不必要的数组拷贝,采用增量式构建数组,减少一次性分配大量内存,或者使用数据流式处理,分批处理数据,避免内存峰值...
每个数组元素是一个链表的头结点,每个链表节点包含了key-value对。当我们put一个新的key-value对时,HashMap会根据key的hash值来确定数组索引,然后将新的key-value对插入到对应的链表中。如果两个不同的key具有...
- **示例**: 在`ArrayTest02`中,声明了一个`Student`类型的数组,但尝试访问未初始化的数组元素会引发`NullPointerException`。 ### 3. 数组的操作 - **排序**: 数组可以进行排序操作,Java提供了多种排序算法,如...
`sort()`可以对List进行排序,`copy()`可以将一个集合的内容复制到另一个集合。 - `System`: 提供了一些系统级别的操作,如获取当前时间(`currentTimeMillis()`), 清屏(`gc()`), 读取环境变量(`getenv()`)等。 - `...
在数组查找方面,文章强调了不要用arr.find代替arr.some。arr.find方法会返回数组中第一个满足测试条件的元素,而arr.some用来检查是否存在至少一个元素满足条件。如果第一个满足条件的值恰好是0,直接用arr.find做...