求高手点拨一个Java Socket网络传输的“数据完整性”解决方案.

求高手点拨一个Java Socket网络传输的“数据完整性”解决方案.,第1张

什么叫不用协议 任何一种约定发送规定的做法都叫协议啊 把一个大的数据分成N个小的数据包 客户端请求一次 发送一次 每次发送的数据带有CRC16校验码 客户端收到以后组一次CRC16校验 通过就请求下一个包就OK了 如果是数据 这样就没什么问题了 有问题的话就重新请求一次刚才的数据包 直到没有问题

如果是文件 在每次的数据包CRC16校验完毕后 写成一个文件 然后从服务器那获得的MD5校验码跟本地的文件的校验码比对 如果有问题就说明需要重新发送一次了

电驴这个用过吧 很多链接地址中的竖线后面就是文件的一种校验码 通过edk网络从不同的节点获取到的数据组成一个文件然后进行校验 跟|后面的比对 发下不一样的位置就说明下载出错了

服务端监听:ServerSocket server=new ServerSocket(port);//port:绑定的端口号

Socket client=serveraccept();//监听端口,一旦取得连接则获得客户端的socket连接对象client

客户端: Socket s=new Socket(ip,port);//要连接的服务器的ip以及端口号

如果正常连接上之后,socket的对象可以获得InputStream和OutputStreame,然后就可以进行通信了

完成通信之后,执行socket对象的close()方法关闭连接,完成一次完整的socket连接

这个时比较简单的。

package QQ;

import javanet;

import javaio;

import javasql;

import javautil;

public class QQServer {

public static void main(String args[]) {

try {

HashMap<String , Socket> hm = new

HashMap<String , Socket>() ;

// 服务器到8000端口监听(1)

ServerSocket ss = new ServerSocket

(8000);

while (true) {

Systemoutprintln("服务器正在

8000端口监听");

Socket s = ssaccept();

MyService t = new MyService();

tsetSocket(s) ;

tsetHashMap(hm) ;

tstart();

}

} catch (Exception e) {

eprintStackTrace();

}

}

}

class MyService extends Thread {

private Socket s ;

private HashMap<String , Socket> hm ;

public void setHashMap(HashMap<String , Socket> hm){

thishm = hm ;

}

public void setSocket(Socket s){

thiss = s ;

}

public void run() {

try {

// 接收客户端发送来的用户名和密码(2)

InputStream is = sgetInputStream();

InputStreamReader isr = new InputStreamReader

(is);

BufferedReader br = new BufferedReader(isr);

String uandp = brreadLine();

// 拆分用户名和密码(4)

String u = "";

String p = "";

try{

u = uandpsplit("%")[0];

p = uandpsplit("%")[1];

}catch(Exception e){}

// 到数据库中验证(5)

ClassforName

("commicrosoftjdbcsqlserverSQLServerDriver");

Connection cn = DriverManager

getConnection(

"jdbc:microsoft:sqlserver://127001:1433;databasename=qq2",

"sa", "123");

PreparedStatement ps = cn

prepareStatement("select

username from username where username= and password=");

pssetString(1, u);

pssetString(2, p);

ResultSet rs = psexecuteQuery();

// 发送确认信息到客户端(7)

OutputStream os = sgetOutputStream();

OutputStreamWriter osw = new

OutputStreamWriter(os);

PrintWriter pw = new PrintWriter(osw, true);

if (rsnext()) {

pwprintln("ok");

//将自己的名字发送给HashMap中的其他人

(13)

for(Socket ts : hmvalues()){

OutputStream tos =

tsgetOutputStream() ;

OutputStreamWriter tosw = new

OutputStreamWriter(tos) ;

PrintWriter tpw = new

PrintWriter(tosw , true) ;

tpwprintln("user%"+u) ;

}

//将其他人的名字发送给自己(13)

for(String tu : hmkeySet()){

pwprintln("user%"+tu) ;

}

//将用户名和对应的Socket存入HashMap

(13)

hmput(u, s) ;

// 接收客户端发送来的信息(11)

while (true) {

String message = brreadLine

();

if(messageequals("exit")){

for(Socket ts :

hmvalues()){

OutputStream

tos = tsgetOutputStream() ;

OutputStreamWriter tosw = new OutputStreamWriter(tos) ;

PrintWriter

tpw = new PrintWriter(tosw , true) ;

tpwprintln

("exit%"+u);

}

hmremove(u);

}

String to = messagesplit

("%")[0];

String mess = messagesplit

("%")[1];

Socket ts = hmget(to);

OutputStream tos =

tsgetOutputStream();

OutputStreamWriter tosw = new

OutputStreamWriter(tos);

PrintWriter tpw = new

PrintWriter(tosw, true);

tpwprintln("mess%"+mess

+"\n");

Systemoutprintln(message);

}

} else {

pwprintln("err");

}

} catch (Exception e) {}

}

}

上传这边是 Java 客户端,还是普通浏览器?

浏览器的话,基本的是做不到的。他只能提示找不到服务器之类的。

所以,现在上传大部分用插件做的,比如是一个 flex 的控件,然后在控件里面处理这种异常,甚至可以尝试重传。

若是 Java 客户端的话,就没啥问题了。你设个 timeout ,然后 catch exception

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/12187133.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存