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下所以你要有这个文件夹