什么叫不用协议 任何一种约定发送规定的做法都叫协议啊 把一个大的数据分成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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)