总结同学们第十周作业出现的问题
一、关于IP端口的问题
1、问题:对于IP和端口仅仅有个概念,实践时不知道从哪获取。
解决方法:询问同学后知道了,IP地址可以通过命令行:ipconfig查看,端口号是自己设定的。(20145105姜丽)
2、问题:java.net.SocketException: Connection refused: connect。
解决方法:该异常发生在客户端进行 new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动,这个肯定能解决这个问题。(20145212罗天晨)
3、问题:一开始运行SimpleSocketClient.java程序时弹出错误:
![](http://images2015.cnblogs.com/blog/877166/201605/877166-20160508181124655-135887695 7.png)
解决方法:端口号被占用了,改了一个端口号就好了。(20145215卢肖明)
4、问题:利用InetAddress类取得的IP地址是自己的IP地址吗?和在命令行中得到的IP地址不同。
(20145304刘钦令)
5、问题:在运行SimpleSocketClient的时候,发现运行出现错误了。
解决方法:上网找了一下发现原来是端口8080被占用了,更换了端口号10000以后就成功了,修改端口为10000后的运行结果:
(20145320周歧浩)
6、问题:运行服务器时出现如下提示:
最佳解决方法,来自20145314郑凯杰(博客链接地址:http://www.cnblogs.com/5314zkj/p/5472319.html):这是端口被占用了,换一个端口后就正常了。关于换端口的问题,在实验里已经写的很清楚了,有三种解决办法。
①可以用老师上传给我们的XAMPP软件,查看已被使用的端口十分方便。
②可以在命令行中输入netstat -na就能看到当前的端口号的占用情况。
③连接私人WIFI,即手机热点,成功率暴涨。
7、问题:实验中的问题:
解决方法:如果有其他的Java项目(程序)在运行中,则JVM会被占用,便会出现该错误,要解决该问题直接结束正在运行的程序即可。因此在运行你想要调试的项目前,要确保JVM是处于Stop状态的。(20145203盖泽双)
8、问题:实验的时候找不到自己的ip地址。
解决方法:百度错误代码后发现是自己没有设置Path(20145324王嘉澜)
9、问题:关于IP地址和域的关系,并不太懂之间的联系,是IP包含域?还是域包含IP地址?
解决方法:这块的知识在计算机网络上就存在些许的问题。我觉得这篇文章将IP地址和域比喻成手机号码和手机通讯录名单,一个人可以有很多个手机号码,可是一个手机号码只能有一个人对应。同理,一个域名可以对应许多个IP地址,但是一个IP地址只能有一个IP地址。(20145335郝昊)
10、问题:java.net.BindException:Address already in use: JVM_Bind。
解决方法:该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。此时用netstat –an命令,可以看到一个Listending状态的端口。只需要找一个没有被占用的端口就能解决这个问题。(20145212罗天晨)
11、问题:如何得到本机的IP地址
解决方法:①这是我运行InetAddressDemo的结果
②不止使用这个可以得到本机的IP地址,在cmd命令行中输入ipconfig,也可以得到
大家可以看到我的电脑的IP地址为10.43.39.110(20145320周歧浩)
二、客户端与服务端链接时的问题
2、问题:在连接时客户端一方总是提示连接超时。
解决方法:在对比ipcongfig命令查看到的所有连接情况后,我们发现写错了IP地址,即连接的是WI-FI,但写的是本地连接的IP,修改后可以连接。(20145105姜丽)
3、问题:如何复用Socket连接?
package tcp;
import java.io.*;
import java.net.*;
/**
复用连接的echo服务器
功能:将客户端发送的内容反馈给客户端
*/
public class MulSocketServer {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
OutputStream os = null;
InputStream is = null;
//监听端口号
int port = 10000;
try {
//建立连接
serverSocket = new ServerSocket(port);
System.out.println("服务器已启动:");
//获得连接
socket = serverSocket.accept();
//初始化流
is = socket.getInputStream();
os = socket.getOutputStream();
byte[] b = new byte[1024];
for(int i = 0;i < 3;i++){
int n = is.read(b);
//输出
System.out.println("客户端发送内容为:" + new String(b,0,n));
//向客户端发送反馈内容
os.write(b, 0, n);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try{
//关闭流和连接
os.close();
is.close();
socket.close();
serverSocket.close();
}catch(Exception e){}
}
}
}
```(20145203盖泽双)
#####6、问题:如何复用Socket连接?
解决方法:实现建立一次连接,进行多次数据交换呢。其实很简单,建立连接以后,将数据交换的逻辑写到一个循环中就可以了。这样只要循环不结束则连接就不会被关 闭。按照这种思路,可以改造一下上面的代码,让该程序可以在建立连接一次以后,发送三次数据,当然这里的次数也可以是多次。运行示例截图:
![](http://images2015.cnblogs.com/blog/889679/201605/889679-20160508191800327-1581106347.png)
![](http://images2015.cnblogs.com/blog/889679/201605/889679-20160508191811515-25904154.png)
(20145216史婧瑶)
#####3、 问题:如何使服务器端支持多个客户端同时工作?
解决方法:改善服务端示例程序将由两个部分组成,MulThreadSocketServer类实现服务器端控制,实现接收客户端连接,然后开启专门的逻辑线程处理该连接,LogicThread类实现对于一个客户端连接的逻辑处理,将处理的逻辑放置在该类的run方法中。(20145203盖泽双)
#####4、问题:java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error)。
解决方法:该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。(20145212罗天晨)
#####5、问题:3.java.net.SocketException: Socket is closed,
解决方法:该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
#####6、问题:如何使服务器端支持多个客户端同时工作?
实例:MulThreadSocketServer类实现服务器端控制,实现接收客户端连接,然后开启专门的逻辑线程处理该连接,LogicThread类实现对于一个客户端连接的逻辑处理,将处理的逻辑放置在该类的run方法中。
主要使用两个类:
①DatagramSocket:实现“网络连接”,包括客户端网络连接和服务器端网络连接。虽然UDP方式的网络通讯不需要建立专用的网络连接,但是毕竟还是需要发送和接收数据,DatagramSocket实现的就是发送数据时的发射器,以及接收数据时的监听器的角色。类比于TCP中的网络连接,该类既可以用于实现客户端连接,也可以用于实现服务器端连接。
②DatagramPacket:实现对于网络中传输的数据封装。在UDP方式的网络编程中,无论是需要发送的数据还是需要接收的数据,都必须被处理成DatagramPacket类型的对象,该对象中包含发送到的地址、发送到的端口号以及发送的内容等。其实DatagramPacket类的作用类似于现实中的信件,在信件中包含信件发送到的地址以及接收人,还有发送的内容等,邮局只需要按照地址传递即可。在接收数据时,接收到的数据也必须被处理成DatagramPacket类型的对象,在该对象中包含发送方的地址、端口号等信息,也包含数据的内容。和TCP方式的网络传输相比,IO编程在UDP方式的网络编程中变得不是必须的内容,结构也要比TCP方式的网络编程简单一些。
##三、关于找不到文件的问题
#####1、问题:调用RSA加密代码文件时,总是提示找不到指定文件。
解决方法:将调用方法中的文件名改为文件路径,强制读取该文件。(20145105姜丽)
#####2、问题:在代码的运行中,,由于没有加入RSA的相关文件,导致程序出现了一些问题。
解决方法:向里面加入了一个RSA的文件,在与src的同级目录下生成了两个文件:
![](http://images2015.cnblogs.com/blog/885893/201605/885893-20160508200937843-343172565.png)
程序运行成功了!(20145107李长达)
##四、关于包的问题
#####1、问题:用到的包之前在学习时大多没有遇到过,所以比较陌生,不知道每个包代表什么含义。
解决方法:后来通过查资料,了解了每个包的作用,在使用的过程中思路才逐渐清晰起来.(20145118常悦)
#####2、问题:![](http://images2015.cnblogs.com/blog/890515/201605/890515-20160507212839453-1140790399.jpg)
解决方法:因为我电脑中没有这个类的包,可以把包名删掉,或者加一个包。
![](http://images2015.cnblogs.com/blog/890515/201605/890515-20160507212949718-153710588.jpg)(20145203盖泽双)
##五、基础性概念问题
#####1、问题:什么是网络协议?
解决过程:
通过学习老师博客中给出的资料链接,总结出以下解释:
①网络协议是指对于网络中传输的数据格式的规定。
②在网络编程中,对于同一个网络程序来说,一般都会涉及到两个网络协议格式:客户端发送数据格式和服务器端反馈数据格式,在实际设计时,需要一一对应。
③由于各种网络程序使用不同的协议格式,所以不同网络程序的客户端之间无法通用。而对于常见协议的格式,例如HTTP(Hyper Text Transfer Protocol,超文本传输协议)、FTP(File Transfer Protocol,文件传输协议)、SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)等等,都有通用的规定。
④最后,对于一种网络程序来说,网络协议格式是该程序最核心的技术秘密,因为一旦协议格式泄漏,则任何一个人都可以根据该格式进行客户心端的编写,这样将影响服务器端的实现,也容易出现一些其它的影响。(20145216史婧瑶)
#####2、问题:UDP编程与TCP编程的区别及优缺点
解决方法:udp协议于tcp协议最本质的区别是:udp不基于连接,tcp基于连接;简单的说就是通信双方是否在自己的机器上保持对方身份的记录,tcp保持,udp不保持。
udp适合传输数据内容不太敏感,丢失、误传影响不大的工作,例如局域网聊天、设备发现;tcp范围就太广了,凡是应用规模大点、网络环境恶劣点的应用都需要,例如ftp、网管、下载软件等。
另外在网络环境相同的情况下,使用默认的tcp和udp协议时,网络好udp的效率高一些,而网络不好tcp的稳定性高一些。(20145329吉东云)
#####3、问题:同样的什么是域?
解决方法:之前只是很简单的讲了域和IP地址的关系,但是域的具体定义却没有给出。百度后"域"的真正含义指的是服务器控制网络上的计算机能否加入的计算机组合。(20145335郝昊)
#####4、问题:是关于协议的问题,协议存在的具体作用是什么?
解决过程:学习过后对于这个问题有了了解,协议的真正作用是一种格式,对于不同的电脑,不同的程序有不同的数据格式,而对于这种数据格式的规定就是协议。(20145335郝昊)
##六、其他问题
#####1、
我尝试创建了一个20M的文件example_memory_mapped_file.txt,并且用字符A对它进行填充,然后读取前30个字节。在实际的应用中,内存映射不仅仅擅长提高I/O的原始速度,同时它也允许多个不同的reader和writer同时处理同一个文件镜像。(20145211黄志远)
#####2、
原来我以为要两台机才能做C/S结构程序,后来突发奇想试了一下,然后发现一台机也可以
![](http://images2015.cnblogs.com/blog/885218/201605/885218-20160508170623921-905913482.png)
![](http://images2015.cnblogs.com/blog/885218/201605/885218-20160508170634062-2092986353.png)
![](http://images2015.cnblogs.com/blog/885218/201605/885218-20160508170645359-931063211.png)
![](http://images2015.cnblogs.com/blog/885218/201605/885218-20160508170746843-2143962193.png)
(20145120黄玄曦)