求资深Socket通信专家点拨:“io流中的CS通信的细节知识”解答.

cjco_8m_cjco 2013-08-09 07:59:45
高手,您好:
我是一名学习软件工程的学生,最近在做一个CS结构的聊天系统的项目的时候,发现了不少知识,掌握的不够牢固,希望能够得到CSDN中的诸位高手的点拨,我的问题如下所述:
1.在进行一个“Socket通信方式的文件传输”的功能实现时,这里所面对的可能是“音频”或者“视频”的各种文件,这些文件在进行“信息的排列”的时候,是经过了什么原理的文件组织的.
是不是所有的文件,都像“文本文件”一样,在Windows操作系统中,都是“为解码程序进行”:
“从上到下”“从左到右”的“对于文件所含信息的”“依次解码”的工作的进行的..?
如果用一个“FileInputStream流的对象”进行音频文件或者视频文件的所储存的信息的“从上到下”“从左到右”的逐行读取的话...
这里的视频文件或者音频文件,是否都能够进行“所储存的信息的全部提取”?
2.并且,这里的视频文件和音频文件,是否能够被同样的方式,“被FileOutputStream流”“所写入一个相同类型的文件”中...?
3.如果在进行上面的“S端传到C端的数据的"文件写入"”的工作时,是否“在文件的数据书写完毕后”“需要进行一下文件的"保存"”的操作...?这个操作,如果落实到代码上,应该是怎样进行的...?
4.如果进行上面的“S端传输文件到C端”的工作时,碰到了“S端传到C端的文件”,是“总共八种类型”的文件中的一种,的话..
是不是一定要在S端进行“判断本文件的后缀名”“并且作为包头发到C端”?是否可以进行:“C端的"接收到的文件的文件的类型判断"”?正常的场景下,应该是放在C端判断吧?
5.在上述第1个问题中,我还想知道:是否Socket传输的过程中所面对的所有可能的文件,“.jude”“.ppt”“.ape”“.mp3”“avi”等格式的文件,都能够符合“采用一个流将他们的数据"用某一种格式写出来后”,(比如dips.readInt();dips.readchar();dips.readBoolean()....),都能够在通信的另一端,“采用相同的格式接收并且读取出来”?
6.如果在上述的“传递文件到另一端的Socket代码的书写的时候”,为了进行上述的工作的完成,我曾经“观察过高手的笔迹”,高手代码如下:
(C端发送端代码)
package net;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;

public class DataSocket {
public static void main(String[] args) throws IOException {
File img1 = new File("C:/Users/Administrator/Pictures/1.jpg");
File img2 = new File("C:/Users/Administrator/Pictures/2.jpg");

Socket socket = new Socket("127.0.0.1", 4848);
String header1 = "a.jpg;" + img1.length();
String header2 = "b.jpg;" + img2.length();

BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

FileInputStream in = new FileInputStream(img1);
FileInputStream in2 = new FileInputStream(img2);
byte[] buffer = new byte[8192];

int readBytes = -1;

out.write(header1.getBytes());
out.write("\r".getBytes());
out.flush();

while ((readBytes = in.read(buffer)) != -1) {
out.write(buffer, 0, readBytes);
}
out.flush();

out.write(header2.getBytes());
out.write("\r".getBytes());
out.flush();

while ((readBytes = in2.read(buffer)) != -1) {
out.write(buffer, 0, readBytes);
}
out.flush();

in.close();
in2.close();
out.flush();
out.close();
}
}


(S端接收端代码)
//socket传送图片程序
package net;

import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class DataSocketServer {
final public static int DEFAULT_PORT = 4848;
final public static String FILE_DIR = "D:/";

public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(DEFAULT_PORT);

while (true) {
new Thread(new RequestProcessorTask(server.accept())).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}

static class RequestProcessorTask implements Runnable {
private Socket socket = null;

public RequestProcessorTask(Socket socket) {
this.socket = socket;
}

public void run() {
try {
boolean isEnd = false;

BufferedInputStream in = new BufferedInputStream
(socket.getInputStream());

while (!isEnd) {
int d = -1;
StringBuilder header = new StringBuilder();

while ((d = in.read()) != '\r') {
if (d == -1) {
isEnd = true;
break;
}
header.append((char) d);
}
if (!isEnd) {
String[] parms = header.toString().split(";");

FileOutputStream out = new FileOutputStream
(FILE_DIR + parms[0]);
long size = Long.parseLong(parms[1]);

while (size > 0 && (d = in.read()) != -1) {
out.write(d);
size--;
}

out.flush();
out.close();
}
}
in.close();
} catch (IOException e) {
throw new RuntimeException("获取客户端输入流失败", e);
}
}
}
}

希望能够得到高手的点拨:
上文中代码的C端第13行和第14行获取一个File类型的实体的长度,这个数据,对于整个CS结构的文件传输系统的“传输文件”的功能的实现,有什么作用?
最后,在观察了不少的代码的设计思想并且请教了不少朋友之后,我总结出了“下面的Socket通信传输文件”的实现思路,希望大家能够给予确认:
7.进行一个“CS聊天系统的各种文件类型的传递”这个功能需求的开发时,如果面对“不同的文件类型均可以进行"相同的格式的写方法的另一端的同样格式的毒方法的读取"的我的假说能够成立”,这个场景的话,那么,应该采用:“dops.writebyte();”方法,或者“dips.readbyet();”方法,这种“byte”格式,最能够具有面向音频文件和视频文件传输的效率吧?其他类型的文件,是否都可以通过采用这种格式的读写,获取“最大的系统效率”....?
8.进行一个“S端的代码”面向我的“能够传输各种类型文件”的开发需求,是否:
开发思路如下:
9.用File类创建对象,将本地的目标文件,采用File类的构造方法,给“瞄准”.
10.用一个C端发起端的OutputStream类型,将这个File类型的实体,首先进行自己所瞄准文件类型的判断,将每一种类型,进行一个“编号”,(1.为doc类型;2.为wps类型;3.为avi类型....),再进行“加入自己的构造方法”,然后,将自己的实体,“ops”,进行面向S端发起端的:
Socket s1 = new Socket(ops);
的代码的“对象写入”,从而将S端的“目标传出文件”进行“位置的向Socket对象的写入”.
11.然后将自己的s1.getOutputStream()流,进行DataOutputStream包装类的包装,把自己的数据,进行:
首先C端接收端“汇报自己的所传文件类型”:
DataOutputStreamobj.writeInt('1');
然后向C端写出自己要传送的文件的“字节数据”:
DataOutputSteamobj.writebyte();
方法的调用,从而达到:
整个C2C结构的程序,发起端的“写出数据的功能”的功能的代码实现...
12.进行一个“C端的代码”面向我的“能够接收上面的C端所可能传输的八种类型的文件中的一种”“并且能够将传输过来的文件进行存储到指定目录”的功能的实现的话..
开发的思路为:
13.首先将C端的“接收S端传输的请求的C端进行一个ServerSocket对象的创建”并且进行“一个循环接收Socket连接请求”的方法:“accept()”写在循环体语句中,并且,在本语句之下,进行“将后续的事情,交给一个线程”..
14.将接收整个S端的代码之后的“被委任”的线程类,进行:采用对应于C端的写方法的格式,进行读取发起端S端的数据,的读方法的书写,让整个C端的代码读取S端的两个信息的数据:
“当前传到C端的文件的类型编号”,和“S端的Socket连接的地址索引”,然后,在C端的“当前主干类中”进行一个“switch分支语句的书写”“面向不同的文件类型的标记符”进行“针对不同的文件类型进行的不同的该文件类型的处理线程”的“创建和运行”的代码书写,从而获得整体C端能够“处理不同类型文件的接收存储”的功能的代码实现,每一个处理对应传送文件的线程,都传入一个“S端Socket水管”的地址引用。达到“在线程的内部进行占用处理机时间的代码逻辑的书写”“从而让C端的主干类”“能够获得尽可能高的效率”“接下一个文件的传输连接请求”,以免造成“主干类忙”“S端的连接请求丢失”的现象.
我的问题写的比较长,一共我写出了14个问题,是多了些,但是,都是我,作为一个开发者,在进行CS结构的聊天系统的功能开发的过程中,所碰到的“当理论遇见现实”的时候,所产生的“具有一定代表性的”问题....
希望高手能够为我做出:
按照问题的编号,给与详尽解答的服务.
弟我将会在得到高手的有效解答后,再追加,100分.
现在,100分奉上!!
一位日日夜夜向着理想奔跑的筑梦者
2013年8月9日早晨8点正
...全文
225 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjco_999_cjco 2013-08-12
  • 打赏
  • 举报
回复
谢谢你,木头菇!! 这是我的一点点谢意: 一百分奉上!!
cjco_8m_cjco 2013-08-11
  • 打赏
  • 举报
回复
木头菇哥,您给我的提示,是最大的,但是,由于您未能将弟我的问题,“全部回答完毕”... 并且... 弟我,刚刚发现... 弟我没有加分的权限... 希望能够与您成为好朋友. 今天,我只给您加了100分,如果有机会,我会报了今天差下的情的....
木头菇 2013-08-10
  • 打赏
  • 举报
回复
引用 2 楼 u011641408 的回复:
spirit008哥,谢谢您的点拨!! 对于您的1.的回答,我知道网络中传输的都是“0和1”,但是,我希望能够在C端进行文件的保存工作的. 如果我要进行文件的转存的话,我应该是要知道现在C端接收到的数据,是一个“什么类型的文件的数据”,如果我将一个video类型的文件,保存成为一个doc类型的文件的话,肯定会让我得到的文件,最终为“乱码”. 希望能够得到spirit008哥的帮助: 现在我的基础是: Java SE已经学习完毕,Socket和Swing有了一定的基础,请问: 现在如果我想在通信事业上发展的话,我应该首先看什么书?这本书的详细信息和作者,分别是什么..? 谢谢spirit008哥!!
文件是什么格式取决于文件头,不取决于扩展名。所以,你的数据传输的完整性保证了,原封不动写文件就可以了。 写网络程序的话,看看tcpip详解吧,挺大部头,挑协议设计的原理部分看吧。说实话,对java没了解,但是提供了n多功能库的东东,对工业开发是便利的,对掌握技能是不利的,可以尝试用api去写写小程序
木头菇 2013-08-09
  • 打赏
  • 举报
回复
你的问题概念混乱,并且基础知识缺乏太多。 略提几点。 1.网络通信中,如果你传送文件,可以忽略文件类型,因为本身都是二进制(如果无法理解这句话,建议从基础的基础重新学过)。 2.先写好能发能收的客户端和服务器,再学习怎样制定传输协议。 3.文件传输还牵扯数据完整性和正确性的校验(进阶部分),需了解校验常用的方式,如md5,sha1等 4.做网络程序,不会抓包等于白扯,学会wireshark的使用并且会看能看懂协议格式和样子。 5.http协议必看必学。 6.这个论坛上发这么长的帖子,能给你回复的概率很低,这里如果你发一个讨论i++++++j等于几,线程通信有几种方式这种书本贴会有n多人去讨论,但获取实用经验和解决问题的概率不高,遇到问题尽量google完,再细致的归纳出来,不要超过几十个字描述出来,这样的问题会更好一些,对你帮助也更大一些。
shinelord明 2013-08-09
  • 打赏
  • 举报
回复
学通信,与一些网络应用层常用的协议有关系,TCP/IP,SNMP,UDP,CORBA,SOCKET,TRAP,WEBSERVICES,WEBSOCKET,WEB的请求与响应等。还有就是LINUX系统的一些网络命令。还有MINA框架挺不错的。
cjco_8m_cjco 2013-08-09
  • 打赏
  • 举报
回复
spirit008哥,谢谢您的点拨!! 对于您的1.的回答,我知道网络中传输的都是“0和1”,但是,我希望能够在C端进行文件的保存工作的. 如果我要进行文件的转存的话,我应该是要知道现在C端接收到的数据,是一个“什么类型的文件的数据”,如果我将一个video类型的文件,保存成为一个doc类型的文件的话,肯定会让我得到的文件,最终为“乱码”. 希望能够得到spirit008哥的帮助: 现在我的基础是: Java SE已经学习完毕,Socket和Swing有了一定的基础,请问: 现在如果我想在通信事业上发展的话,我应该首先看什么书?这本书的详细信息和作者,分别是什么..? 谢谢spirit008哥!!

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧