java连接raknet_请问下socket编程中多个服务器向同一个客户端(电脑)发送数据,这种状况下该如何解决...

import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; /** * * 文件名:ServerReceive.java * 实现功能:作为服务器接收客户端发送的文件 * * 具体实现过程: * 1、建立SocketServer,等待客户端的连接 * 2、当有客户端连接的时候,按照双方的约定,这时要读取一行数据 * 其中保存客户端要发送的文件名和文件大小信息 * 3、根据文件名在本地创建文件,并建立好流通信 * 4、循环接收数据包,将数据包写入文件 * 5、当接收数据的长度等于提前文件发过来的文件长度,即表示文件接收完毕,关闭文件 * 6、文件接收工作结束 * * * 【注:此代码仅为演示客户端与服务器传送文件使用, * 每一个数据包之前没有文件协议命令 * 具体的协议传输和文件传出的使用阶段可根据自己程序自行放置】 * * * 作者:小菜鸟 * 创建时间:2014-08-19 * * */ public class ServerReceive { public static void main(String[] args) { /**与服务器建立连接的通信句柄*/ ServerSocket ss = null; Socket s = null; /**定义用于在接收后在本地创建的文件对象和文件输出流对象*/ File file = null; FileOutputStream fos = null; /**定义输入流,使用socket的inputStream对数据包进行输入*/ InputStream is = null; /**定义byte数组来作为数据包的存储数据包*/ byte[] buffer = new byte[4096 * 5]; /**用来接收文件发送请求的字符串*/ String comm = null; /**建立socekt通信,等待服务器进行连接*/ try { ss = new ServerSocket(4004); s = ss.accept(); } catch (IOException e) { e.printStackTrace(); } /**读取一行客户端发送过来的约定信息*/ try { InputStreamReader isr = new InputStreamReader(s.getInputStream()); BufferedReader br = new BufferedReader(isr); comm = br.readLine(); } catch (IOException e) { System.out.println("服务器与客户端断开连接"); } /**开始解析客户端发送过来的请求命令*/ int index = comm.indexOf("/#"); /**判断协议是否为发送文件的协议*/ String xieyi = comm.substring(0, index); if(!xieyi.equals("111")){ System.out.println("服务器收到的协议码不正确"); return; } /**解析出文件的名字和大小*/ comm = comm.substring(index + 2); index = comm.indexOf("/#"); String filename = comm.substring(0, index).trim(); String filesize = comm.substring(index + 2).trim(); /**创建空文件,用来进行接收文件*/ file = new File(filename); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { System.out.println("服务器端创建文件失败"); } }else{ /**在此也可以询问是否覆盖*/ System.out.println("本路径已存在相同文件,进行覆盖"); } /**【以上就是客户端代码中写到的服务器的准备部分】*/ /** * 服务器接收文件的关键代码*/ try { /**将文件包装到文件输出流对象中*/ fos = new FileOutputStream(file); long file_size = Long.parseLong(filesize); is = s.getInputStream(); /**size为每次接收数据包的长度*/ int size = 0; /**count用来记录已接收到文件的长度*/ long count = 0; /**使用while循环接收数据包*/ while(count < file_size){ /**从输入流中读取一个数据包*/ size = is.read(buffer); /**将刚刚读取的数据包写到本地文件中去*/ fos.write(buffer, 0, size); fos.flush(); /**将已接收到文件的长度+size*/ count += size; System.out.println("服务器端接收到数据包,大小为" + size); } } catch (FileNotFoundException e) { System.out.println("服务器写文件失败"); } catch (IOException e) { System.out.println("服务器:客户端断开连接"); }finally{ /** * 将打开的文件关闭 * 如有需要,也可以在此关闭socket连接 * */ try { if(fos != null) fos.close(); } catch (IOException e) { e.printStackTrace(); }//catch (IOException e) }//finally }//public static void main(String[] args) }//public class ServerReceive

取消

评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值