62,628
社区成员
发帖
与我相关
我的任务
分享
import java.io.*;
import java.net.*;
class kehu
{
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.0.104",9888);
BufferedReader bufr =
new BufferedReader(new FileReader("haha.java"));
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
s.shutdownOutput();
/*BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufIn.readLine();
System.out.println(str);*/
}
}
class fuwu
{
public static void main(String[] args) throws Exception
{
ServerSocket ss = new ServerSocket(9888);
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
PrintWriter out = new PrintWriter(new FileWriter("server.txt"),true);
String line = null;
while((line=bufIn.readLine())!=null)
{
out.println(line);
}
/*PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功");*/
}
}
Socket s = new Socket("192.168.0.104",9888);
这句代码的意思是尝试连接IP地址为192.168.0.104机器的9888端口。
如果这个IP的机器存在并且这台机器开放了9888端口,这个连接就会被成功建立,然后就可以进行下面的通讯行为了。
而注释掉的部分
ServerSocket ss = new ServerSocket(9888);
意思是在本机的开放一个端口为9888的服务。
原因分析:
第一种可能(原理):
并不确认为何楼主选用了192.168.0.104这个IP,猜测是根据本机当前的IP地址设置的,由于楼主的PC连接的是路由器,IP是在楼主启动机器的时候由路由器通过DHCP协议动态分配的,因此两次分配的IP会有很大几率不同。这导致了楼主在第二天运行的时候本机IP不是192.168.0.104,可能是192.168.0.101~192.168.0.254中的任意一个值(具体取决于当前路由器已经分配了多少个IP),因此在该行代码调用时,发现IP为192.168.0.104的机器不存在或该IP地址的机器(这时这个IP没有分配给本机,而是分配给了其他连接路由器的设备,如手机、IPAD等)没有开放9888端口,连接就会被拒绝。
第二种可能(误操作):
猜测楼主在第一天时程序运行了超过两遍。
第一天:
第一遍:没有注释掉服务器端代码,这时运行服务器端开放了9888端口。
第二遍:注释掉服务器端代码,此时服务器端代码仍旧在运行,所以9888端口仍处于开放状态,执行客户端仍旧成功。
第二天:
在两天之间重起了机器,9888端口恢复成开机初始状态(关闭状态)。
服务器端代码仍处于注释状态,直接运行客户端,由于9888端口处于关闭状态,连接被拒绝。