1.通信原理
服务器端 1.先建立一个ServerSocket,等待客户端连接
2.当有客户端连接时,建立连接,为连接多个客户端,我们创建一个线程处理客户端发来的请求
3.完成通信后,服务器关闭此连接
//根据端口号实例化ServerSocket类的一个对象 ServerSocket server = new ServerSocket(8888); while(flag){ // 等待客户机连接进入,进入后实例化一个客户机Socket对象 Socket client = server.accept(); System.out.println("客户机连接成功,客户机的地址是:" + client.getRemoteSocketAddress()); //当有客户机接入时创建线程 Clientuser user=new Clientuser(client,jta); user.start();
客户端:1.根据服务器ip地址和端口号创建Socket
2.连接成功后创建线程处理连接
3.通信完成后断开连接
try { client =new Socket("192.168.1.158",9999); os=client.getOutputStream(); is=client.getInputStream(); Clienter clienter=new Clienter(client); clienter.start(); } catch (Exception e) { e.printStackTrace(); }
2.通信协议
通信协议说白了就是你指定的发送数据和接受数据的规则。
例如发消息时,你可以指定先发送int说明消息的总长度,再发送一个字节长度的数据来表示你发送的是消息不是其他的,再发送int说明接受者的id,最后发送消息体;接收的时候你也按照这个规则依次读取信息。
发文件时,你可以先发送一个int表示文件名,然后再把文件循环读取到固定长度的缓冲区发给服务器,直到读取到文件末尾,这样无论多大的文件都可以发送,发送时间长短就要看你的网速了,昨天在蓝杰测试发个100多k的图片发了好久
(1)一个登陆请求代码示例:
public String login(String msg){ String user_name = this.username.getText().toString(); String pass_word = this.password.getText().toString(); try { byte []data1 = user_name.getBytes(); byte []data2 = pass_word.getBytes(); int total_len = 4+1+4+data1.length+data2.length; int name_len = data1.length; dataout.writeInt(total_len); dataout.writeByte(1); dataout.writeInt(name_len); dataout.write(data1); dataout.write(data2); dataout.flush(); msg = bufferin.readLine(); System.out.println(msg+"hhhhhhhh"); } catch (IOException e) { e.printStackTrace(); } return msg; }
(2)登录验证代码示例:
public void process_login(int total_len) throws SQLException { try { int name_len = dis.readInt(); byte[] data1 = new byte[name_len]; byte[] data2 = new byte[total_len - 9 - name_len]; dis.read(data1); dis.readFully(data2); String username = new String(data1); String password = new String(data2); System.out.println(username + " "); System.out.println(password); // 获取验证结果信息 String msg = query(username, password); if (msg.equals("验证已通过")) { sendMsg("验证已通过"); System.out.println("验证已通过"); } if (msg.equals("密码输入错误")) { sendMsg("密码输入错误"); System.out.println("密码输入错误"); } if (msg.equals("用户不存在")) { sendMsg("用户不存在"); System.out.println("用户不存在"); } } catch (IOException e) { e.printStackTrace(); } }
(3)关于文件的传输我写了个测试程序,详情见附件,欢迎下载
由于程序中我指定默认保存在D盘Download下所以你要有这个文件夹